What do you want to achieve?
Consistent rotation and lerp speed across all fps speeds.
What is the issue?
Speed and rotation intensity go lower the higher the FPS.
Videos below
Expected behavior (60fps)
Behavior above 60fps (240fps)
What solutions have you tried so far?
Can’t find a solution on devforum, I’ve tried using this formula for the lerp alpha but it sorta makes it worse?
local lerpFactor = 1-math.exp(-20*dt)
dragging.CFrame = dragging.CFrame:Lerp(targetCF, lerpFactor)
Full script
runService.RenderStepped:Connect(function(dt)
if dragging then
-- mouse delta
local delta = getMouseDelta()*3
local height = math.clamp(delta.Magnitude/19,1.5,7)
local targetCF = CFrame.new(mouse.Hit.Position - (dragging.CFrame.LookVector * height)) * CFrame.Angles(math.rad(delta.y)*dt*60,math.rad(delta.x)*dt*60,0)
local lerpFactor = 1-math.exp(-20*dt)
-- lerp
dragging.CFrame = dragging.CFrame:Lerp(targetCF, lerpFactor)
end
end)
-- removing rotation*dt*60 still has the issue
Interesting, I’ve done some testing seems like its not the lerp formula that is actually wrong since it works for the linear movement.
I believe it’s actually the mouse delta that is incorrect as it doesn’t regard state. I found this to be better:
local dragging = workspace.Part
dragging.CanQuery = false
local mouse = game.Players.LocalPlayer:GetMouse()
local UserInputService = game:GetService("UserInputService")
local oldMousePos = mouse.Hit.Position
local initialCFrame = dragging.CFrame
game["Run Service"].RenderStepped:Connect(function(dt)
if dragging then
-- mouse delta
--local delta = (mouse.Hit.Position-oldMousePos)*100 --I'm guessing its because it's like setting an impulse once
local delta = (mouse.Hit.Position-dragging.CFrame.Position)*10 --this seems to work better
oldMousePos = mouse.Hit.Position
--local height = math.clamp(delta.Magnitude/19,1.5,7)
local rotationTerm = CFrame.fromOrientation(math.rad(delta.Z),0,-math.rad(delta.X))
local targetCF = CFrame.new(mouse.Hit.Position)*rotationTerm
--local lerpFactor = 1-math.exp(-10*dt)
local lerpFactor = 1-math.pow(0.5,10*dt)
-- lerp
dragging.CFrame = dragging.CFrame:Lerp(targetCF, lerpFactor)
--if delta.Magnitude > 0.001 then
-- initialCFrame = dragging.CFrame
--end
end
end)
-- removing rotation*dt*60 still has the issue
Some testing on low and high fps, seems to be the same amount of rotation intensity.