对于入门3D数学的同学,旋转是绕不过去坎儿。清楚了解刚体旋转的实质,不被各种旋转矩阵、旋转顺序绕晕是非常必要的。
此处,先给出旋转的实质,在下面的讲解中去理解这个实质。
旋转刚体其实是旋转刚体的物体坐标系
文章目录
第一章、刚体及物体坐标系的概念
刚体是形状和大小不发生变化的物体,骨骼可以视为是刚体,一段不能弯折和拉伸的铁柱也是刚体,一个陶瓷杯也是一个刚体。对于每一个刚体都有一个物体坐标系。物体坐标系的定义可以参考这篇博客。当然每个刚体上的物体坐标系是人为自行定义的,可以是左手坐标系,也可以是右手坐标系,坐标原点和坐标轴朝向也是自行确定的。最终得到的结果就是,每一个刚体都有一个对应的物体坐标系。
以下是一些刚体及其物体坐标系的展示。
规则的立方体和球体如上图所示,在U3D中定义物体坐标系位于物体的中心点。下面看稍微复杂的人物场景。
左手小臂骨骼,我们发现该骨骼对应的物体坐标系原点位于肘关节。并且骨骼与物体坐标系的相对位置关系是骨骼沿Y轴方向。
左手掌骨,我们发现左手手掌骨的物体坐标系位于腕关节。并且骨骼与物体坐标系的相对位置关系是骨骼沿Y轴方向。
第二章、旋转及其对应的矩阵
2.1 关于旋转的概念解析
在说明旋转时,有几组概念是不得不去明确的。
2.1.1 多种的绕坐标系旋转形式
绕坐标系旋转因为坐标系的多样性,也存在多种,分别是:绕物体坐标系旋转;绕惯性坐标系旋转;绕局部坐标系(父节点物体坐标系)旋转。下面分别进行说明,避免混淆:
①绕物体坐标系旋转(体现在Unity3D当中就是Space.Self),顾名思义就是旋转时候的参考系是自身的物体坐标系。
你可能疑惑了,刚刚说刚体旋转的实质是旋转刚体对应的物体坐标系。那么如何以自身的物体坐标系为参照的同时,还去旋转自身的物体坐标系呢?具体来说,是以旋转的前一状态的自身物体坐标系为参考系,去旋转自身的物体坐标系。
② 绕惯性坐标系旋转,更多时候会说绕世界坐标系旋转。在文章中提到惯性坐标系和世界坐标系的轴朝向完全相同,而坐标原点不同,惯性坐标系的坐标原点与物体坐标系的原点重合。
所以所谓的绕世界坐标系旋转其实就是绕惯性坐标系旋转。所以该种情形下是:以惯性坐标系为参考系,去旋转物体坐标系。
③绕局部坐标系旋转,局部坐标系的定义很多地方给的不是很明确,可能存在歧义。此处的局部坐标系特指父物体的物体坐标系。如果没有父节点,那么也就没有这一说了。在存在父物体的情形下,将父物体的物体坐标系平移到原点与自身物体坐标系原点重合,以平移之后的父物体坐标系为参考系,旋转自身的物体坐标系。
此处讲一下,为什么要平移! 我们发现世界坐标系要平移到与物体自身的坐标系原点重合(也就是惯性坐标系);父物体的物体坐标系也要平移到与自身物体坐标系的原点重合。难道不平移就不能旋转吗?,欲知此事,必须了解欧拉角的定义。
2.1.2 欧拉角的定义
欧拉角是在空间中,描述从一个用于表示某个固定的参考系的、已知的方向,经过一系列基本旋转得到、新的代表另一个参考系的方向的方式。因为只有旋转,所以原点位置并没有发生变化。
这个方向可以被想成从一个初始的方向,旋转到其确切位置的方向。如下图中描述,原始的参考系的坐标轴被定义为x,y,z,旋转后的坐标系的坐标轴被定义为X,Y,Z。
欧拉角是用三个旋转角度 α,β,γ 来标示旋转的。如图,图中蓝色坐标系是起始的坐标系,红色的坐标系是最后旋转完成的坐标系。整个旋转分为三个步骤:
- 将坐标系绕 z 轴旋转 α 角
- 将旋转后坐标系绕自己本身的 x 轴(也就是图中的 N 轴)旋转 β 角
- 将旋转后坐标系绕自己本身的 z 轴旋转 γ 角
由于绕不同的轴旋转所得到的欧拉角是不同的,所以欧拉角在使用的时候必须要先指明旋转的顺序,这里使用的是“zxz”的顺序。
在几何和物理中,被旋转的坐标系通常被想象成严格附着在一个刚体上。因此,它被称为一个“本地”坐标系,这也意味着它既代表这个刚体的位置,也代表这个刚体的方向。
我们发现,要通过对应的矩阵进行旋转的计算,就需要满足原点重合的要求。在原点不重合的情况下进行旋转当然也是可以的,只是不再符合这种简单的矩阵对应的线性变换,出现了平移变换。
所以要通过旋转矩阵进行旋转变化, 默认的前提就是参考系和物体坐标系的原点重合。
2.1.3 静态欧拉角/动态欧拉角
关于静态欧拉角与动态欧拉角的定义摘自文章,该文章是网上错综乱杂信息中定义较为准确的。
从参考坐标系上区分,将欧拉角分为静态和动态,其中静态欧拉角以绝对坐标系为参考,一般用小写的x-y-z来表示静态坐标系;动态欧拉角以刚体自身的物体坐标系为参考,一般用大写的X-Y-Z表示。
个人理解:静态欧拉角就是与固定轴之间的角度,也就是说自身发生旋转的时候该参考系是不会发生变化的,参考系的轴依旧是固定的。而动态欧拉角中,参考系的轴是随着物体的旋转而发生变化的,物体每旋转一次,其参考系的轴也发生一次变化。
结合来看,我们可以看出绕自身物体坐标系属于动态欧拉角,绕惯性坐标系和绕局部坐标系都属于静态欧拉角。
2.2 旋转对应的矩阵
在了解了旋转的基本情况,以及对应的欧拉角之后,此章节将简单推导旋转矩阵,通过这样的推导过程去反证前面提到的“所以要通过旋转矩阵进行旋转变化,默认的前提就是参考系和物体坐标系的原点重合”
。
1.二维坐标系下的旋转
例如点P(Xa, Ya),当坐标轴(黑色)逆时针旋转 θ度之后,P点在新坐标系(红色)中的坐标是多少?
下面的主要工作主要是通过三角形全等和相似的数学方法,求新坐标系(红色)中P点的坐标值。具体的计算过程可以看下面几个图。
通过上面一系列的数学方法,可以求出P在新坐标系中的坐标为(Xacos θ+ Yasin θ, -Xasin θ+Yacos θ)
2.三维坐标系下的旋转
注意:这节中的旋转以右手坐标系为参考系,如果是左手系情况与之不同
三维坐标系下的旋转其实就是来源于二维坐标系的旋转,绕某一个轴旋转,就相当于另外两个轴在平面内旋转(即与二维坐标系下的相同)。下面分别展示绕X旋转、绕Y轴旋转、绕Z轴旋转。
参考资料1:https://www.cnblogs.com/meteoric_cry/p/7987548.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)矩阵的形式:
那么对应的旋转矩阵即为: