I've been trying to work on a method for splitting one large, rectangular part into a set number of smaller parts (always a perfect square amount for mathematical simplicity) along its smallest axis (so that if the part had an x,y,z size of 1,2,3, the generated parts would maintain their x position while varying their y and z positions, all having a constant size), but for some reason, while my code does generate the parts, it does not properly orient them. I know that it won't work for rotated parts or anything because I'm using plain position and not CFrame (not sure how to implement CFrame into this), but the code should be working for non-rotated parts, but I've no luck with them so far. Here is what I've got, I'd greatly appreciate some help in fixing it.
function splitPart(part, numPieces) --numPieces must be a perfect square
local smallestAxis = "x"
local size = part.Size
local pos = part.Position
part:Destroy()
if size.X>=size.Y and size.Z>=size.Y then
smallestAxis = "y"
elseif size.X>=size.Z and size.Y>=size.Z then
smallestAxis = "z"
end
if smallestAxis=="x" then
local maxHeight = size.Y
local maxWidth = size.Z
local length = size.X
local height = maxHeight/math.sqrt(numPieces)
local width = maxWidth/math.sqrt(numPieces)
local currentX = pos.X --these are offsets from the "origin" bottom left corner
local currentY = pos.Y-size.Y/2
local currentZ = pos.Z-size.Z/2
for i=1,numPieces do
local p = Instance.new("Part", workspace)
p.Anchored = true
p.Size = Vector3.new(length, height, width)
p.Position = Vector3.new(currentX, currentY, currentZ)
currentY = currentY + height
if currentY == maxHeight then
currentY = 0
currentZ = currentZ + width
end
end
elseif smallestAxis=="y" then
local height = size.Y
local maxWidth = size.Z
local maxLength = size.X
local length = maxLength/math.sqrt(numPieces)
local width = maxWidth/math.sqrt(numPieces)
local currentX = pos.X-size.X/2 --these are offsets from the "origin" bottom left corner
local currentY = pos.Y
local currentZ = pos.Z-size.Z/2
for i=1,numPieces do
local p = Instance.new("Part", workspace)
p.Anchored = true
p.Size = Vector3.new(length, height, width)
p.Position = Vector3.new(currentX, currentY, currentZ)
currentZ = currentZ + width
if currentZ == maxWidth then
currentZ = 0
currentX = currentX + length
end
end
else
local maxHeight = size.Y
local width = size.Z
local maxLength = size.X
local length = maxLength/math.sqrt(numPieces)
local height = maxHeight/math.sqrt(numPieces)
local currentX = pos.X-size.X/2 --these are offsets from the "origin" bottom left corner
local currentY = pos.Y-size.Y/2
local currentZ = pos.Z
for i=1,numPieces do
local p = Instance.new("Part", workspace)
p.Anchored = true
p.Size = Vector3.new(length, height, width)
p.Position = Vector3.new(currentX, currentY, currentZ)
currentX = currentX + length
if currentX == maxLength then
currentX = 0
currentY = currentY + height
end
end
end
end
splitPart(workspace.Part, 4)
Note: If someone can come up with a solution that works on all three axis without keeping one constant but also not making parts too small, that'd be great too.
