Im trying to make a truncated icosahedron via code buuut i keep having orientation issues
I need it to have a mesh per face and to be generated via code.
local sphereRadius = 1.8
local function placeShape(type, position)
local shape = script[type]:Clone()
local normal = position.unit
local upVector = Vector3.new(0, 1, 0)
local rightVector = upVector:Cross(normal).unit
if rightVector.X < 0 then
rightVector = -rightVector
end
shape.CFrame = CFrame.fromMatrix(position, rightVector, normal)
shape.Parent = workspace
end
local function create(radius)
local phi = (1 + math.sqrt(5)) / 2
local scale = radius / math.sqrt(1 + phi^2)
local faceCenters = {}
local pentagonCenters = {}
local vertexToFaceCenters = {}
local vertices = {
Vector3.new(-1, phi, 0) * scale, Vector3.new(1, phi, 0) * scale,
Vector3.new(-1, -phi, 0) * scale, Vector3.new(1, -phi, 0) * scale,
Vector3.new(0, -1, phi) * scale, Vector3.new(0, 1, phi) * scale,
Vector3.new(0, -1, -phi) * scale, Vector3.new(0, 1, -phi) * scale,
Vector3.new(phi, 0, -1) * scale, Vector3.new(phi, 0, 1) * scale,
Vector3.new(-phi, 0, -1) * scale, Vector3.new(-phi, 0, 1) * scale,
}
local faces = {
{1, 12, 6}, {1, 6, 2}, {1, 2, 8}, {1, 8, 11}, {1, 11, 12},
{2, 6, 10}, {6, 12, 5}, {12, 11, 3}, {11, 8, 7}, {8, 2, 9},
{4, 10, 5}, {4, 5, 3}, {4, 3, 7}, {4, 7, 9}, {4, 9, 10},
{5, 10, 6}, {3, 5, 12}, {7, 3, 11}, {9, 7, 8}, {10, 9, 2}
}
for i, face in faces do
local a = vertices[face[1]]
local b = vertices[face[2]]
local c = vertices[face[3]]
local center = (a + b + c) / 3
center = center.unit * radius
faceCenters[i] = center
end
for i = 1, #vertices do
vertexToFaceCenters[i] = {}
end
for i, face in faces do
for _, vertexIndex in face do
table.insert(vertexToFaceCenters[vertexIndex], faceCenters[i])
end
end
for i, centers in vertexToFaceCenters do
if #centers == 5 then
local sum = Vector3.new(0, 0, 0)
for _, center in centers do
sum = sum + center
end
local avg = sum / 5
avg = avg.unit * radius
table.insert(pentagonCenters, avg)
end
end
for _, center in faceCenters do
placeShape("Hexagon", center)
end
for _, center in pentagonCenters do
placeShape("Pentagon", center)
end
end
create(sphereRadius)