Continued from the previous entry.
Before digging into the Quaternion implementation, I first inspected the retail version of EMI again to verify its approach to applying the rotation angles.
In the scene ‘mig’, I moved Guybrush to the position (1,0,-7) so it was easy to see the result of rotation. Next, I set the rotation to (0,0,0), resulting in the following, which represents our origin pose:
To make sure that nothing else is interfering, I’ll set Guybrush back to this rotation before each operation. Next, I set Guybrush to 90 degrees for each of the rotation angles to determine the name for each principle axis:
- guybrush:setrot(90,0,0) – Pitch (rotation in the Y-Axis)
- guybrush:setrot(0,90,0) – Yaw (rotation in the Z-Axis)
- guybrush:setrot(0,0,90) – Roll (rotation in the X-Axis)
We now know which axis is which in the setrot() method. Using this information, we’ll determine what order the rotations are applied by combining the principle rotations:
Which is produced by the following rotations:
- guybrush:setrot(45,45,0)
- guybrush:setrot(0,45,45)
- guybrush:setrot(0,45,45)
- guybrush:setrot(45,45,45)
From this, we can say that the setrot() method’s arguments are definitely Pitch, Yaw, Roll, in that order. From the combined rotations, it appears that the rotations are applied in the order ZXY (by axis). With this information, I can ensure that the Quaternion implementation is using the correct rotation order.