Subdiving icosphere with wedges

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) :sweat_smile:

Thank you for your help! :grinning:

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)
image

4 Likes

Still looking for help with this

1 Like