Difference between right-handed and left-handed systems

Whenever I write a program in Direct3D, I am always concerned about the fact that it is a left-handed system. I was used to right-handed systems because my first 3DCG learning experience was with OpenGL, and the mathematics I learned as a student must have been right-handed as well. I also think that many of the GL-like APIs for game consoles were also right-handed. And yet, I think that Direct3D’s adoption of the left-hand system has made complex 3DCG even more complex.

Many people think that the right-hand system and the left-hand system are just different in matrix calculation, but the biggest difference is that the definition of the Z buffer changes. Whereas the right-hand system is in the range-1~ 1, the left-hand system is in the range 0 ~ 1. The projective transformation matrix changes accordingly, clipping range changes, the orientation of the vectors in the outer product calculation changes, and the orientation of the polygon faces changes. Frankly, just reading the program, I am not quite sure what the correct code is.

Do you know why Direct3D adopted the left-handed system?

If I remember correctly, I think it was because the projective transformation calculations and z-buffer calculations were a bit lighter. I think that’s how they wanted to differentiate it from OpenGL. This was back in the hardwired era, when they wanted to compute as fast as possible, even by one clock cycle. Nowadays, projection transformations are done by shaders, and no one cares about a few clocks. For that much advantage, the engineers who create game engines and CG tools are struggling.

I sometimes think that since the matrix calculation is done in the shaders anyway, why not just do the right-hand system→left-hand system conversion in the shaders? However, there are game engines and CG tools that were created in the left-hand system, and it is not possible to unify them to the right-hand system now.

I searched for a summary site, and this is what I found.

https://zenn.dev/it_ks/articles/cbe27860548ea1

There are not only right-hand and left-hand systems, but alsoY-uporZ-up, and it is not in a state of unification anymore.

Unity and UE are also left-handed, but there is a difference betweenY-upandZ-up. (ChatGPT says UE is right-handed, but which is correct?) CG data is mostly right-handed, so left-handed game engines probably convert it when importing.

If it is just meshes, conversion is simple, but when animations come in, problems can easily occur. In particular, data with animated 3-axis rotation angles cannot be converted easily. If you resample the data and recreate the animation data, it will work, but gimbal lock can still occur.

How are those who are creating their own game engines doing? Considering that there are so many multi-platforms, I’m thinking that they are making them in a right-handed system. I am wondering if those based on Direct3D use the left hand system.