To say where anything is in 3-D you need three axes —
Fix
Step 1 — curl from x to y with your right hand. Point your right
fingers along
Step 2 — do it again with your left hand. Same curl from
Step 3 — read off the consequence. The two frames differ by a single sign flip on one axis, a mirror reflection. There is no rotation that turns one into the other — a left hand is not a rotated right hand. So every quantity built from the cross product (a surface normal, a torque, "which way is out") points the opposite way between the two conventions.
Step 4 — and the engines really do disagree. This is not a textbook
nicety. OpenGL (and Maya, and the usual maths convention) is
right-handed; DirectX and Unity are left-handed. Port a
mesh between them without flipping a
Handedness is the famous one, but two cousins cause just as many late nights.
The "up" axis. Even among right-handed frames, engines disagree on which
axis points up. Many graphics engines are y-up
(
Row vs column vectors. Is a vector a tall column the matrix multiplies on
the right (
When a handedness mismatch slips through, the symptoms are weirdly specific. Models come out mirrored — text on a sign reads backwards, a character's holster jumps to the wrong hip. Triangle winding order reverses, so the engine thinks every front face is a back face: surfaces turn inside-out, and either the whole model vanishes (back faces culled) or its insides render while its outsides don't.
Lighting goes haywire too, because the surface normal — a cross product — now
points into the wall: lit faces go dark and shadowed faces glow. The usual fix is
a single reflection — negate the
Handedness and up-axis are two separate dials, and engines set them independently —
so "matching" on one tells you nothing about the other. Unity and Unreal are both
left-handed, yet Unity is y-up and Unreal is z-up: an asset
ported straight across without an explicit conversion comes out lying on its side, rotated
The trap is assuming the conversion is automatic just because the file loaded without an error — handedness and up-axis live in the file format's metadata (or in nobody's metadata at all), and the importer has to be told, explicitly, which pair of conventions it's converting from and to. "It loaded" and "it's in the right place" are two different claims.