CFrame Operation is Adjusting the Wrong Axis

I’m performing a simple CFrame operation on the Camera to rotate it 90° to the right whenever the “E” key is pressed but I’m having unexpected results. The Camera rotates on the correct axis (Y) but it also seems to be rotating on the (X) & (Z) axes as well, which is not wanted.

-- Right Rotation
elseif action == "RightRotate" and state == Enum.UserInputState.Begin then

		-- Tween
		TS:Create(PlayerCamera,
			TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), 
			{CFrame = PlayerCamera.CFrame * CFrame.Angles(0,math.rad(90),0)}
		):Play()

The Camera BEFORE pressing “E”/Rotating:
image

The Camera AFTER pressing “E”/Rotating:
image

Full Script:

-- Written by Aensvey

-- Services
local CAS = game:GetService("ContextActionService")
local TS = game:GetService("TweenService")

-- Variables
local Height = 30
local Angle = 80
local ZoomStrength = 15

local Zoomed = false
local Moving = nil





-- Wait for Character
repeat
	task.wait()
until
	game.Players.LocalPlayer.Character

-- Camera
local PlayerCamera = game.Workspace.CurrentCamera
repeat task.wait()
	PlayerCamera.CameraType = Enum.CameraType.Scriptable 
until
	PlayerCamera.CameraType == Enum.CameraType.Scriptable
	
	

-- Camera Positioning
PlayerCamera.CFrame = CFrame.new(0,Height,0) * CFrame.Angles(math.rad(-Angle),0,0)

-- Adjusted Camera
local function getAdjustedCFrame()
	return CFrame.new(PlayerCamera.CFrame.X,Height,PlayerCamera.CFrame.Z) * PlayerCamera.CFrame.Rotation
end

-- Camera Movement
local function handleMovement(action, state, input)
	
	-- Zooming
	if action == "Zoom" then
		print("ZOOM")
		-- Zoomed In
		if input.Position.Z < 0 then
			if not Zoomed then
				Zoomed = true
				
				-- Tween
				TS:Create(PlayerCamera, 
					TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), 
					{CFrame = PlayerCamera.CFrame + Vector3.new(0,ZoomStrength,0)}
				):Play()

				Height = Height + ZoomStrength
				PlayerCamera.FieldOfView = 75
			end
			
		-- Zoomed out
		else
			if Zoomed then
				Zoomed = false
				
				-- Tween
				TS:Create(PlayerCamera, 
					TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), 
					{CFrame = PlayerCamera.CFrame + Vector3.new(0,-ZoomStrength,0)}
				):Play()

				Height = Height - ZoomStrength
				PlayerCamera.FieldOfView = 70
			end
		end
		
	-- Rotating
	elseif action == "LeftRotate" and state == Enum.UserInputState.Begin then
		

	elseif action == "RightRotate" and state == Enum.UserInputState.Begin then
		local p = PlayerCamera.CFrame.Position

		-- Tween
		TS:Create(PlayerCamera,
			TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), 
			{CFrame = PlayerCamera.CFrame * CFrame.Angles(0,math.rad(90),0)}
		):Play()
		
	-- Moving
	elseif state == Enum.UserInputState.Begin then
		print("MOVE")
		Moving = action
		
		if action == "Forwards" then
			while action == Moving do
				PlayerCamera.CFrame = getAdjustedCFrame() * CFrame.new(0,1,0)
				task.wait()
			end
		
		elseif action == "Backwards" then
			while action == Moving do
				PlayerCamera.CFrame = getAdjustedCFrame() * CFrame.new(0,-1,0)
				task.wait()
			end
			
		elseif action == "Left" then
			while action == Moving do
				PlayerCamera.CFrame = getAdjustedCFrame() * CFrame.new(-1,0,0)
				task.wait()
			end
			
		elseif action == "Right" then
			while action == Moving do
				PlayerCamera.CFrame = getAdjustedCFrame() * CFrame.new(1,0,0)
				task.wait()
			end
		end
	else
		if Moving == action then
			Moving = nil
		end
		-- LAST input here if u feel like adding that
	end
end

-- Bind Movment
CAS:BindAction("Forwards", handleMovement, false, Enum.KeyCode.W)
CAS:BindAction("Backwards", handleMovement, false, Enum.KeyCode.S)
CAS:BindAction("Left", handleMovement, false, Enum.KeyCode.A)
CAS:BindAction("Right", handleMovement, false, Enum.KeyCode.D)
CAS:BindAction("Zoom", handleMovement, false, Enum.UserInputType.MouseWheel)
CAS:BindAction("LeftRotate", handleMovement, false, Enum.KeyCode.Q)
CAS:BindAction("RightRotate", handleMovement, false, Enum.KeyCode.E)

I have verified through print statements that no other code is running or interfering with the rotation mechanics.

Your current code rotates the camera around its own y-axis. If you are trying to rotate the camera around the global y-axis then you need to calculate the tween goal this way:

{CFrame = CFrame.Angles(0,math.rad(90),0) * PlayerCamera.CFrame.Rotation + PlayerCamera.CFrame.Position}
1 Like

Appreciated, thank you for the information.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.