12345678910111213141516171819202122232425262728293031323334353637383940 |
- local RunService = game:GetService("RunService")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local character = script.Parent
- local springModel = ReplicatedStorage.spring
- springModel.Parent = workspace
- local current = springModel.Current
- local goal = springModel.Goal
- local velocityAngle = 0
- local velocityAxis = Vector3.new(1,0,0)
- local stiffness = 3
- local damping = 1
- function stepSpring(dt)
- local currentOrientation = current.CFrame - current.CFrame.p
- local goalOrientation = goal.CFrame - goal.CFrame.p
-
- local offset = goalOrientation:inverse() * currentOrientation
- local offsetAxis, offsetAngle = offset:ToAxisAngle()
-
- -- hookes law: F = -kx - bv
- -- if you know lots of cool calculus you can do some
- -- differential equations and get this as a function
- -- of dt but im bad at math and dont know how that works :(
- local force = -stiffness * offsetAngle
- force = force - (velocityAngle * damping * (1/dt))
-
-
- local dt_acceleration_mat = CFrame.fromAxisAngle(offsetAxis, force * dt)
-
- local dt_velocity_mat = CFrame.fromAxisAngle(velocityAxis, velocityAngle) * dt_acceleration_mat
- velocityAxis, velocityAngle = dt_velocity_mat:ToAxisAngle()
-
- current.CFrame = current.CFrame * dt_velocity_mat
- end
|