本文讲解的欧拉角旋转顺序为x,y,z。对应矩阵为[z][y][x]。当y为90°时会引起死锁。
欧拉角插值问题分析。
答:事实1 . 单个欧拉角能够正确表示旋转无论死锁还是不死锁。但是当两个欧拉角插值的时候,由于死锁的存在,导致插值后的欧拉角表示的旋转与原始的两个欧拉角表示的旋转差异很大。
事实2. 一种旋转可以用多种欧拉角表示。例如,x角度为100,与x角度为460其实是一样的。X角度为-179其实和+179很接近。更有甚者,当出现死锁的时候,同一种旋转有无数种欧拉角表示。具体方法参照文章Computing Euler angles from a rotation matrix
事实4. 当欧拉角接近死锁的时候会引起抖动。例如48.5557 82.8384 48.0888以及 141.922 81.0177 142.027.这两个欧拉角其实非常相近,但是除了y角之外其余两个坐标差异比较大。因为两个欧拉角的y旋转角度都接近90°了,越靠近90°,y轴的微小变动就对xz两个角度影响非常大,所以进行插值的时候直接进行插值会引起抖动。例如上面的插值结果可能为5.23894 90.9103 5.05811,这个结果与上面两个原始角度所表达的方向都不一样。
欧拉角插值解决方法
答:1. 将需要插值的两个欧拉角转化成矩阵,再通过矩阵分解出所有可能的欧拉角,找出两个比较相近的欧拉角进行插值。用此种方法可能引起抖动,如事实4中所示,当y轴的角度靠近90°的时候,就算使用矩阵分解找出两个最为相近的欧拉角,这两个找出来的欧拉角还是会差异很大。因为y轴的小变化就会引起xz角度的大幅变化。
2.真正的解决方法。
设有两个欧拉角A,B进行插值。A,B两角表示的旋转是非常相似的,但是其角度数值差异比较大。其中A.y以及B.y接近90°。
步骤一:将A,B做同一个旋转,例如将A,B都绕Y轴正方向旋转45°。务必将旋转后A.y和B.y的角度保持在70°以内。
步骤二:将旋转后的A,B转换成旋转矩阵。
步骤三:将矩阵A和矩阵B分解出各种可能的欧拉角。
步骤四:找出A矩阵和B矩阵分解出来的所有的欧拉角中最为相近的两个欧拉角。
步骤五:对这两个欧拉角进行插值得到欧拉角C。
步骤六:将C绕y轴正方向旋转-45°。