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

使用Godot实现Conway对偶算子生成Goldberg球体失败求助

问题:Conway对偶算子生成Goldberg球体显示异常

我尝试基于icosphere,通过自行实现的Conway对偶算子生成Goldberg球体,但生成的球体显示异常:
Goldberg球体生成异常

对偶算子实现代码

func dual_operator(faces: Array, points: PackedVector3Array):
    var new_faces: Array = []
    var new_points: PackedVector3Array = PackedVector3Array()
    var faces_per_point: Dictionary = {}

    print("Starting dual_operator")
    print("Initial faces: ", faces)
    print("Initial points: ", points)

    # 构建每个顶点关联的面字典
    for face in faces:
        for index in face:
            index = points[index]
            if not faces_per_point.has(index):
                faces_per_point[index] = [face]
            else:
                faces_per_point[index].append(face)
    print("Faces per point: ", faces_per_point)

    # 在每个面的中心生成新顶点
    for face in faces:
        var mid: Vector3 = Vector3(0, 0, 0)
        for index in face:
            mid += points[index]
        mid /= face.size()
        new_points.append(mid)
    print("New points: ", new_points)

    # 连接新顶点生成新面
    for point in points:
        if faces_per_point.has(point):
            var unordered_faces = faces_per_point[point]
            var ordered_faces = []
            var next_face = unordered_faces.pop_front()
            ordered_faces.append(next_face)
            var i = 0
            while unordered_faces.size() > 0:
                print("Run:", point, "-", i)
                print("unordered_faces before loop:", unordered_faces)
                print("next_face:", next_face)
                var found_next_face = false
                for face in unordered_faces:
                    var shared_edges = 0
                    for index in face:
                        if index in next_face:
                            shared_edges += 1
                    if shared_edges == 2:
                        next_face = face
                        ordered_faces.append(face)
                        unordered_faces.erase(face)
                        print("Found next face:", next_face)
                        found_next_face = true
                        break
                print("unordered_faces after loop:", unordered_faces)
                if not found_next_face:
                    print("No next face found, breaking out of loop")
                    break
                i += 1
                if i > 100:  # 防止无限循环的安全检查
                    print("Breaking out of loop to prevent infinite loop")
                    break

            var new_face: PackedInt32Array = PackedInt32Array()
            for face in ordered_faces:
                new_face.append(faces.find(face))
            new_faces.append(new_face)
    print("New faces: ", new_faces)

    print("Completed dual_operator")
    return [new_faces, new_points]

多边形转三角形实现代码

func prepare_mesh(faces: Array, points: PackedVector3Array) -> Array:
    var prepared_faces: PackedInt32Array = PackedInt32Array()

    for face_index in range(faces.size()):
        var face = faces[face_index]
        if face.size() == 3:
            prepared_faces.append_array(face)
        else:
            # 拆分面并将新面加入队列
            var result = triangulate(faces.find(face), faces, points)  # 传入占位face_index
            points = result[0]
            prepared_faces.append_array(result[1])
    
    return [prepared_faces, points]
func triangulate(face_index: int, faces: Array, points: PackedVector3Array) -> Array:
    var face: PackedInt32Array = faces[face_index]
    if face.size() <= 3:
        return [points, faces]  # 已是三角形
    
    var new_faces: Array = []
    var new_points: PackedVector3Array = points
    var center: Vector3 = get_mid(face_index, faces, points)
    var center_index: int = new_points.size()
    new_points.append(center)
    
    # 从中心向外拆分面为多个三角形
    for i in range(face.size()):
        var next_i: int = wrapi(i + 1, 0, face.size())
        new_faces.append(PackedInt32Array([face[i], face[next_i], center_index]))
    
    # 用新三角形替换原面
    faces.remove_at(face_index)
    faces.append_array(new_faces)
    return [new_points, faces]

若需更多信息,我会补充说明,感谢您的帮助!

内容的提问来源于stack exchange,提问作者samdug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:04:54