Unsure how to replicate a smooth spiral downward with CSG

Reference for what im talking about:

Is this something too complicated for CSG? If not, how can I replicate this easily?

I know a solution could just be using gapfill, but i’d rather figure this out with CSG

I mean think about it. Just make a union that slopes down that’s a little bigger thank the initial part.

1 Like

If you want I can make that for you later in the day.

You could try to take a cylinder and start carving it out like you would a cake with negated upside-down wedges.

2 Likes

I don’t think people above me realize how extremely complicated this shape is to make using CSG.
You can’t “just make a union” like this, carving this out is even harder than using GapFill plugin.

To answer your question, yes, it’s very complicated to create a spiral shape like that through CSG. There is no easy way to do it, simply because each following triangle has to be oriented differently than the previous. Otherwise you will have ugly gaps in between each step/slope.
You will have better chances making it in Blender or some other 3D modeling program as it will handle triangle orienting for you.
Even then, if you’ll want it to have proper collisions, you will have to do some smart mesh splitting so it’s right.

2 Likes

The easy route may be to do something like below where you make a bunch of rectangular cuboids (Parts) and union them together. As Veldaren pointed out, the next big problem you’ll have after getting a shape you like is trying to give it proper collisions. If you change “levels” to 1 in the script below and run it (you can then select all parts while it’s running and copy/paste them to workspace after hitting stop), you’ll see the basic shape you need to carve. Not easy. If you union it together you’ll see how the collisions perform. (Careful with this script. It was a quick hacky thing to get me a spiral to play around with. It isn’t very robust.)

I haven’t tried to import a mesh that’s anything like this into Roblox. Anyone know if the player would be able to run up the ramp without floating above it if this were a mesh? I’d hate for you to learn Blender just to make this tower and find out that the player floats the whole way up. Learning experience I suppose. A mesh would be the way to go if collisions work on this kind of thing.

local part = Instance.new("Part")
part.Anchored = true
part.Size = Vector3.new(13, 0.5, 30)
part.Position = Vector3.new(0,part.Size.Y*0.5,-100)

local levels = 6	-- number of levels in the tower
local radius = 75
local zScale = 1

local deg = 0
local angle = 0

while deg <= 360*levels do
	local newPart = part:Clone()
	newPart.Size = newPart.Size * Vector3.new(1,deg*0.2,zScale)
	newPart.CFrame = part.CFrame * CFrame.Angles(0,math.rad(deg),0) * CFrame.new(radius, newPart.Size.Y, 1)
	newPart.Position = Vector3.new(newPart.Position.X, newPart.Size.Y*0.5, newPart.Position.Z)
	newPart.Parent = workspace
	
	angle = math.atan(0.5*newPart.Size.Z / (radius+0.5*part.Size.X)) * 2
	deg = deg + math.deg(angle)
	
	radius = radius * 0.99 	-- shrink the radius
	zScale = zScale * 0.985	-- shrink the brick size in Z
end

7 Likes

Wow, nice work. This should probably be made the solution now, lol.

3 Likes

There’s no way you’d get accurate floor collisions right from a mesh this complex. If you made this in Blender, you’d want to set it to CanCollide false, Box collision, and build your own collision geometry from invisible parts, just like you’ve done with your script.

2 Likes

I was afraid that might be the case. Maybe individual parts would be the way to go here if you aren’t interested in making a mesh in Blender and following the advice of EmilyBendsSpace. Can make them as wide as you can stand to keep down the part count.

If a shape like that were to be made as a MeshPart or CSG, it would need to be cut down into multiple parts to have “perfect” collisions.
Preferrably split by each circle the spiral makes, then the collision mesh wouldn’t merge with the other circle, and so on, and so on.

1 Like