【原文来自:http://blog.youkuaiyun.com/zhang11wu4/article/details/47754035】
欧拉角Written by Paul BourkeJune 2000 通用旋转矩阵中欧拉角的萃取 |
![]() |
在不同坐标系的转换过程中经常要用到坐标轴的旋转。在这里用到的是右手笛卡尔空间直角坐标系(y轴指向前方,x轴指向右方,z轴指向上方),为了方便描述关于不同数轴的旋转,我们将使用不同的术语。 我们约定关于z轴的旋转叫做扭转(direction),关于y轴的旋转叫做翻转 (roll) ,关于x轴的旋转叫做推转(pitch) 。进一步,我们约定正旋转为顺时针(从数轴正方向看原点),负旋转为逆时针。更多的约定读者可以自行处理。
注意下面给出的三个旋转矩阵看起来并不是对称的 关于x轴旋转tx 度(或者说推转tx 度):
![]() |
| ![]() | = | ![]() |
| ![]() | ![]() |
| ![]() |
关于y轴旋转 ty 度(或者说翻转 ty 度)
![]() |
| ![]() | = | ![]() |
| ![]() | ![]() |
| ![]() |
关于z轴旋转 tz 度(或者说扭转 tz 度)
![]() |
| ![]() | = | ![]() |
| ![]() | ![]() |
| ![]() |
在使用这些转换矩阵是,转换矩阵之间的次序是非常重要的。我们把以上的旋转矩阵分别叫做Rx(t), Ry(t), 和 Rz(t),当他们以次序一:Rz(t) Rx(t) Ry(t)执行旋转,或者以次序二 Rx(t) Ry(t) Rz(t)执行旋转,将会得到不同的结果。以下将会讨论其中一种矩阵的旋转次序,同理可得剩下的矩阵次序组合,这些将留个读者自行推导。我们要讨论的次序是:先翻转(关于y轴旋转),在推转(关于x轴旋转),最后扭转(关于z轴旋转)。这个也可能是在游戏或者飞行模拟中最常用的次序。
![]() |
| ![]() | = Rz(t) Rx(t) Ry(t) | ![]() |
| ![]() |
写成单个矩阵A(矩阵结合后)就是:
![]() |
| ![]() |
另外一个要求是:给定一个新的坐标系,如何去推导相对应的三个欧拉角。如果新坐标系的正交向量(正交向量是指所有向量之间两两垂直)是X,Y,Z 那么从从坐标系 (1,0,0), (0,1,0), (0,0,1) 到新坐标系的转换矩阵B就是:
![]() |
| ![]() |
所以:
又有:
所以:
最后有:
所以:
注意:
-
以上用到的函数 atan2() 需要两个参数来计算正确的象限结果。它和代数的tan()函数有所不同。
-
当赋予指定的值给以上 tx, ty,和 tz 时,存在多个不同的解。也就是说,对于同一个坐标系转换,存在多个不同的欧拉角组合解。