Transforming your position and rotation matrix from z-up to y-up
I recently face-palmed when realizing that once again, I had set my own application up with Y as the up axis, but was importing all my assets from 3dsmax where Z is the up axis. I am using the Physx exporter and importing using the PXU library. Rather than re-write large portions of my code, I decided to just iterate through imported matricies and convert them from Z up to Y up.
When you are no matricies expert, this can be tough, there are a lot of people asking how to do this and there isn’t a whole lot out there to help you, which is why I am writing this post.
Physx uses 4×3 matricies for transformation, being a 3×3 rotation matrix with a 1×3 translation vector.
Converting the position is easy, just swap the Y and Z values:
vector3 position;
float temp = position.y;
position.y = position.z;
position.z = temp;
But transforming the rotation vector is a whole lot harder. At first thought you may think “hey, just rotate 90 degrees on the X axis” but no, unfortunately this doesn’t work. The actual solution is just like fixing the position, swap the Y and Z values.
On a 3×3 matrix this is slightly more confusing. What are the Y and Z values? Well, I will assume that you realise a 3×3 matrix is a 3×3 grid of numbers. To swap the Y and Z values, you must swap the second and third columns AND the second and third rows:
matrix33 rotation;
vector3 temp;
temp = rotation.column2;
rotation.column2 = rotation.column3;
rotation.column3 = temp;
temp = rotation.row2;
rotation.row2 = rotation.row3;
rotation.row3 = temp;
If this helps, please give me some feedback in the comments and let me know how it went.
mcro