使用Godot实现Conway对偶算子生成Goldberg球体失败求助
问题:Conway对偶算子生成Goldberg球体显示异常
我尝试基于icosphere,通过自行实现的Conway对偶算子生成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
相关产品推荐
相关产品推荐

