local function o(o)local D=velSpring:Update(o,Input.Vel(o))local Z=panSpring:Update(o,Input.Pan(o))local r=fovSpring:Update(o,Input.Fov(o))local H=sqrt(tan(rad(35.0))/tan(rad(cameraFov/2)))cameraFov=clamp(cameraFov+(r*FOV_GAIN)*(o/H),1,120)cameraRot=cameraRot+(Z*PAN_GAIN)*(o/H)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((D*NAV_GAIN)*o)cameraPos=I.p Camera.CFrame=I Camera.Focus=I*CFrame.new(0,0,-GetFocusDistance(I))Camera.FieldOfView=cameraFov 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
end
