INTRODUCTION
If you need to convert a vector/matrix from a coordinate system to another one, a change of basis matrix is what you need. The easiest example is a conversion between right-handend and left-handed coordinate systems.
It has been a while since I wrote something formally sound from the math point of view, so I hope this makes sense. It does makes sense to me at least, so its job as a personal reminder is done!
GENERAL CHANGE OF BASIS FORMULA
M_B = CM_AC^{-1}Where:
- M_A is a matrix written based on your Source coordinate system, A
- M_B is a matrix which will be valid in your Destination coordinate system, B
- C is the change of basis transformation matrix from A to B
EXAMPLE:
This example describes a change of basis we had to perform to convert 3D rotations from an OpenCV Augmented Reality tracking frame (right-handed, Z forward) to Unreal Engine (left-handed, X forward).
Let’s consider a right-handed coordinate system A with:
- +Z_A in the forward direction
- +X_A in the right direction
- +Y_A in the down direction
And a left-handed coordinate system B with:
- +X_B in the forward direction
- +Y_B in the right direction
- +Z_B in the up direction
In our case, A : OpenCV, B: Unreal.
Using different coordinate systems is somewhat similar to speaking different languages: people speaking B and people speaking A need some arrangement in order to communicate with each other. That arrangement is the C change of basis matrix.
How do we create C? Coordinates system can be thought as consisting of forward, right/left up/down directions.
What we need to do is understand the different ways of A and B to describe those directions.
Going from A to B?
Looking at A from B‘s point of view we could say that:
- +X_A corresponds to +Y_B
- +Y_A corresponds to -Z_B
- +Z_A corresponds to +X_B
This translates in the following matrix (columns “represent” X, Y, Z):
C_{AB} = \begin{bmatrix} 0 & 0 & 1\\ 1 & 0 & 0\\ 0 & -1 & 0 \end{bmatrix}
Now that we know this, we could for example go from a rotation matrix R_A to R_B by doing the following:
R_B = C_{AB}R_AC_{AB}^{-1}
Going from B to A?
Looking at B from A ‘s point of view we could say that:
- +X_B corresponds to +Z_A
- +Y_B corresponds to +X_A
- +Z_B corresponds to -Y_A
C_{BA} = \begin{bmatrix} 0 & 1 & 0\\ 0 & 0 & -1\\ 1 & 0 & 0 \end{bmatrix}
We should obtain the same result by inverting C_{AB}
Side note: transposing and inverting these matrices is the same, since they are orthogonal.