I am trying to create a Goldberg sphere (sphere with hexagons and pentagons) from an icosphere using Godot 4, but some triangles are not appearing:
The icosahedron
All the vertices exist.
I tried different ways of adding the new vertices to the array new_faces
:
- All of them at the same time (creating a new array)
- One by one, using
append
- One by one, using
push_back
I tried coloring differently all the new triangles I create in function subdivide
, and it looks like the one I create using the centers of the edges is the one that is missing.
Code:
Icosahedron generation and subdivision
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)
Thanks in advance.