So I've been trying to limit my camera's Y angle to not allow the player to look down more than 40 degrees. I found a way to do it and I did it using math.clamp(), but it ended up not being as smooth as I hoped it would be.

local uis = game:GetService("UserInputService")
local runService = game:GetService("RunService")
local plrs = game:GetService("Players")
local plr = plrs.LocalPlayer 
local char = script.Parent.Parent 
local humanoid = char:WaitForChild("Humanoid")
local camera = workspace.CurrentCamera

humanoid.CameraOffset = Vector3.new(0, 4, 0)

runService:BindToRenderStep("LockCursorLoop", Enum.RenderPriority.Camera.Value, function()
	uis.MouseBehavior = Enum.MouseBehavior.LockCenter -- Locks the cursor in the center kind of like shift lock but better I suppose.
end)


runService:BindToRenderStep("CameraAngleLoop", Enum.RenderPriority.Camera.Value, function()
	local rX, rY, rZ = camera.CFrame:ToOrientation()
	
	local limitX = math.clamp(math.deg(rX), -180, 40)
	
	
	camera.CFrame = CFrame.new(camera.CFrame.Position) * CFrame.fromOrientation(math.rad(limitX), rY, rZ)
end)

This is the code I've been using so far. For some reason it's not smooth at all and if I pull the mouse hard enough I can make the player look down beyond 40 degrees.

Here's a demonstration of what I mean by "not smooth": https://gyazo.com/eb36eb350e2b7345075314522b0effa0

Thanks in regard.