What you can do is manually interpolate the current position/rotation to the goal every frame.
Here is a crude example:
local current = camera.CFrame
local goal = CFrame.new(CameraCFrame.p,CameraFocus.p)
camera.CFrame = current:lerp(goal, 0.5)
There are better ways of doing this imo (using scripted springs) but this works well enough and simulates the same thing that springs would accomplish.
Try this: instead of connecting the function to :RenderStepped, properly bind it to RenderStep with :BindToRenderStep. That way, you can set its priority.
I’m betting that your character updates at a RenderPriority of 300 (see Documentation - Roblox Creator Hub for more info), so the camera should update at a priority below that. (lower priority values get executed earlier)
RunService:BindToRenderStep(
"camera"
Enum.RenderPriority.Camera.Value,
yourUpdateFunction -- this is the function you would normally connect to :RenderStepped
)
I’ve already been doing this with BodyGyro and BodyPosition for a while and it worked perfectly, but the problem with that is that you need to have a physical part. I haven’t used springs yet, do they need a physical part or do they only need an attachment?
I don’t mean SpringConstraints, I meant some sort of spring module.
I’ll admit that I barely know what I’m talking about at this point since I’ve only ever used springs for simulating gun recoil and not for camera interpolation. I really didn’t expect your problem to be harder than playing around with :lerp and RenderStepped priorities.
local alpha = 0.5 -- A value between 0 and 1. 1 is instantaneous. 0 doesn't move at all.
Camera.CFrame = Camera.CFrame:lerp(goal, alpha)
Multiply the alpha by the dt. Increase alpha by some factor because we’re multiplying it by 1/60 on average. Also clamp it to between 0 and 1 so that it never overshoots when the framerate drops suddenly.
local alpha = math.clamp(0.5 * 60 * dt, 0, 1) -- dt goes here
Camera.CFrame = Camera.CFrame:lerp(goal, alpha)