3D数学基础:刚体旋转的实质

对于入门3D数学的同学,旋转是绕不过去坎儿。清楚了解刚体旋转的实质,不被各种旋转矩阵、旋转顺序绕晕是非常必要的。

此处,先给出旋转的实质,在下面的讲解中去理解这个实质。
旋转刚体其实是旋转刚体的物体坐标系

一、刚体及刚体上的物体坐标系

刚体是形状和大小不发生变化的物体,骨骼可以视为是刚体,一段不能弯折和拉伸的铁柱也是刚体,一个陶瓷杯也是一个刚体。对于每一个刚体都有一个物体坐标系。物体坐标系的定义可以参考这篇博客。当然每个刚体上的物体坐标系是人为自行定义的,可以是左手坐标系,也可以是右手坐标系,坐标原点和坐标轴朝向也是自行确定的。最终得到的结果就是,每一个刚体都有一个对应的物体坐标系。

以下是一些刚体及其物体坐标系的展示。
这里写图片描述 这里写图片描述
规则的立方体和球体如上图所示,在U3D中定义物体坐标系位于物体的中心点。下面看稍微复杂的人物场景。
这里写图片描述
左手小臂骨骼,我们发现该骨骼对应的物体坐标系原点位于肘关节。并且骨骼与物体坐标系的相对位置关系是骨骼沿Y轴方向。
这里写图片描述
左手掌骨,我们发现左手手掌骨的物体坐标系位于腕关节。并且骨骼与物体坐标系的相对位置关系是骨骼沿Y轴方向。

二、旋转及其对应的矩阵

(一)关于旋转的概念解析

在说明旋转时,有几组概念是不得不去明确的。

1.绕物体坐标系旋转/绕惯性坐标系旋转/绕局部坐标系(父节点物体坐标系)旋转

绕物体坐标系旋转(体现在Unity3D当中就是Space.Self),顾名思义就是旋转时候的参考系是自身的物体坐标系。

你可以疑惑了,刚刚说刚体旋转的实质是旋转刚体对应的物体坐标系。那么如何以自身的物体坐标系为参照的同时,还去旋转自身的物体坐标系呢?具体来说,是以旋转的前一状态的自身物体坐标系为参考系,去旋转自身的物体坐标系。

② 绕惯性坐标系旋转,更多时候会说绕世界坐标系旋转。在文章中提到惯性坐标系和世界坐标系的轴朝向完全相同,而坐标原点不同,惯性坐标系的坐标原点与物体坐标系的原点重合。

所以所谓的绕世界坐标系旋转其实就是绕惯性坐标系旋转。所以该种情形下是:以惯性坐标系为参考系,去旋转物体坐标系

③绕局部坐标系旋转,局部坐标系的定义很多地方给的不是很明确,可能存在歧义。此处的局部坐标系特指父物体的物体坐标系。如果没有父节点,那么也就没有这一说了。在存在父物体的情形下,将父物体的物体坐标系平移到原点与自身物体坐标系原点重合,以平移之后的父物体坐标系为参考系,旋转自身的物体坐标系。

此处讲一下,为什么要平移! 我们发现世界坐标系要平移到与物体自身的坐标系原点重合(也就是惯性坐标系);父物体的物体坐标系也要平移到与自身物体坐标系的原点重合。难道不平移就不能旋转吗?,欲知此事,必须了解欧拉角的定义。


知识点补充:欧拉角的定义

欧拉角是在空间中,描述从一个用于表示某个固定的参考系的、已知的方向,经过一系列基本旋转得到、新的代表另一个参考系的方向的方式。因为只有旋转,所以原点位置并没有发生变化。

这个方向可以被想成从一个初始的方向,旋转到其确切位置的方向。如下图中描述,原始的参考系的坐标轴被定义为x,y,z,旋转后的坐标系的坐标轴被定义为X,Y,Z。
这里写图片描述
欧拉角是用三个旋转角度 α,β,γ 来标示旋转的。如图,图中蓝色坐标系是起始的坐标系,红色的坐标系是最后旋转完成的坐标系。整个旋转分为三个步骤:

  • 将坐标系绕 z 轴旋转 α 角
  • 将旋转后坐标系绕自己本身的 x 轴(也就是图中的 N 轴)旋转 β 角
  • 将旋转后坐标系绕自己本身的 z 轴旋转 γ 角

由于绕不同的轴旋转所得到的欧拉角是不同的,所以欧拉角在使用的时候必须要先指明旋转的顺序,这里使用的是“zxz”的顺序。

在几何和物理中,被旋转的坐标系通常被想象成严格附着在一个刚体上。因此,它被称为一个“本地”坐标系,这也意味着它既代表这个刚体的位置,也代表这个刚体的方向。

本段关于欧拉角定义的内容参考博客1博客2维基百科

我们发现,要通过对应的矩阵进行旋转的计算,就需要满足原点重合的要求。在原点不重合的情况下进行旋转当然也是可以的,只是不再符合这种简单的矩阵对应的线性变换,出现了平移变换。

所以要通过旋转矩阵进行旋转变化, 默认的前提就是参考系和物体坐标系的原点重合。


2.静态欧拉角/动态欧拉角

关于静态欧拉角与动态欧拉角的定义摘自文章,该文章是网上错综乱杂信息中定义较为准确的。

从参考坐标系上区分,将欧拉角分为静态和动态,其中静态欧拉角以绝对坐标系为参考,一般用小写的x-y-z来表示静态坐标系;动态欧拉角以刚体自身的物体坐标系为参考,一般用大写的X-Y-Z表示。

个人理解:静态欧拉角就是与固定轴之间的角度,也就是说自身发生旋转的时候该参考系是不会发生变化的,参考系的轴依旧是固定的。而动态欧拉角中,参考系的轴是随着物体的旋转而发生变化的,物体每旋转一次,其参考系的轴也发生一次变化。

结合第1点,我们可以看出绕自身物体坐标系属于动态欧拉角,绕惯性坐标系和绕局部坐标系都属于静态欧拉角。

(二)旋转对应的矩阵

此章节将简单推导旋转矩阵,通过这样的推导过程去反正前面提到的“所以要通过旋转矩阵进行旋转变化,默认的前提就是参考系和物体坐标系的原点重合”

1.二维坐标系下的旋转

例如点P(Xa, Ya),当坐标轴(黑色)逆时针旋转 θ度之后,P点在新坐标系(红色)中的坐标是多少?
这里写图片描述
下面的主要工作主要是通过三角形全等和相似的数学方法,求新坐标系(红色)中P点的坐标值。具体的计算过程可以看下面几个图。
这里写图片描述
这里写图片描述
这里写图片描述
通过上面一系列的数学方法,可以求出P在新坐标系中的坐标为(Xa*cos θ+ Ya*sin θ, -Xa*sin θ+Ya*cos θ)

2.三维坐标系下的旋转

注意:这节中的旋转以右手坐标系为参考系,如果是左手系情况与之不同
三维坐标系下的旋转其实就是来源于二维坐标系的旋转,绕某一个轴旋转,就相当于另外两个轴在平面内旋转(即与二维坐标系下的相同)。下面分别展示绕X旋转、绕Y轴旋转、绕Z轴旋转。
参考资料1:http://www.javashuo.com/article/p-xebwzwls-br.html
参考资料2:https://blog.csdn.net/csxiaoshui/article/details/65446125
参考资料3:https://zh.wikipedia.org/wiki/%E6%97%8B%E8%BD%AC%E7%9F%A9%E9%98%B5

2.1绕X轴进行旋转

这里写图片描述
在三维场景中,当一个点P(x,y,z)绕x轴旋转θ角得到点P’(x’,y’,z’)。由于是绕x轴进行的旋转,因此x坐标保持不变,y和z组成的yoz(o是坐标原点)平面上进行的是一个二维的旋转,可以参考上图(y轴类似于二维旋转中的x轴,z轴类似于二维旋转中的y轴),于是有:
x′=x
y′=ycosθ−zsinθ
z′=ysinθ+zcosθ
写成(4x4)矩阵的形式:
这里写图片描述
那么对应的旋转矩阵即为:
这里写图片描述

2.2绕Y轴进行旋转

这里写图片描述
绕Y轴的旋转和绕X轴的旋转类似,Y坐标保持不变,除Y轴之外,ZOX组成的平面进行一次二维的旋转(Z轴类似于二维旋转的X轴,X轴类似于二维旋转中的Y轴,注意这里是ZOX,而不是XOZ,观察上图中右手系的图片可以很容易了解到这一点),同样有:
x′=zsinθ+xcosθ
y′=y
z′=zcosθ−xsinθ
写成(4x4)矩阵的形式:
这里写图片描述
那么对应的旋转矩阵即为:
这里写图片描述

2.3绕Z轴进行旋转

这里写图片描述
与上面类似,绕Z轴旋转,Z坐标保持不变,xoy组成的平面内正好进行一次二维旋转(和上面讨论二维旋转的情况完全一样)
x′=xcosθ−ysinθ
y′=xsinθ+ycosθ
z′=z
写成(4x4)矩阵的形式:
这里写图片描述
那么对应的旋转矩阵即为:
这里写图片描述