How do i make the tornado bend?

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!
    I want my tornado to swirl/bend around realisticly, kinda like this

  2. What is the issue? Include screenshots / videos if possible!
    I dont know how to make it do that

  3. What solutions have you tried so far? Did you look for solutions on the Creator Hub?
    I made it so it moves sideways a bit but it doesnt give the effect i want

local tornadoTopY = 400
local tornadoBottomY = 0
local tornadoHeight = tornadoTopY - tornadoBottomY
local tornadoDescendSpeed = 0.5
local baseSize = Vector3.new(40, 50, 40)
local basePos = Vector3.new(200, tornadoBottomY, 100)

while true do
	local part = Instance.new("Part")
	local mesh = Instance.new("SpecialMesh")
	mesh.Parent = part
	mesh.MeshType = Enum.MeshType.Sphere
	part.TopSurface = Enum.SurfaceType.Smooth
	part.BottomSurface = Enum.SurfaceType.Smooth
	part.Size = baseSize
	part.Position = basePos
	part.Anchored = true
	part.CanCollide = false
	part.Color = Color3.fromRGB(59, 56, 63)
	part.Transparency = 1
	part.Parent = game.Workspace

	task.spawn(function()
		while part.Parent do
			part.Position = part.Position + Vector3.new(0, 1, 0)
			part.Size = part.Size + Vector3.new(0.2, 0.2, 0.2)
			if part.Position.Y >= tornadoTopY then
				part.Transparency = 0
			else
				part.Transparency = 1
			end
			task.wait()
		end
	end)

	task.spawn(function()
		task.wait(5)
		part.Transparency = 1
		task.wait()
		part:Destroy()
	end)

	tornadoTopY = tornadoTopY - tornadoDescendSpeed
	if tornadoTopY < tornadoBottomY then
		tornadoTopY = tornadoBottomY
	end

	task.wait()
end


Bump, i still dont know how to do this

you can try making mesh with bones, and then animating it (or other method to move bones)

2 Likes

Here are a few versions. They are just sitting in the same spot, rotating and bending like a tornado.
They are made of balls that increase in size as they go up, like in your picture (all are anchored).

ServerScript is what I tested with.

local segs = workspace:WaitForChild("Tornato"):GetChildren()
local rs = game:GetService("RunService")
local base = segs[1].Position
local t = 0

local offsets = {}
for i,p in ipairs(segs) do
	offsets[i] = p.Position - base
end

rs.Stepped:Connect(function(_,dt) t += dt
	local rot = CFrame.Angles(0,t,0) --rotation speed
	for i,p in ipairs(segs) do
		local bend = math.sin(t*2 + i*0.4) * 2 --bend
		local offset = offsets[i] + Vector3.new(bend,0,0)
		p.CFrame = CFrame.new(base) * rot * CFrame.new(offset)
	end
end)
local segs = workspace:WaitForChild("Tornato"):GetChildren()
local rs = game:GetService("RunService")
local base = segs[1].Position
local t = 0

local offsets = {}
for i,p in ipairs(segs) do
	offsets[i] = p.Position - base
end

rs.Stepped:Connect(function(_,dt) t += dt
	local angle = t --rotation speed
	local rot = CFrame.Angles(0,angle,0)
	for i,p in ipairs(segs) do
		local bx = math.sin(t*2 + i*0.4) * 2 --sway
		local bz = math.cos(t*2 + i*0.4) * 2 --bend
		p.CFrame = CFrame.new(base) * rot * CFrame.new(offsets[i] + Vector3.new(bx,0,bz))
	end
end)
1 Like

I have no idea how to make a rig in blender

I want to keep the creating-spheres-and-moving-them-up-and-growing system but just add the bending to that

I actually just tested it, it works cool but sphere 3 and 4 are “disconnected” from each other, also do you know how to implement it to my current tornado system too?

Not sure how you set yours up.. them are in a folder on the workspace all together and only them. Should pick everything up with the :GetChildren(). One stays in place the other kind of wanders. I wasn’t re-writing your script, I was just looking for the math that would do that bending..

This is my system for the tornado, i can edit it and then maybe you can actually implement your bending system into it?

local tornadoTopY = 400
local tornadoBottomY = 0
local tornadoHeight = tornadoTopY - tornadoBottomY
local tornadoDescendSpeed = 0.5
local baseSize = Vector3.new(40, 50, 40)
local basePos = Vector3.new(200, tornadoBottomY, 100)

while true do
	local part = Instance.new("Part")
	local mesh = Instance.new("SpecialMesh")
	mesh.Parent = part
	mesh.MeshType = Enum.MeshType.Sphere
	part.TopSurface = Enum.SurfaceType.Smooth
	part.BottomSurface = Enum.SurfaceType.Smooth
	part.Size = baseSize
	part.Position = basePos
	part.Anchored = true
	part.CanCollide = false
	part.Color = Color3.fromRGB(59, 56, 63)
	part.Transparency = 1
	part.Parent = game.Workspace

	task.spawn(function()
		while part.Parent do
			part.Position = part.Position + Vector3.new(0, 1, 0)
			part.Size = part.Size + Vector3.new(0.2, 0.2, 0.2)
			if part.Position.Y >= tornadoTopY then
				part.Transparency = 0
			else
				part.Transparency = 1
			end
			task.wait()
		end
	end)

	task.spawn(function()
		task.wait(5)
		part.Transparency = 1
		task.wait()
		part:Destroy()
	end)

	tornadoTopY = tornadoTopY - tornadoDescendSpeed
	if tornadoTopY < tornadoBottomY then
		tornadoTopY = tornadoBottomY
	end

	task.wait()
end

The tornado has turned into a… idk even what.



Im just changing values at this point until i get it to look good (also thats my full script so testing it is as simple as putting a server script in workspace and pasting the code in and pressing run (and if you ask why tornadoheight is never used, its because i was gonna do something with it later))
Do you have any ideas for values to get a smooth, slight swirl/bend?

Edit: Changed something, got this



Ya I get it .. it’s not working..

1 Like