Recently I’ve been working on a mesh deformation wave-system and I’ve been optimizing it as of late. However, whenever I try to collect nodes in a grid-like pattern, my system tends to get glitchy due to how I am doing grid collection.
Here’s a video of what I mean:
External MediaThe Issue:
What im trying to do is make sure that all nodes get collected in a square-like shape evenly, but what seems to happen is that the nodes get collected in a spread-like pattern. Here’s the snippet of code im using:
--- Split Bone collections into Quadrants for optimization
local GridQuads = {};
-- Create anchor points first
local QuadrantsPerMesh = math.round(2048 / BONES_PER_QUADRANT); -- Number of quadrant nodes to generate
local ArrayDivision = math.round(#ExtractedBones / QuadrantsPerMesh); -- Rows & Colums to generate
local OriginCorner : Vector3 = (MeshDeform.Position - Vector3.new(MeshDeform.Size.X / 2, 0, MeshDeform.Size.Z / 2)); -- Starting position for grid
local p = Instance.new("Part");
p.Material = Enum.Material.Neon
p.Position = OriginCorner + Vector3.new(0, 500, 0);
p.Size = Vector3.new(1, 1000, 1);
p.Anchored = true
p.CanCollide = false
p.Parent = workspace.Camera
p.Name = MeshDeform.Name.."-PIVOTORIGIN"
for X = 0, QuadrantsPerMesh, ArrayDivision do
for Z = 0, QuadrantsPerMesh, ArrayDivision do
table.insert(GridQuads, OriginCorner + Vector3.new(X * BONES_PER_QUADRANT, 0, Z * BONES_PER_QUADRANT));
local r = Random.new(#GridQuads);
local p = Instance.new("Part");
p.Material = Enum.Material.Neon
p.Position = OriginCorner + Vector3.new(X * BONES_PER_QUADRANT, 0, Z * BONES_PER_QUADRANT)
p.Color = Color3.fromRGB(r:NextInteger(0, 255), r:NextInteger(0, 150), r:NextInteger(25, 255));
p.Size = Vector3.new(25, 25, 25);
p.Anchored = true
p.CanCollide = false
p.Parent = workspace.Terrain
p.Name = MeshDeform.Name.." - {"..X..", "..Z.."}"
task.wait(.2);
end
end
--- Collect Bones in quadrants by distance to each anchor position
local Result = {};
local Closed = {};
for _, QuadrantPoint : Vector3 in pairs(GridQuads) do
local Collection = {};
repeat
local Nearest = math.huge
local BestBone : Bone?
for _, Bone : Bone in pairs(ExtractedBones) do
local Distance = (Bone.WorldPosition - QuadrantPoint).Magnitude
if ((Distance < Nearest) and not table.find(Closed, Bone)) then
Nearest = Distance
BestBone = Bone
end
end
if (not BestBone) then break; end
table.insert(Closed, BestBone);
table.insert(Collection, BestBone);
local r = Random.new(_);
local p = Instance.new("Part");
p.Material = Enum.Material.Neon
p.Position = BestBone.WorldPosition + Vector3.new(0, 10, 0)
p.Color = Color3.fromRGB(r:NextInteger(0, 255), r:NextInteger(0, 150), r:NextInteger(25, 255));
p.Size = Vector3.new(5, 5, 5);
p.Anchored = true
p.CanCollide = false
p.Parent = workspace.SpawnLocation
until
(#Collection >= BONES_PER_QUADRANT or (#Closed == #ExtractedBones))
if (not next(Collection)) then break; end
-- unrelated code afterwards
end