local camera = workspace.CurrentCamera local fixedCFrame = CFrame.new(0, 100, 0) -- CFrame of default looking direction/position local rate = 1/5 -- Speed at which the camera will sway local xSwayAngle = math.pi/9 -- X angle change interval local ySwayAngle = math.pi/9 -- Y angle change interval local rollAngle = math.pi/18 -- Roll angle change interval function update(t) local phi = math.pi/2 + math.noise(t*rate, 0) * xSwayAngle local theta = math.pi/2 + math.noise(t*rate, 10) * ySwayAngle local lookDir = Vector3.new(math.sin(theta)*math.cos(phi), math.cos(theta), math.sin(theta)*math.sin(phi)) local backVec = -fixedCFrame:VectorToWorldSpace(lookDir) local upVec = Vector3.new(0, 1, 0) local rightVec = backVec:Cross(upVec) local newCF = CFrame.fromMatrix(fixedCFrame.p, rightVec, rightVec:Cross(backVec)) camera.CFrame = newCF * CFrame.fromAxisAngle(backVec, math.noise(t*rate, 20) * rollAngle) end local t = 0 game:GetService("RunService"):BindToRenderStep("random-camera-sway", Enum.RenderPriority.Camera.Value, function(dt) t = t + dt update(t) end)