欧拉角的万向节死锁问题
在学习《3D数学基础:图形与游戏开发》时,又接触到欧拉角的万向节死锁的概念,仔细思考发现自己没太明白。查了很多博客,感觉都没说到点子上,不懂的还是不懂。
下面说一下自己的理解,有不对的地方请指正。
首先,动态欧拉角才会发生万向锁(即绕物体坐标系的三个轴旋转,在世界坐标系下,旋转轴是跟着物体的旋转而动态变化的),下面说的欧拉角都是指动态欧拉角。
第二,欧拉角的万向锁并不是“锁了之后就有一个方向不能转了”,而是指定旋转角度的时候丢失了自由度(只能沿两个轴进行旋转)。看到很多博客拿轮船上的三个转子来解释,让我开始理解成了遇到万向锁之后,旋转轴锁死,物体不能任意转了。其实只是本次旋转丢失了自由度,接下来选择合适的欧拉角还是能旋转到任意方位。
欧拉角的三个轴的旋转顺序是确定的。当指定第二个旋转轴的旋转角度为90度时,在世界坐标系下观察这个旋转过程,会发现在实际旋转过程中,第一个旋转轴和第二个旋转轴正交,第三个旋转轴和第二个旋转轴正交,但第一个旋转轴和第三个旋转轴是重合的。(旋转轴根据前一个轴的旋转进行旋转之后,物体再绕着这个旋转轴旋转,因此并不能保证世界坐标系下旋转轴正交)。
实际应用中会遇到什么问题
欧拉角有别名问题,即不同的欧拉角表示同一个方位,不同方位之间有不同的方式进行旋转。
在一些应用中,如角色动画、摄像机自动控制,需要用到插值技术,根据关键帧的方位插值计算中间帧的方位角或旋转过程,这个时候别名问题就会造成插值的困难。
1.角度差很大,这是因为角度有周期性。可以通过限制欧拉角的范围来解决(将角度限制在-180°到+180°很简单,但将第二个旋转轴pitch的值限制在-90°到+90°之间就需要一定技巧)。
2.如果将角度限制在-180°到+180°,角度的变化方向也会引起插值问题。例如从物体绕某个轴从170°旋转到190°,而190°被限制到(-180°,+180°)后变成-170°。此时对中间1帧进行插值,170°旋转到190°是{170,180,190},但170°到-170°会变成{170,0,-170}。两种插值结果会导致物体从两个不同的方向旋转。
解决方法是将用于插值的角度之差限制在(-180°,+180°)范围内。
3.插值时碰到万向锁,即插值结果的第二个旋转轴的旋转角为+90°或-90°,通常不能旋转到正确的位置,会导致抖动、路径错误等现象,仅用欧拉角表示旋转无法解决。暂时没有想到一个很好的角度作为例子,以后碰到再补充。
参考:
《3D数学基础:图形与游戏开发》
https://blog.csdn.net/huazai434/article/details/6458257