Godot4生成Goldberg球体时icosphere三角形缺失问题求助
在Godot 4中生成Goldberg球体时部分三角形缺失的问题
我正在Godot 4中通过二十面体细分生成由六边形和五边形构成的Goldberg球体,但部分三角形未显示(二十面体效果可见缺失),所有顶点均已存在。我尝试过三种方式向数组new_faces添加新顶点:
- 一次性创建新数组添加
- 逐个使用
append添加 - 逐个使用
push_back添加
我还尝试为subdivide函数中创建的新三角形设置不同颜色,发现由边中点创建的三角形是缺失的。以下是二十面体生成与细分的代码:
var vertices:PackedVector3Array = [] var faces = [] func generate_icosphere(): var t = (1.0 + sqrt(5.0)) / 2 vertices.push_back(Vector3(-1, t, 0).normalized()) vertices.push_back(Vector3(1, t, 0).normalized()) vertices.push_back(Vector3(-1, -t, 0).normalized()) vertices.push_back(Vector3(1, -t, 0).normalized()) vertices.push_back(Vector3(0, -1, t).normalized()) vertices.push_back(Vector3(0, 1, t).normalized()) vertices.push_back(Vector3(0, -1, -t).normalized()) vertices.push_back(Vector3(0, 1, -t).normalized()) vertices.push_back(Vector3(t, 0, -1).normalized()) vertices.push_back(Vector3(t, 0, 1).normalized()) vertices.push_back(Vector3(-t, 0, -1).normalized()) vertices.push_back(Vector3(-t, 0, 1).normalized()) faces.push_back(Triangle.new(vertices[0], vertices[11], vertices[5])) faces.push_back(Triangle.new(vertices[0], vertices[5], vertices[1])) faces.push_back(Triangle.new(vertices[0], vertices[1], vertices[7])) faces.push_back(Triangle.new(vertices[0], vertices[7], vertices[10])) faces.push_back(Triangle.new(vertices[0], vertices[10], vertices[11])) faces.push_back(Triangle.new(vertices[1], vertices[5], vertices[9])) faces.push_back(Triangle.new(vertices[5], vertices[11], vertices[4])) faces.push_back(Triangle.new(vertices[11], vertices[10], vertices[2])) faces.push_back(Triangle.new(vertices[10], vertices[7], vertices[6])) faces.push_back(Triangle.new(vertices[7], vertices[1], vertices[8])) faces.push_back(Triangle.new(vertices[3], vertices[9], vertices[4])) faces.push_back(Triangle.new(vertices[3], vertices[4], vertices[2])) faces.push_back(Triangle.new(vertices[3], vertices[2], vertices[6])) faces.push_back(Triangle.new(vertices[3], vertices[6], vertices[8])) faces.push_back(Triangle.new(vertices[3], vertices[8], vertices[9])) faces.push_back(Triangle.new(vertices[4], vertices[9], vertices[5])) faces.push_back(Triangle.new(vertices[2], vertices[4], vertices[11])) faces.push_back(Triangle.new(vertices[6], vertices[2], vertices[10])) faces.push_back(Triangle.new(vertices[8], vertices[6], vertices[7])) faces.push_back(Triangle.new(vertices[9], vertices[8], vertices[1])) func subdivide(_radius): var new_faces = [] for face in faces: var vert0 = face.vertices[0] var vert1 = face.vertices[1] var vert2 = face.vertices[2] var center0_1:Vector3 = lerp(vert0, vert1, 0.5).normalized() var center1_2:Vector3 = lerp(vert1, vert2, 0.5).normalized() var center2_0:Vector3 = lerp(vert2, vert0, 0.5).normalized() new_faces.push_back(Triangle.new(vert0, center0_1, center2_0)) new_faces.push_back(Triangle.new(vert1, center0_1, center1_2)) new_faces.push_back(Triangle.new(vert2, center1_2, center2_0)) new_faces.push_back(Triangle.new(center0_1, center1_2, center2_0)) print(face, new_faces) return new_faces func generate(subdivisions,radius): generate_icosphere() var result_faces:Array = [] result_faces = subdivide(20) return result_faces class Triangle: var vertices:PackedVector3Array = [] func _init(a, b, c): vertices.push_back(a) vertices.push_back(b) vertices.push_back(c)
恳请各位帮忙解决该问题。
内容的提问来源于stack exchange,提问作者samdug
相关产品推荐
相关产品推荐

