WebGL第三十七课:三维向量的旋转之欧拉角描述

621 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

相比于上一篇文章说的三维向量的拉伸来说,其实旋转应用的更多。

如何表达三维向量的旋转

这里举一个例子,你要向别人描述一个东西的朝向的时候,你会怎么说呢?

  • 这东西面朝东
  • 这东西现在正对着墙角
  • 这东西倒了
  • 这东西歪了
  • 。。。。。。
  • 诸如此类

上面其实都是在描述一个东西的朝向问题。

在一个局限的有限的上下文环境下,上面的描述都可以很有效的告知对方一个东西的朝向信息。

但是,在一个更加空泛,精确的上下文环境下,我们就不能这么来描述了。

描述一个物体的位置

这里必须要事先定一个世界坐标轴,因为只有坐标轴定了,我们的坐标才能定。

坐标轴是三维直角坐标系,坐标轴定在哪里其实无所谓,这无非是改变了我们描述时候的坐标而已,对于身处这个世界中的物体而言,坐标是什么其实无所谓,两个物体之间的关系才有所谓。

为了方便,你可以这么定:以你的两眼中心为坐标原点,右手方向是X轴正方向,往上是Y轴正方向,往后是Z轴正方向。

我们来演练一下:

  • 你眼中的电脑此时此刻坐标大约是(0,0,30)(0,0,-30), 这是什么意思呢,就是说这个电脑在你的正前方,离你30cm。

  • 你屁股下的椅子此时此刻坐标大约是(0,30,0)(0,-30, 0),就是说,这个椅子在你眼睛正下方30cm的位置。

描述一个物体的朝向

问题来了,我们来描述一下,电脑的朝向问题:

你当然可以说,电脑现在正面对着你的眼睛。

但是上面的描述,无法用数字衡量,不适合计算机来计算。

所以我们来规定一下描述朝向的逻辑:

  • 一个物体有一个本原状态,这个状态是人为规定的,就是说这个物体不偏不倚的时候的状态

  • 比如说,眼前的电脑,你认为是本原状态,可以,那么就这么规定电脑的本原状态就是朝向Z轴正方向。

  • 此时,你右边的同事让你转一下屏幕,他要看一下你的屏幕,假设你转了45°角

  • 我们知道,此电脑实际上就是按Y轴正方向逆时针转了45°角

  • 好,此时,你的同事其实是站着的,你又把屏幕往上转了20°

  • 这就不好描述了,为什么,这个旋转是根据屏幕自己来的,并没有按照世界坐标系来走

啥意思,就是说,刚才两个旋转过程,不能说:

此句描述是错误的:先将屏幕按照世界坐标系的Y轴逆时针旋转45°,然后按照世界坐标系的X轴正方向顺时针旋转20°。

因为第二个旋转是按照屏幕自身的坐标系来说的。

那么怎么用世界坐标系的三个轴来描述上面旋转的最终状态呢?

答案就是:先将屏幕按照世界坐标系X轴正方向顺时针旋转20°,再按照世界坐标系的Y轴逆时针旋转45°。

上面的描述是对的,注意,我们只在乎最终的状态,不在乎中间过程

欧拉角描述

这就是欧拉角描述法: 先规定一个坐标轴(世界坐标系或者自身坐标系)的顺序,然后依次说明,物体是怎样按照这三个轴旋转的。

欧拉角描述,并没有硬性要求三个坐标轴的顺序,这个你可以自己规定。
不过一旦规定了,所有的物体都要遵从这个顺序,要不就乱套了。

这里不妨就规定 x轴 -> y轴 -> z轴 这个顺序。

我们将三次旋转的数值写成(x,y,z)(x,y,z),发现了没,可以用数字来精准描述了。

比方说,上面的例子就是: (20,45,0)(-20,45,0)

这里注意,我们一般将逆时针看成正的,顺时针看成负的。

你可以在大脑里演练一下这个过程,发现,确实这样描述,可以覆盖所有的情况。

欧拉角描述两种方法

  • 三次旋转如果都是按照世界坐标系来描述的话,那么称之为外旋:这种应用很少
  • 三次旋转如果都是按照自身坐标系来描述的话,那么称之为内旋:这种应用的多,比如说在很多游戏引擎中,都是这种。

欧拉角描述的劣势

这个东西有一个很重要的限制就是:顺序至关重要。

一定要严格按照这个顺序进行,才能得到你想要的结果。

比如说:

  • 初始状态:(0,0,0)(0,0,0)
  • 状态一:(10,20,30)(10,20,30)
  • 状态二:(15,20,30)(15,20,30)

从状态一变到状态二,看上去,只要按照X轴继续转5°就行了。

结果不是的,从状态一到状态二,必须:

  • 三个数值全部清空:(0,0,0)(0,0,0)
  • 然后 X Y Z 依次旋转得到最终数值:(15,20,30)(15,20,30)

为什么呢?上面就已经提到过,欧拉角描述法只在乎最终的状态,不在乎中间过程

也就是说,中间过程是无法进行猜测增量插值的。

其中增量这个,对于使用上面及其重要,假如你在开飞机,你想想,你的每一步都是基于现在的状态的。如果你认为

(10,20,30)(10,20,30) 变到 (15,20,30)(15,20,30) ,就是继续按照X轴转5°的话,你很可能出严重事故。

其中最严重的,就是万向锁,很可能你完全没法转动了。

万向锁此篇不谈,总之,不是因为欧拉角描述不行,是因为我们使用上,对于这种增量的需求很大。