# Sliding Physics

I need a way to check if the current thing that a player is walking on is at a slant so that depending on how angled the slant is the faster the player can go.
(If you don’t know what I am trying to say just think of the sliding system from apex legends)

You can just use body velocity when +2 keybind or 1

You should be able to get the angle to ground by raycasting downwards and using the Normal property in a formula like:

``````local angle = math.atan2(normal.Y, normal:Dot(humanoidRootPart.CFrame.LookVector))
``````

How would I make a raycast downwards?

Given the orgin point of the ray you would just want to set the, Direction value to the LookVector of your given object (`-` Vector):

``````local DownVector = Object.CFrame.LookVector * -10 -- Goes 10 studs down from the object's inital position (This would be the direction value of the ray)
``````

Would this just be trying to find which way the character is moving or making it look for the ground?

Just raycast with a direction of like (0,-5,0)

should I make it its own function or stick to the sliding function?

Whatever makes the most sense for your script

do you think you can give a little example of what it could look like? I’m still having a bit of a hard time understanding how I’m meant to make it check for the angle.

Something like

``````local param = RaycastParams.new()
param.FilterType = Enum.RaycastFilterType.Blacklist
param.FilterDescendantsInstances = {character}
local res = workspace:Raycast(hrp.Position,Vector3.new(0,-3,0),param)
if res then
local normal = res.Normal
local angle = math.atan2(normal.Y, normal:Dot(humanoidRootPart.CFrame.LookVector))
--etc
end
``````

In a loop

I my best to try to put things all together but all it does it make my character move forwards as long as you hold c, I’m not quite sure how I can make it so it make the character go fast at first then change the slide speed depending on the angled surface

``````function startSlide()
local goal = { }
local param = RaycastParams.new()
param.FilterType = Enum.RaycastFilterType.Blacklist
param.FilterDescendantsInstances = {char}
local res = workspace:Raycast(hrp.Position,Vector3.new(0, -3.25, 0),param)
local angle = nil
sDirection = hrp.CFrame.LookVector
sSpeed = math.max(25, Vector3.new(hrp.Velocity.X, 0, hrp.Velocity.Z).Magnitude) + 20
vel = Instance.new("BodyVelocity")
gyro = Instance.new("BodyGyro")
if res then
angle = math.acos(Vector3.new(0, 1, 0):Dot(res.Normal))
end
if hum.MoveDirection ~= Vector3.new(0, 0, 0) then
sDirection = sDirection:Lerp(hum.MoveDirection, 0.05)
end
vel.Velocity = sDirection * math.min(sSpeed, 150)
vel.MaxForce = Vector3.new(100000, 0, 100000)
vel.Parent = hrp
gyro.CFrame = CFrame.lookAt(hrp.Position, hrp.Position + sDirection)
gyro.MaxTorque = Vector3.new(0, 100000, 0)
gyro.Parent = hrp
hum.AutoRotate = false
goal.CameraOffset = Vector3.new(0, -.7, 0)
if sSpeed <= 14 or hrp.Velocity.Magnitude <= 5 then
stopSlide()
end
local st = ts:Create(hum, slideTI, goal)
st:Play()
end
``````