# Working Isometric Controls

I’ve been trying to create proper Isometric controls for an Isometric “SCPF” type game I’ve been developing. I’ve tried using the guide at this forum post to aid me in modifying the ControlModule script under the PlayerModule in StarterPlayerScripts but my modifications repeatedly end up in the controls either only working on one axes or breaking them altogether. I am not an experienced programmer so I do not necessarily understand how this modification is mean to be implemented.

Referring to the link above, this is what I’ve managed to come up with so far however it breaks the controls.

Original Code Block:

``````local function calculateRawMoveVector(humanoid, cameraRelativeMoveVector)
local camera = Workspace.CurrentCamera
if not camera then
return cameraRelativeMoveVector
end

if humanoid:GetState() == Enum.HumanoidStateType.Swimming then
return camera.CFrame:VectorToWorldSpace(cameraRelativeMoveVector)
end

local c, s
local _, _, _, R00, R01, R02, _, _, R12, _, _, R22 = camera.CFrame:GetComponents()
if R12 < 1 and R12 > -1 then
-- X and Z components from back vector.
c = R22
s = R02
else
-- In this case the camera is looking straight up or straight down.
-- Use X components from right and up vectors.
c = R00
s = -R01*math.sign(R12)
end
local norm = math.sqrt(c*c + s*s)
return Vector3.new(
(c*cameraRelativeMoveVector.x + s*cameraRelativeMoveVector.z)/norm,
0,
(c*cameraRelativeMoveVector.z - s*cameraRelativeMoveVector.x)/norm
)
end
``````

Modified Code Block:

``````local function calculateRawMoveVector(humanoid, cameraRelativeMoveVector)
local camera = Workspace.CurrentCamera
if not camera then
return cameraRelativeMoveVector
end

if humanoid:GetState() == Enum.HumanoidStateType.Swimming then
return camera.CFrame:VectorToWorldSpace(cameraRelativeMoveVector)
end

local c, s
local _, _, _, R00, R01, R02, _, _, R12, _, _, R22 = camera.CFrame:GetComponents()
if R12 < 1 and R12 > -1 then
-- X and Z components from back vector.
c = R22
s = R02
else
-- In this case the camera is looking straight up or straight down.
-- Use X components from right and up vectors.
c = R00
s = -R01*math.sign(R12)
end
local norm = math.sqrt(c*c + s*s)
return Vector3.new(
(c*cameraRelativeMoveVector.x + s*cameraRelativeMoveVector.z)/norm*Vector3.new(45,45,45),
0,
(c*cameraRelativeMoveVector.z - s*cameraRelativeMoveVector.x)/norm*Vector3.new(45,45,45)
)
end
``````

Video showing desired controls:
robloxapp-20210511-1028021.wmv (2.0 MB)

2 Likes