动画混合
动画混合(animation blending)是指把两个或者更多的输入姿势结合,产生骨骼的输出姿势。
动画混合可以混合两个相邻采样帧来实现连续采样。动画混合也可在时间上混合两个动画来实现从一个动画至另一动画的平滑过渡。
1.线性插值混合
给定两个骨骼姿势求中间姿势,方法之一就是对每个关节的局部姿势进行线性插值(linear interpolation, LERP)。
-
对于单个关节(β为混合百分比):
$(P_{lerp})_j = (1 - β)(P_A)_j + β(P_B)_j$ -
整个骨骼的插值姿势仅仅是所有关节插值姿势的集合:
$P_{lerp}^{skel} = { (P_{lerp})j } |{j=0}^{N-1}$
线性插值的细节:
关节姿势是4x4矩阵,直接对矩阵插值并非切实可行。这也是通常用SQT格式表示局部姿势的原因之一,可以分别对SQT的每个部分进行插值。
- 位移T:简单的矢量Lerp。
- 旋转:使用四元数的Lerp或者Slerp。
- 缩放:统一/非统一缩放分别用标量/矢量Lerp。
局部姿势混合&并行:
最好是在局部空间进行姿势混合,如果在模型空间混合姿势会显得不真实(例如关节之间的距离会变化)。
姿势混合在局部空间进行,那么每个关节的插值就完全独立于同一骨骼的其他关节插值。意味着线性插值可完全并行地在多处理架构上运行。
2.线性插值混合的应用
时间性混合:
由于游戏动画使用浮点数而非整数索引采样。所以需要求出动画片段中各个采样姿势之间的中间姿势。
公式:$P_j(t) = (1 - β(t))P_j(t1) + β(t)P_j(t2)$
其中:$β(t) = {{t - t1} \over {t2 - t1}}$
动画淡入淡出:
实现从一个片段到另一片段的平滑过渡,称为$C^0$连续。
不单三维路径本身应该连续,其导数(速度曲线)也应连续,称为$C^1$连续。若使用更高阶的连续性,角色动作会显得更佳更真实。
- ◈ 淡入淡出的种类:
圆滑过渡(smooth transition):播放片段A和B的同时把β从0至1递增。两个动画须是循环动画才能有较好效果。
冻结过渡(frozen transition):片段A的局部时钟停顿于片段B开始播放时。适合于混合两个不相干的片段。
我们也可以控制混合比β的变化方式,来达到更圆滑的过渡。(例如Bezier的Ease方式)
- ◈ 补充-核心姿势:
无须混合就能产生连续动作的方法,就是动画师确保某片段的最后姿势能匹配后续片段的首个姿势。
方向性运动:
角色在步行或者跑动时一般有两种移动方式。第一种PivotalMovement方式角色能转身改变方向然后向前移动。第二种Strafe方式角色能保持面向某方向,同时向前后左右移动,即移动方向和面向方向独立。
- ◈Pivotal移动:
要实现简单的Pivotal移动,简单地播放向前运动片段即可,缺点是角色转向时身体完全笔直。
要实现转向时带有身体倾斜角度的动画,可以制作三个动画进行混合,即完全向前、极端向左转、极端向右转,然后进行线性插值混合。
- ◈Strafe移动:
实现Strafe移动,动画师通常会制作三种(前左右)循环片段,称为DirectionalLocomotionClip。当向半圆的一个方向移动时,就选择两个相邻片段根据角度混合。
向后移动混合左/右移动一般来说会导致两条腿穿模,显得不自然。一个解决办法是定义两个半圆混合,为这两个半圆分别制作两组适合混合的左右移动动画。然后再在两个半圆之间进行混合。
Strafe移动是下文介绍的一维线性插值混合的特例。
CRE:方向性运动也不一定要用一维的,一维不好处理移速和Idle动作混合。
3.复杂的线性插值混合
在真实的游戏引擎中,角色会使用广泛不同种类的复杂混合,以完成不同目的。
为了更容易使用,我们可以把这些复杂混合预包装起来。
CRE:Unity的混合树有很多种混合模式,包括用两个浮点参数同时混合多个动画。
一维线性插值混合
线性插值混合可以扩展至多于两个动画片段,即泛化的一维线性插值混合(one-dimensional lerp blending)。
任意数量的片段至于混合参数b的定义域中的某点上,给定任意的b值,选取最近的两个片段进行混合。
二维线性插值混合
- ◈简单的正方形二维混合:
四个动画片段作为四个角包围成一个正方形区域,二位混合矢量b位于正方形区域中。
先用水平混合因子bx求出两个中间姿势,然后用垂直混合因子by把两个中间姿势混合。(CRE:双线性插值)
- ◈泛化的二维线性插值混合:
泛化的二维线性插值能混合任意数量置于任意位置的动画片段。
- 对于二维混合空间的任意位置,利用Delaunay三角剖分从多个动画片段求出一组三角形,从中寻找包围了混合点b的三角形。
- 对此三角形进行三角形的二维线性插值混合。使用重心坐标来进行插值混合。
4.骨骼分部混合
人可以独立控制身体不同部位。例如在步行时挥动右臂,同时左手指着某物。可以使用名为骨骼分部混合(partial-skeleton blending)的技术。
骨骼分部混合允许定义一个混合遮罩(blending-mask),即整个骨骼的关节混合百分比集合。这可以把某些关节的混合百分比设为0,来”掩盖”那些关节。
注意事项:
- 混合因子突兀改变会看上去非常奇怪。可以逐渐改变混合因子而非突兀改变。(CRE:软遮罩)
- 有些问题难以用分布混合解决,可以用加法混合。
5.加法混合
加法混合(additive blending)引入了一种称为加法片段或者区别片段的动画。
区别片段代表两段动画的区别,即一个姿势变换至另一个动画所需的改变。
数学公式:
区别动画D定义为某源动画(source clip, S)和参考动画(reference clip, R)之间的差异。区别动画不仅能加进参考片段,还能加进其他不相关的目标片段(target clip, T)。
概念上区别片段$D = S - R$。但是关节姿势是个仿射矩阵而不是标量。标量减法对应的矩阵运算是乘以逆矩阵,所以区别姿势$D_j = R_{j}^{-1} · S_j$。
Ye:以上的D、S、R也可以用SQT表示。一般来说,SQT的串接求逆运算都比矩阵高效。
加法混合百分比:
有时需要混合某百分比的区别动画,以产生不同程度的效果。我们可以用线性插值实现这种效果,但是我们无法直接对矩阵插值,所以要分别拆分成S、Q、T分别插值。
加法混合的优势和劣势:
相比分部混合,加法混合看上去更自然、”分离”问题较少。
加法混合可能会产生关节的过度转向,特别是在加入多个区别动画时。
加法混合的一些注意事项:
- 参考片段中尽量减少髋关节的旋转。
- 参考姿势中肩和肘关节应该一直维持中性姿势。这样能防止手臂过度转向。
- 应该为每个核心姿势(站立/蹲下/卧倒)创建新的区别动画。
6.加法混合的应用
站姿变化:
动画师为每个站姿创建一帧区别动画,这些单帧片段用加法混合至一个基本动画时,能改变角色站姿而又能继续表现原来所需的动作。
噪声动画:
加法混合可用于在完全重复的动画上叠加随机性的表现。例如跑步时每个脚步的差异以及Idle时的分心动画。
瞄准和注视:
加法混合的另一个应用就是角色注释四周或者武器瞄准。(通常是制作上下左右四个区别动画,然后加法混合出上下左右之间的注视或者瞄准动画)
CRE:使用IK可能会更好。
时间轴的另类用途:
动画片段的时间轴不一定表示时间,也可以用来表示不同状态。在时间上插值就等同于对不同状态插值。
例如第一帧向左瞄准,第二帧向前瞄准,第三帧向右瞄准。那么要向左前瞄准就把时钟固定1.5帧位置。
(END)
CRE NOTE:
CRE: 1R + 0.5(S - R)= 0.5R + 0.5S
CRE: 1R + 0.2(S - R) = 0.8R + 0.2S