The title just says it all:)
The code
local runService = game:GetService("RunService")
local vehicle = script.Parent
local chassis = vehicle.Chassis
local platform = chassis.Platform
local wheelRadius = 0.5
local suspensionDistanceConstant = 1
local springConstant = 300
local damperConstant = 5000
local rayParameters = RaycastParams.new()
rayParameters.FilterDescendantsInstances = {vehicle}
rayParameters.FilterType = Enum.RaycastFilterType.Blacklist
local vehicleFloats = {}
local updateSprings = function(spring, delta)
if not spring then return end
local springTable = vehicleFloats[spring]
if not springTable then
springTable = {}
springTable.currentSuspensionDistance = 0
springTable.prevousSuspensionDistance = 0
springTable.springVelocity = 0
springTable.springForce = 0
springTable.damperForce = 0
end
local currentSuspension = springTable.currentSuspensionDistance
local prevousSuspensionDistance = springTable.prevousSuspensionDistance
local springVelocity = springTable.springVelocity
local springForce = springTable.springForce
local damperForce = springTable.damperForce
local ray = workspace:Raycast(spring.WorldPosition, Vector3.new(0, -1000, 0), rayParameters)
if ray then
local distance = (ray.Instance.Position - spring.WorldPosition).Magnitude
prevousSuspensionDistance = currentSuspension
currentSuspension = suspensionDistanceConstant - (distance - wheelRadius)
springVelocity = (currentSuspension - prevousSuspensionDistance) / delta
springForce = springConstant * currentSuspension
damperForce = damperConstant * springVelocity
local force = (springForce + damperForce)
print(force)
spring.Force.Force = Vector3.new(0, force, 0)
end
end
local getSprings = function(delta)
for _, spring in pairs(platform:GetChildren()) do
if string.match(spring.Name, "Spring") then
updateSprings(spring, delta)
end
end
end
runService.Heartbeat:Connect(getSprings)