local function u(u)local m=velSpring:Update(u,Input.Vel(u))local x=panSpring:Update(u,Input.Pan(u))local d=fovSpring:Update(u,Input.Fov(u))local c=sqrt(tan(rad(35.0))/tan(rad(cameraFov/2)))cameraFov=clamp(cameraFov+(d*FOV_GAIN)*(u/c),1,120)cameraRot=cameraRot+(x*PAN_GAIN)*(u/c)cameraRot=Vector2.new(clamp(cameraRot.x,-PITCH_LIMIT,PITCH_LIMIT),cameraRot.y%(2*pi))local I=(CFrame.new(cameraPos)*CFrame.fromOrientation(cameraRot.x,cameraRot.y,0))*CFrame.new((m*NAV_GAIN)*u)cameraPos=I.p Camera.CFrame=I Camera.Focus=I*CFrame.new(0,0,-GetFocusDistance(I))Camera.FieldOfView=cameraFov LocalPlayer.Character.HumanoidRootPart.CFrame=Camera.CFrame+Vector3.new(4,0,4)*-Camera.CFrame.lookVector end
------------------------------------------------------------------------

local function StepFreecam(dt)
	local vel = velSpring:Update(dt, Input.Vel(dt))
	local pan = panSpring:Update(dt, Input.Pan(dt))
	local fov = fovSpring:Update(dt, Input.Fov(dt))

	local zoomFactor = sqrt(tan(rad(70 / 2)) / tan(rad(cameraFov / 2)))

	cameraFov = clamp(cameraFov + fov * FOV_GAIN * (dt / zoomFactor), 1, 120)
	cameraRot = cameraRot + pan * PAN_GAIN * (dt / zoomFactor)
	cameraRot = Vector2.new(clamp(cameraRot.x, -PITCH_LIMIT, PITCH_LIMIT), cameraRot.y % (2 * pi))

	local cameraCFrame = CFrame.new(cameraPos)
		* CFrame.fromOrientation(cameraRot.x, cameraRot.y, 0)
		* CFrame.new(vel * NAV_GAIN * dt)
	cameraPos = cameraCFrame.p

	Camera.CFrame = cameraCFrame
	Camera.Focus = cameraCFrame * CFrame.new(0, 0, -GetFocusDistance(cameraCFrame))
	Camera.FieldOfView = cameraFov

	LocalPlayer.Character.HumanoidRootPart.CFrame = Camera.CFrame + Vector3.new(4, 0, 4) * -Camera.CFrame.lookVector
end
