MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

本文对应 6.837 的 Animation III 这一节课,主要介绍与动画有关的一些小话题,包括质点模型以外的一些动力学模拟、前向及后向运动学、旋转的表达与插值。

其他的动力学模型

刚体动力学

46 1024x735 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

刚体的动力学可以用粒子系统中的约束来模拟,而这种方法效率低下。另一种方法将刚体各处的受力计算成在刚体重心的共点力和扭矩,这样就可以得到刚体的净受力及净扭矩,再根据对应的物理规律求出质点的运动和物体的旋转,便可模拟一个刚体的受力与运动情况。

有限元方法

碰撞向来是物理中难以解决的方法,由于数值方法等的误差,碰撞的效果可能出现严重的错误。而我们要模拟的物体也并不都是刚体,还可能包含可以发生形变的系统,例如布料的模拟。

47 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

布料可能与其他物理发生复杂的碰撞过程,发生极大的形变,而例如舞蹈场景等需要实现高质量的布料物理仿真。有限元方法可以帮助我们解决这个问题。

布料是一个连续的曲面,而连续问题是难以解决的。我们将曲面划分成若干平面小块(离散化),再为各块添加描述结构的约束,则类似辐射度方法中的那样,我们可以用线性系统表达布料。

物体的破裂

48 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

有时我们希望模拟一些物体受力或撞击破碎的物理过程,这会改变物体的形状。具体而言,破裂需要考虑的参数有使其破裂的阈值和对破碎后部分模型的重建策略。一种便于应用在破裂时的数据结构是半边连通性结构,它将有限元的一条邻边拆分成两个节点,通过若干指针进行结构上的关联。

49 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

另一种需要考虑的问题是,通常破裂的断口包含比模型本身更多的细节,因此需要在模型的不同区域采取不同的三角面数密度,即细节分级策略(LOD,Level of Detail)。

50 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

此外,在爆炸等场景中,爆炸带来的场景快速变化本身会引起大量密集计算,而如果考虑物体的形变、破裂等就更难以计算了,因此在这种情况下通常不会考虑形变和破裂。

液体模拟

结合有限元方法,将液体体积划分为若干体元,分别模拟这些体元即可。模拟液体时,需要考虑液体中各部分之间的作用力及液体的连续性。

运动学

骨骼是一种常用的为人物等模型绑定动画的模型,但骨骼并非刚体那样简单的物体,难以通过物理或插值得到其运动过程,因此就有前向运动学和反向运动学(IK,Inverse Kinematics)的研究。

骨骼模型

50 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

骨骼模型的结构类似一棵树,树根规定了其空间位置及旋转角的三个自由度,其子结构与父结构通过关节相连,关节处定义旋转的自由度数及旋转参数,以此类推。

前向运动学

要为骨骼模型设计动画,我们可以设计一些变换函数,从模型根节点向下应用这些变换,通过改变骨骼部分的参数来实现模型的动画。这种通过定义参数来实现移动的过程被称为前向运动学。

后向运动学(IK)

前向运动学的设计需要设计师分别移动骨骼的各部分,这种设计并不直观,也很难制作出质量高的动画。后向运动学将思路逆转,由设计师决定动画过程的终态位置,而通过算法找到一组合理的骨骼参数变换,使得骨骼能够以一种自然的状态运动和保持在终态。

需要注意的是,这里判断变换是否好的标准相当主观,也因此可能存在许多可行的变换来实现动画,评价这些参数的方式复杂。在真实的场景中,IK 的结果最重要的是要看起来自然生动,而需要一种算法来评估一组参数是否看起来“自然”。例如,我们可以通过分析关节的受力、从已知的自然动作中学习等。

旋转的插值

在动画过程中,物体可能发生的运动除了空间中的位移,还可能发生自身的旋转。因此,在关键帧之间对物体旋转的插值也是需要解决的问题之一。

欧拉角

.png - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

物体的旋转部分具有三个自由度,一种比较直观的描述方法是欧拉角。我们可以先想想一架空间中的飞机,它在完成机动时,通过三个角度来描述自己的旋转状态:朝向(yaw,上图蓝色框架)、俯仰(pitch,上图绿色框架)和滚转(roll,上图绿色框架中间的轴),他们分别表示飞机的机头朝向、机头仰角和机翼位置。

20190912221716767314856 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

我们可以如上图这样定义飞机所在的坐标系,则欧拉角可以定义为沿着三维直角坐标系的三个坐标轴的旋转角度。需要注意,欧拉角的旋转顺序需要指定,以不同顺序旋转得到的结果不一样。除此之外,欧拉角还有其他缺点,例如如果决定末态,可能有多种旋转顺序和参数可以完成旋转;分别对三个旋转角度的插值并不是球面上的大圆轨迹,不符合我们对旋转动画的希望。

一个欧拉角的常见问题被称为「万向锁(Gimbal Lock)」,简单来说,万向锁会使物体坐标系与世界坐标系的一个轴重合,从而使欧拉角定义的绕两不同轴的旋转,变为绕同一轴的旋转,最终表现为丢失了一个旋转的自由度。

Gimbal Lock Plane - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

一个形象的解释如上图所示,当紫色框架与绿色框架共面时,旋转紫色框架和旋转蓝色框架对物体的效果一致。我们也可以用公式来推导这一结果,如果我们定义欧拉角的旋转为 X-Y-Z 顺序,则有旋转变换矩阵

$$ \mathbf{R} = \mathbf{R}_\phi \mathbf{R}_\theta \mathbf{R}_\psi $$

其中 $\phi, \theta, \psi$ 分别代表物体沿 x、y、z 轴旋转的角度,而如果令 $\theta = 90^\circ$,则将矩阵展开得到

$$ \mathbf{R} = \begin{bmatrix}
0 & 0 & -1 \\
\sin(\phi – \psi) & \cos(\phi – \psi) & 0 \\
\cos(\phi – \psi) & -\sin(\phi – \psi) & 0 \\
\end{bmatrix} $$

通过矩阵的形式,我们可以发现除了 $\theta$ 角度外,绕轴旋转的自由度只有一项 $\phi – \psi$ 了。

四元数

欧拉角虽然给出了旋转的一种直观表示方法,但存在许多缺点,给应用欧拉角带来了困难。为了解决这些缺点,便于我们实现动画中的旋转效果,一种对复数的扩展「四元数(Quaternion)」被发明了出来。

1 - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

我们首先从一个参数的旋转出发,这可以表示为平面单位圆上的一个角度,而插值应得到单位圆上的一段圆弧。对两点 $\boldsymbol{q}_0, \boldsymbol{q}_1$ 的线性插值可以表示为 $\text{lerp}(\boldsymbol{q}_0, \boldsymbol{q}_1) = \boldsymbol{q}_0 (1-t) + \boldsymbol{q}_1 t$,但这将得到平面上的一段直线,即单位圆上的一条弦。为了得到圆弧,我们需要引入圆插值

$$ \text{slerp}(\boldsymbol{q}_0, \boldsymbol{q}_1) = \frac{\boldsymbol{q}_0 \sin[(1-t)\omega] + \boldsymbol{q}_1 \sin t\omega}{\sin \omega} $$

v2 0023faf02da1ae731d714b0429ced9d5 r - MIT 6.837:Dynamics & Kinematics & Rotation Interpolation 动力学、运动学和旋转插值

上图给出了对 slerp 的形象化理解,我们取弧上的任一点 $\boldsymbol{q}(t)$,记它与起点的圆心角差值为 $t \phi$,则有 $\boldsymbol{q}_0 \cos t\phi + \boldsymbol{q}_1′ \sin t\phi$,而我们可以利用实际的终点 $\boldsymbol{q}_1$ 来表示恰好与起点成 90° 角的点 $\boldsymbol{q}_1’$,从而推导出最终结果。利用圆插值,我们可以在二维空间中得到一个自由度旋转的圆弧轨迹。

考虑两个自由度的旋转,这可以在三维空间中被表达为单位球上两点的大圆轨迹。描述单位球上的点可以用方位角 $\theta$ 和俯仰角 $\phi$ 来表示,我们可以通过在大圆上应用圆插值得到这条大圆轨迹。

动画中的旋转具有三个自由度,根据我们之前的思路,这需要在四维空间的单位球上进行,需要一种方法来描述四维坐标。四元数被定义为 $a+b\mathrm{i}+c\mathrm{j}+d\mathrm{k}$,并同时定义了一些有利于我们简化旋转计算形式的运算。有关四元数的知识将在另一篇博文中介绍。

使用四元数的好处有很多,例如在四元数中旋转以非常简单的形式表示,插值也简单、自然和便于计算;四元数与旋转的映射关系是双倍覆盖,具有确定的映射关系;不存在欧拉角表示中万向锁的问题。但四元数是高度抽象的数学工具,不便于动画师在制作时使用,通常只用于编码实现动画的过程,而在制作时使用更直观的欧拉角。

参考资料



发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据