So I have a quite long script (disregard the module) that basically has an overview of the character and can zoom in/out (which I removed for this post) and can rotate up and down, and all around the character.

The problem is when rotating the camera angle along the Y axis (in this case that would be spinning around the character) it glitches out and can do random circles and never just does a perfect circle around the character.

The set up and variables in this might not be very reader friendly but just try to get the general sense of it and see if you can figure it out. Also to test what I mean by the wacky camera go to my test place here

If this is too hard to read on this website, go to here

local lib = require(game.Workspace.CameraModule)
local plr = game.Players.LocalPlayer
repeat wait() until plr.Character
local char = plr.Character
local mouse = plr:GetMouse()
local minzoom = 0.42
local maxzoom = 2.15
local zoom = 1 --Zoom multiplier
local rotation = {}
	rotation["x"] = 0
	rotation["y"] = 0
	rotation["z"] = 0
local uis = game:GetService("UserInputService")
local xrotmax = 58
local xrotmin = -12

char:WaitForChild("Humanoid").WalkSpeed = 0 --Just a test

lib.SetCameraToScriptable()
set = function()
	local cf = CFrame.new(char.HumanoidRootPart.Position) * CFrame.Angles(rotation["x"],, rotation["y"], rotation["z"]) * CFrame.new(0, 15 * zoom, 9 * zoom)
	lib.PointAt(cf, char.Head.CFrame)
end
set()

delay(0, function()
	game:GetService("RunService").RenderStepped:connect(function()
		set()
	end)
end)

--Put zoom functions here

local looped = {}

uis.InputBegan:connect(function(input)
	if input.UserInputType == Enum.UserInputType.Keyboard then
		local key = string.sub(tostring(input.KeyCode), 14) --This is fourteen because it's originally an enum value and to get to the part as to what letter or key it is, it is fourteen letters in.
		if key == "W" or key == "A" or key == "S" or key == "D" then
			delay(0, function()
				local rot = ((key == "W" or key == "A") and math.rad(-2) or (key == "S" or key == "D") and math.rad(2))
				looped[key] = true
				local rottype = ((key == "W" or key == "S") and "x" or (key == "A" or key == "D") and "y")
				while looped[key] and wait() do
					local rotdeg = math.deg(rotation[rottype] + rot)
					if rottype == "x" and not (rotdeg <= xrotmax and rotdeg >= xrotmin) then
						break
					end
					rotation[rottype] = rotation[rottype] + rot
				end
			end)
		end
	end
end)

uis.InputEnded:connect(function(input)
	if input.UserInputType == Enum.UserInputType.Keyboard then
		local key = string.sub(tostring(input.KeyCode), 14)
		if looped[key] then
			looped[key] = false
		end
	end
end)