Needing assistance on building a sphere

I’m trying to build a planet, now by using fibonacci spheres. Vertices are placed, and got the triangle drawn out. However connecting the triangles to all of those points are something tricky I can’t get done with.

Here’s my attempt so far. Instead of a sphere, it makes this pattern.

I checked sources like Delaunay triangulation but I do not fully understand the source provided, I could try if there was additional information provided.

Source code:

local radius = 500

-- reference
local part ="Part")
part.Anchored = true
part.Size =, 5, 5)

local wedge ="WedgePart");
wedge.Anchored = true;
wedge.TopSurface = Enum.SurfaceType.Smooth;
wedge.BottomSurface = Enum.SurfaceType.Smooth;
-- reference

local triangles = {}
local function draw3dTriangle(selected)
	local a = selected[1][2].Position
	local b = selected[2][2].Position
	local c = selected[3][2].Position
	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;

	ab, ac, bc = b - a, c - a, c - b;
	local edge = bc

	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 =, height, math.abs(ab:Dot(back)));
	w1.CFrame = CFrame.fromMatrix((a + b)/2, right, up, back);
	w1.Parent = workspace;

	local w2 = wedge:Clone();
	w2.Size =, height, math.abs(ac:Dot(back)));
	w2.CFrame = CFrame.fromMatrix((a + c)/2, -right, up, -back);
	w2.Parent = workspace;

	return w1, w2;

local function fibonacci_spiral_sphere(num_points)
	local vectors = {}
	local gr = (math.sqrt(5) + 1) / 2
	local ga = (2 - gr) * (2 * math.pi)

	for i = 1, num_points do
		local lat = math.asin(-1 + 2 * i / (num_points + 1))
		local lon = ga * i

		local x = math.cos(lon) * math.cos(lat)
		local y = math.sin(lon) * math.cos(lat)
		local z = math.sin(lat)

		table.insert(vectors,, y, z))

	return vectors

local vec = fibonacci_spiral_sphere(1024)
for _, v in ipairs(vec) do
	local part = part:Clone()
	part.CFrame = * radius)
	part.Parent = workspace.Parts
	if #triangles == 3 then
		triangles = {}



-- this attempts to find the cloeset parts of all descendants
local PartsToFind = 2
for i,obj in pairs(workspace.Parts:GetChildren()) do
	local dictionary = {}
	for i, v in pairs(workspace.Parts:GetChildren()) do
		if v:IsA("Part") and obj ~= v then
			table.insert(dictionary,{(obj.Position - v.Position).Magnitude,v})

	local array = {}
	for _, value in pairs(dictionary) do
		table.insert(array, tonumber(value[1]))
	local selected = {{0,obj}}
	for i = 1, PartsToFind do
		local key = array[i]
		for i, v in pairs(dictionary) do

			if v[1] == key then

It looks like the triangle function works but that you are passing it the wrong sets of points for the needed triangles, as evidenced by all the long skinny “longitudinal” triangles.

I’m not entirely sure why that causes it. I loop every vertices and find the two closest vertices, and make a triangle with those three points (one being part of the vertices for loop descendant, and the two being its surroundings)

That algorithm doesn’t sound right, the two closest vertices might still make a really thin triangle.

It appears you need this: Delaunay triangulation - Wikipedia

Alright so I decided to do more research and coding.

I also found an open sourced place on Polygon triangulation. I found out that the main problem is that the vertices of the spheres that I used were placed randomly instead of being close to each other.

I’m not sure whether I should rescript the vertices, or procedurally make another type of sphere, or leave it and find another solution.