一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
相比于上一篇文章说的三维向量的拉伸来说,其实旋转应用的更多。
如何表达三维向量的旋转
这里举一个例子,你要向别人描述一个东西的朝向的时候,你会怎么说呢?
- 这东西面朝东
- 这东西现在正对着墙角
- 这东西倒了
- 这东西歪了
- 。。。。。。
- 诸如此类
上面其实都是在描述一个东西的朝向问题。
在一个局限的有限的上下文环境下,上面的描述都可以很有效的告知对方一个东西的朝向信息。
但是,在一个更加空泛,精确的上下文环境下,我们就不能这么来描述了。
描述一个物体的位置
这里必须要事先定一个世界坐标轴,因为只有坐标轴定了,我们的坐标才能定。
坐标轴是三维直角坐标系,坐标轴定在哪里其实无所谓,这无非是改变了我们描述时候的坐标而已,对于身处这个世界中的物体而言,坐标是什么其实无所谓,两个物体之间的关系才有所谓。
为了方便,你可以这么定:以你的两眼中心为坐标原点,右手方向是X轴正方向,往上是Y轴正方向,往后是Z轴正方向。
我们来演练一下:
-
你眼中的电脑此时此刻坐标大约是, 这是什么意思呢,就是说这个电脑在你的正前方,离你30cm。
-
你屁股下的椅子此时此刻坐标大约是,就是说,这个椅子在你眼睛正下方30cm的位置。
描述一个物体的朝向
问题来了,我们来描述一下,电脑的朝向问题:
你当然可以说,电脑现在正面对着你的眼睛。
但是上面的描述,无法用数字衡量,不适合计算机来计算。
所以我们来规定一下描述朝向的逻辑:
-
一个物体有一个本原状态,这个状态是人为规定的,就是说这个物体不偏不倚的时候的状态
-
比如说,眼前的电脑,你认为是本原状态,可以,那么就这么规定电脑的本原状态就是朝向Z轴正方向。
-
此时,你右边的同事让你转一下屏幕,他要看一下你的屏幕,假设你转了45°角
-
我们知道,此电脑实际上就是按Y轴正方向逆时针转了45°角
-
好,此时,你的同事其实是站着的,你又把屏幕往上转了20°
-
这就不好描述了,为什么,这个旋转是根据屏幕自己来的,并没有按照世界坐标系来走
啥意思,就是说,刚才两个旋转过程,不能说:
此句描述是错误的:先将屏幕按照世界坐标系的Y轴逆时针旋转45°,然后按照世界坐标系的X轴正方向顺时针旋转20°。
因为第二个旋转是按照屏幕自身的坐标系来说的。
那么怎么用世界坐标系的三个轴来描述上面旋转的最终状态呢?
答案就是:先将屏幕按照世界坐标系X轴正方向顺时针旋转20°,再按照世界坐标系的Y轴逆时针旋转45°。
上面的描述是对的,注意,我们只在乎最终的状态,不在乎中间过程。
欧拉角描述
这就是欧拉角描述法: 先规定一个坐标轴(世界坐标系或者自身坐标系)的顺序,然后依次说明,物体是怎样按照这三个轴旋转的。
欧拉角描述,并没有硬性要求三个坐标轴的顺序,这个你可以自己规定。
不过一旦规定了,所有的物体都要遵从这个顺序,要不就乱套了。
这里不妨就规定 x轴 -> y轴 -> z轴 这个顺序。
我们将三次旋转的数值写成,发现了没,可以用数字来精准描述了。
比方说,上面的例子就是: 。
这里注意,我们一般将逆时针看成正的,顺时针看成负的。
你可以在大脑里演练一下这个过程,发现,确实这样描述,可以覆盖所有的情况。
欧拉角描述两种方法
- 三次旋转如果都是按照
世界坐标系来描述的话,那么称之为外旋:这种应用很少 - 三次旋转如果都是按照
自身坐标系来描述的话,那么称之为内旋:这种应用的多,比如说在很多游戏引擎中,都是这种。
欧拉角描述的劣势
这个东西有一个很重要的限制就是:顺序至关重要。
一定要严格按照这个顺序进行,才能得到你想要的结果。
比如说:
- 初始状态:
- 状态一:
- 状态二:
从状态一变到状态二,看上去,只要按照X轴继续转5°就行了。
结果不是的,从状态一到状态二,必须:
- 三个数值全部清空:
- 然后 X Y Z 依次旋转得到最终数值:
为什么呢?上面就已经提到过,欧拉角描述法只在乎最终的状态,不在乎中间过程。
也就是说,中间过程是无法进行猜测、增量、插值的。
其中增量这个,对于使用上面及其重要,假如你在开飞机,你想想,你的每一步都是基于现在的状态的。如果你认为
变到 ,就是继续按照X轴转5°的话,你很可能出严重事故。
其中最严重的,就是万向锁,很可能你完全没法转动了。
万向锁此篇不谈,总之,不是因为欧拉角描述不行,是因为我们使用上,对于这种增量的需求很大。