You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:08:16