Hello! I’ve been looking into generating icospheres (later I want to make procedural planets) but I am not that experienced with CFrames and I can’t wrap my head around how to subdivide my icosphere. I’ve looked into (and understand) some code from the devforum about generating these spheres, but after many failed attempts I can’t figure out how to subdivide them so I need some help.
I can’t find any lua resources on subdiving a icospehere with triangles (2 wedges = one triangle). All I could find was a C++ tutorial which I couldn’t understand, as well as articles about icospheres but I can’t convert it to Robox wedges.
(I’m not asking for any code blocks or anything, but a lua explanation)
Thank you for your help!
Code which I use to generate my icosphere
local Vertex = {}
local Triangle = {}
local Triangles = {}
local Vertexes = {}
local planetRadius = 10
local resoltuion = 1
function Vertex.new(position, vertexNumber)
Vertexes[vertexNumber] = position * planetRadius
return Vertexes[vertexNumber]
end
local t = (1 + math.sqrt(5)) / 2
local vtx00 = Vertex.new(Vector3.new(-1, t, 0).Unit, 1)
local vtx01 = Vertex.new(Vector3.new( 1, t, 0).Unit, 2)
local vtx02 = Vertex.new(Vector3.new(-1,-t, 0).Unit, 3)
local vtx03 = Vertex.new(Vector3.new( 1,-t, 0).Unit, 4)
local vtx04 = Vertex.new(Vector3.new( 0,-1, t).Unit, 5)
local vtx05 = Vertex.new(Vector3.new( 0, 1, t).Unit, 6)
local vtx06 = Vertex.new(Vector3.new( 0,-1,-t).Unit, 7)
local vtx07 = Vertex.new(Vector3.new( 0, 1,-t).Unit, 8)
local vtx08 = Vertex.new(Vector3.new( t, 0,-1).Unit, 9)
local vtx09 = Vertex.new(Vector3.new( t, 0, 1).Unit,10)
local vtx10 = Vertex.new(Vector3.new(-t, 0,-1).Unit, 11)
local vtx11 = Vertex.new(Vector3.new(-t, 0, 1).Unit, 12)
local wedge = Instance.new("WedgePart")
wedge.Anchored = true
wedge.TopSurface = Enum.SurfaceType.Smooth
wedge.BottomSurface = Enum.SurfaceType.Smooth
function Triangle.new(a, b, c)
local parent = workspace
local ab, ac, bc = b - a, c - a, c - b
local abd, acd, bcd = ab:Dot(ab), ac:Dot(ac), bc:Dot(bc)
if (abd > acd and abd > bcd) then
c, a = a, c
elseif (acd > bcd and acd > abd) then
a, b = b, a
end
ab, ac, bc = b - a, c - a, c - b
local right = ac:Cross(ab).Unit
local up = bc:Cross(right).Unit
local back = bc.Unit
local height = math.abs(ab:Dot(up))
local w1 = wedge:Clone()
w1.Size = Vector3.new(0, height, math.abs(ab:Dot(back)))
w1.CFrame = CFrame.fromMatrix((a + b)/2, right, up, back)
w1.Parent = parent;
local w2 = wedge:Clone()
w2.Size = Vector3.new(0, height, math.abs(ac:Dot(back)));
w2.CFrame = CFrame.fromMatrix((a + c)/2, -right, up, -back)
w2.Parent = parent
return w1, w2
end
Triangles[1] = Triangle.new(vtx00, vtx11, vtx05)
Triangles[2] = Triangle.new(vtx00, vtx05, vtx01)
Triangles[3] = Triangle.new(vtx00, vtx01, vtx07)
Triangles[4] = Triangle.new(vtx00, vtx07, vtx10)
Triangles[5] = Triangle.new(vtx00, vtx10, vtx11)
Triangles[6] = Triangle.new(vtx01, vtx05, vtx09)
Triangles[7] = Triangle.new(vtx05, vtx11, vtx04)
Triangles[8] = Triangle.new(vtx11, vtx10, vtx02)
Triangles[9] = Triangle.new(vtx10, vtx07, vtx06)
Triangles[10] = Triangle.new(vtx07, vtx01, vtx08)
Triangles[11] = Triangle.new(vtx03, vtx09, vtx04)
Triangles[12] = Triangle.new(vtx03, vtx04, vtx02)
Triangles[13] = Triangle.new(vtx03, vtx02, vtx06)
Triangles[14] = Triangle.new(vtx03, vtx06, vtx08)
Triangles[15] = Triangle.new(vtx03, vtx08, vtx09)
Triangles[16] = Triangle.new(vtx04, vtx09, vtx05)
Triangles[17] = Triangle.new(vtx02, vtx04, vtx11)
Triangles[18] = Triangle.new(vtx06, vtx02, vtx10)
Triangles[19] = Triangle.new(vtx08, vtx06, vtx07)
Triangles[20] = Triangle.new(vtx09, vtx08, vtx01)
Result (I want to have this be subdivided with more detail)