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:
The Camera AFTER pressing “E”/Rotating:
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.