Quick answer: Pass an explicit up vector (0, 0, 1) to Look at position action. Default up may differ between C3 versions or 3D camera modes.

A 3D arcade racer’s camera looks at the player but the horizon tilts wrong. Construct’s look-at function assumed an up vector that doesn’t match world setup.

Specify Up

3DCamera → Look at position (x, y, z) with up (0, 0, 1)

(0, 0, 1) for typical C3 setup (Z is up). If your scene uses Y up, supply (0, 1, 0).

Gimbal Lock

Looking straight up/down can cause gimbal lock with bad up vectors. Add small offset to camera target or use quaternion math via Browser/JavaScript:

Browser → Execute JS: "camera.lookAt(target); camera.rotation.z = 0;"

Pre-Defined Up Per Mode

For first-person, up = world up. For chase cam, up could be player’s up. For roller-coaster, up = vehicle up. Pick per camera mode.

Verifying

Camera follows player, horizon level. Looking straight down (with offset) doesn’t glitch. Switching modes doesn’t tilt.

“Look-at needs three vectors: eye, target, up. Provide all three or get surprises.”

For vehicle camera, smooth-interp the up vector toward vehicle up — corner-banking effect like real driving sims.