08 - 矩阵,欧拉角和四元数的转换
在这篇文章中,我们简单了解一下表示3D旋转的矩阵、欧拉角以及四元数之间是如何互相转换的。
部分内容可能有计算错误,如果有错希望大家可以指出~
转换为矩阵
欧拉角
欧拉角即绕轴旋转,但轴是有不同定义的。例如对象空间(Object Space)的轴是轴,直立空间(Upright Space, 原点位于物体中心,三个轴平行于世界坐标轴)的轴也是轴。因此,还得分情况讨论。
在模型(Model)变换阶段,物体由对象空间变换到世界空间,这里就需要从对象空间到直立空间的矩阵了:
四元数
可以通过扩展四元数乘法
定义四元数
那么它转换的矩阵如下(右手系,变成左手系转置一下就行)
转换为欧拉角
矩阵
可以直接从旋转矩阵来求解三个欧拉角,需要具体情况具体分析。例如下面的矩阵是左手坐标系中混合好的旋转矩阵:
:先求 ,发现 , ,那么有 然后就能用C/C++提供的atan2(y, x)
来求出 了,这个函数返回以弧度表示的 y/x 的反正切 因此有 这里利用 y/x 的特性把 约分了, 是正的,所以能约。类似有
: 此时 ,说明 发生了万向锁。这里令 ,然后化简上面的大矩阵: 然后就能求 了:
将矩阵转换为欧拉角总结如下:
四元数
可以对 “欧拉角->四元数”中得出的的结论进行逆向工程;也可以先把四元数转换为矩阵,然后再把得到的矩阵转换为欧拉角。这里康康第二种思路。
把矩阵的值代入上边的结论中,然后进行化简便能得到:
转换为四元数
矩阵
可以对由四元数转换的矩阵进行逆向工程。检查对角线元素的总和,即矩阵的迹(Trace),有:
因此还得寻找其他方法计算剩余的3个分量——检查对角矩阵元素的总和与差值:
欧拉角
和欧拉角转换矩阵一样,也要分两种情况讨论:
从对象空间到直立空间的四元数:
由于直立空间和世界空间的坐标轴平行,有
它们分别按x,y,z轴旋转。接下来按ZYX顺序进行旋转的组合,得到四元数:对 象 直 立 从直立空间到对象空间的四元数:
只需求
即可,因为单位四元数的逆和共轭相同:对 象 直 立 直 立 对 象 对 象 直 立
参考资料
3D数学基础 图形和游戏开发(第2版)
右手系转左手系、旋转矩阵转四元数、四元数的两种表达(Hamilton/JPL)_左手系旋转矩阵-CSDN博客
四元数.pdf