【Unity编程】欧拉角与万向节死锁(图文版) (2)

例如以下图:

偏航平衡

终于,在船体发生Pitch、Yaw、Roll的情况下,陀螺仪都能够通过自身的调节,而让转子和旋转轴保持平衡。

陀螺仪中的万向节死锁

如今看起来,这个陀螺仪一切正常,在船体发生随意方向摇晃都能够通过自身调节来应对。

然而,真的是这样吗?

假如,船体发生了剧烈的变化,此时船首仰起了90度(这是要翻船的节奏。。。。)。此时的陀螺仪调节状态例如以下图:

死锁開始

此时,船体再次发生转动,沿着当前世界坐标的+Z轴(蓝色轴,应该正指向船底)进行转动,那么来看看发生了什么情况。

死锁的陀螺仪

如今,转子不平衡了,陀螺仪的三板斧不起作用了。它失去了自身的调节能力。那么这是为什么呢?
之前陀螺仪之所以能通过自身调节。保持平衡,是因为存在能够相对旋转的连接头。在这样的情况下,已经不存在能够相对旋转的连接头了。
那么连接头呢?去了哪里?显然,它还是在那里,仅仅只是是。连接头能够旋转的相对方向不是如今须要的按着+Z轴方向。从上图中,我们清楚地看到:

红色连接头:能够给予一个相对俯仰的***度。

绿色连接头:能够给予一个相对偏航的***度。

蓝色连接头:能够给予一个相对偏航的***度。

没错,三个连接头,提供的***度仅仅相应了俯仰和偏航两个***度,桶滚***度丢失了。这就是陀螺仪上的“万向节死锁”问题。

用小程序来重现万向节死锁问题

首先,预设一下接下来的欧拉角变化顺序。见下图:

预设欧拉旋转

上图中,红色框内的部分的列表,记录了接下来欧拉角的增长变化过程。即它会从(0,0,0)变化到(90,0,0)。再变化到(90,90,0)。再变化到(90,180,0),再变化到(90,180,90)。再变化到(90,180,180)。下图是变化的过程演示。

YZ轴死锁

如今能够看到:
- 当先运行X轴旋转90度,此时在运行Pitch(俯仰)变化。
- 再在Y轴进行变化0-180度,此时在运行相对自身的Roll(桶滚)变化。
- 再在Z轴进行变化0-180度,此时仍在运行相对自身的Roll(桶滚)变化。

这里所说的俯仰、桶滚、偏航都是相对自己局部坐标系的。这与上述的陀螺仪中出现的问题是一样的,万向节死锁。

也就是虽然欧拉角在XYZ三个轴向进行进动(持续增长或者降低),可是影响终于的结果,仅仅相应了两个轴向。

死锁的过程解析

在《Unity中欧拉旋转》一文中我曾提到,是欧拉角顺规和轴向的定义方式,造就了“万向节死锁”问题的自然形成。通过上述的样例,这里作个详解。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjgzz.html