Changing the camera’s CFrame with CFrame:FromMatrix() can warp your perspective if you do it wrong enough. Since you set it through look / up / right vectors, if the combined total has a magnitude over 1 the screen will warp, you can tween this to create a nausea like effect.
Assuming the direction for the up and right vectors has a magnitude of 1 by converting the desired direction to a unit vector, it should look normal, like this:
Now lets say the vectors are messed up on a given axis, lets make them slightly shorter than theyre supposed to be, now the game will try to fit more things on the screen as it runs the same distance, but with more and shorter steps, compressing the image, like this:
Going above 1 just breaks the camera.
Since camera scripts are generally bound to the renderstepped event, you could change the vectors in increments of 0.01 or more.
Since it probably triggers on command a remoteEvent should be used:
local camera = workspace.CurrentCamera
local REvent = RemoteEvent
REvent.OnClientEvent:Connect(function()
for i = 1 , 2500 do
camera.CFrame = CFrame.fromMatrix(
camera.CFrame.Position,
camera.CFrame.UpVector -Vector3.new(0.01,0.01,0.01),
camera.CFrame.RightVector -Vector3.new(0.01,0.01,0.01),
)
wait()
end
end)