时间采样

动画 Animation 把随时间变化的场景采样为离散帧序列。电影常用 24 fps,电视和交互内容也常见 30、60 fps 或更高。帧率只规定显示时刻的离散间隔

Δt=1fps,\Delta t=\frac1{\mathrm{fps}},

并不自动保证运动平滑。物体在相邻帧间位移过大时会产生时间混叠;快门时间决定单帧中是否通过运动模糊保留这段连续轨迹。

早期机械与手绘动画、关键帧和补间动画逐步发展到数字动画。现代制作仍保留相同基本结构:艺术家控制少量关键状态,系统生成中间状态,再配合物理模拟和动作捕捉处理难以逐帧制作的运动。

关键帧

关键帧动画 Keyframe Animation 在若干时刻 tit_i 指定参数 qi\mathbf q_i。最简单的线性插值为

q(t)=(1α)qi+αqi+1,α=ttiti+1ti.\mathbf q(t) = (1-\alpha)\mathbf q_i+\alpha\mathbf q_{i+1}, \qquad \alpha=\frac{t-t_i}{t_{i+1}-t_i}.

它保证位置连续,但在关键帧处速度会突然改变。三次 Hermite 曲线 额外指定端点物理速度 mi,mi+1\mathbf m_i,\mathbf m_{i+1}

q(α)=h00(α)qi+h10(α)Δtmi+h01(α)qi+1+h11(α)Δtmi+1,\mathbf q(\alpha) = h_{00}(\alpha)\mathbf q_i +h_{10}(\alpha)\Delta t\,\mathbf m_i +h_{01}(\alpha)\mathbf q_{i+1} +h_{11}(\alpha)\Delta t\,\mathbf m_{i+1},

其中

h00=2α33α2+1,h10=α32α2+α,h_{00}=2\alpha^3-3\alpha^2+1, \qquad h_{10}=\alpha^3-2\alpha^2+\alpha,

h01=2α3+3α2,h11=α3α2.h_{01}=-2\alpha^3+3\alpha^2, \qquad h_{11}=\alpha^3-\alpha^2.

代入 α=0,1\alpha=0,1 可验证位置分别为两端关键帧。由于

dqdt=1Δtdqdα,\frac{\mathrm d\mathbf q}{\mathrm dt} = \frac1{\Delta t} \frac{\mathrm d\mathbf q}{\mathrm d\alpha},

而端点处 dq/dα\mathrm d\mathbf q/\mathrm d\alpha 分别为 Δtmi\Delta t\,\mathbf m_iΔtmi+1\Delta t\,\mathbf m_{i+1},所以物理时间上的端点速度正好匹配给定值。连续选择相邻段的速度能够获得 C1C^1 运动。

关键帧插值中位置与速度的连续性

图中线性插值在关键帧处会突然改变斜率,Hermite 曲线则通过端点速度让运动轨迹平滑衔接。位置连续并不代表速度连续,视觉上的顿挫通常来自后一种不连续。

角度直接线性插值可能绕远路,也会在 360360^\circ 附近跳变。三维旋转更适合使用单位四元数的 球面线性插值 Spherical Linear Interpolation,简称 SLERP。四元数 qqq-q 表示同一旋转;若 q0q1<0q_0\cdot q_1<0,先令 q1q1q_1\leftarrow-q_1,才能沿四维单位球的短弧插值。令

θ=arccos[clamp(q0q1,1,1)],\theta=\arccos[\operatorname{clamp}(q_0\cdot q_1,-1,1)],

slerp(q0,q1;α)=sin[(1α)θ]sinθq0+sin(αθ)sinθq1.\operatorname{slerp}(q_0,q_1;\alpha) = \frac{\sin[(1-\alpha)\theta]}{\sin\theta}q_0 +\frac{\sin(\alpha\theta)}{\sin\theta}q_1.

q0,q1q_0,q_1 必须先归一化;θ\theta 很小时,直接线性插值后重新归一化更稳定。也可以先确保欧拉角分支一致,但它仍可能遇到万向节锁。比例、颜色和材质参数同样要依据其物理含义选择插值空间,不能机械地对显示编码值做线性插值。

动力学

运动学直接规定位置随时间的变化;动力学 Dynamics 从力和质量求运动。Newton 第二定律为

F=ma=mdvdt=md2xdt2.\mathbf F=m\mathbf a = m\frac{\mathrm d\mathbf v}{\mathrm dt} = m\frac{\mathrm d^2\mathbf x}{\mathrm dt^2}.

把二阶方程拆成一阶状态方程:

ddt(xv)=(vF(x,v,t)/m).\frac{\mathrm d}{\mathrm dt} \begin{pmatrix} \mathbf x\\ \mathbf v \end{pmatrix} = \begin{pmatrix} \mathbf v\\ \mathbf F(\mathbf x,\mathbf v,t)/m \end{pmatrix}.

给定初始位置、速度、力模型和边界条件,数值积分器便能逐步求出状态。力模型决定物理现象,积分器决定连续方程如何离散,二者的问题需要分开判断。

弹簧力

先考虑两个质点 a,ba,b,位置差

d=xaxb,=d,d^=d.\mathbf d=\mathbf x_a-\mathbf x_b, \qquad \ell=\lVert\mathbf d\rVert, \qquad \hat{\mathbf d}=\frac{\mathbf d}{\ell}.

根据 Hooke’s Law,静止长度为 0\ell_0、刚度为 ksk_s 的弹簧势能是

Es=12ks(0)2.E_s=\frac12k_s(\ell-\ell_0)^2.

力是势能对位置的负梯度。由于

xa=xaxbxaxb=d^,\frac{\partial\ell}{\partial\mathbf x_a} = \frac{\mathbf x_a-\mathbf x_b} {\lVert\mathbf x_a-\mathbf x_b\rVert} =\hat{\mathbf d},

作用在 aa 上的力为

fab=Esxa=ks(0)d^.\mathbf f_{a\leftarrow b} = -\frac{\partial E_s}{\partial\mathbf x_a} = -k_s(\ell-\ell_0)\hat{\mathbf d}.

作用在 bb 上的力大小相等、方向相反。>0\ell>\ell_0 时弹簧拉伸,力把两点拉近;<0\ell<\ell_0 时弹簧压缩,力把两点推开。这一符号检查比死记公式更可靠。

零静止长度是 0=0\ell_0=0 的特例:

fab=ks(xaxb).\mathbf f_{a\leftarrow b} = -k_s(\mathbf x_a-\mathbf x_b).

\ell 接近零而 0>0\ell_0>0 时,方向 d^\hat{\mathbf d} 不稳定,实现中需要避免除零或使用连续的正则化。

阻尼

理想弹簧只在动能和势能之间交换能量,会永久振荡。阻尼 Damping 用来耗散能量。全局阻力

fd=kdv\mathbf f_d=-k_d\mathbf v

相对于世界静止系的阻力会耗散运动,连整体平移也会减慢。它适合模拟空气阻力式的稳定化,却会改变系统总动量。

内部弹簧阻尼只抑制两个端点沿弹簧方向的相对速度。令

vrel=(vavb)d^,v_{\mathrm{rel}} = (\mathbf v_a-\mathbf v_b)\cdot\hat{\mathbf d},

作用在 aa 上的阻尼力可写为

fd,a=kdvreld^,fd,b=fd,a.\mathbf f_{d,a} = -k_dv_{\mathrm{rel}}\hat{\mathbf d}, \qquad \mathbf f_{d,b}=-\mathbf f_{d,a}.

两力相互抵消,因此不会凭空改变质心动量。只取轴向相对速度也避免把刚体式共同运动误当成弹簧形变。刚度和阻尼很大时,方程会变得 stiff,显式积分必须使用很小时间步。

弹簧网

多个质点和弹簧可以组成绳索、布料与软体。规则布料网格通常包含:

  • structural springs:连接水平、竖直相邻点,抵抗拉伸;
  • shear springs:连接对角点,抵抗剪切;
  • bending springs:跨过一个点连接更远邻居,抵抗折叠。

只使用结构弹簧的方格可沿对角方向轻易剪切;加入剪切弹簧后形状更稳定;弯曲弹簧控制布料柔软程度。边界点可以固定或施加碰撞约束。

质点—弹簧模型直观,但参数很难与连续材料的 Young 模量、Poisson 比等严格对应。有限元法 Finite Element Method 从连续体能量出发,把物体离散成单元并求能量梯度,在材料精度和复杂变形上更系统。

质点—弹簧网格的整体变形

图中布料或软体由离散质点和连线组成,局部受力会沿网格传播并形成整体形变。网格越密,能表现的局部褶皱越丰富,但每步需要处理的邻接关系也越多。

结构弹簧与剪切弹簧分别约束轴向拉伸和对角剪切

图中只画出了结构弹簧与剪切弹簧:前者抵抗水平和竖直拉伸,后者约束对角变形;这两类连接本身仍不抵抗面外弯曲。弯曲弹簧需要跨过一个邻点连接更远顶点,才能对折叠提供恢复力。缺少其中一类时,网格会沿对应自由度出现不自然的软塌或剪切。

粒子系统

粒子系统 Particle System 用大量简单个体表示火花、烟尘、喷泉、群集甚至流体。每一时间步通常执行:

  1. 生成新粒子并设置初始状态;
  2. 计算重力、阻力、吸引、排斥等力;
  3. 更新速度和位置;
  4. 处理碰撞、约束和粒子间作用;
  5. 删除寿命结束或离开范围的粒子;
  6. 以点精灵、网格、体积或隐式表面渲染。

rij=xjxi,r=rij,r^ij=rijr,\mathbf r_{ij}=\mathbf x_j-\mathbf x_i, \qquad r=\lVert\mathbf r_{ij}\rVert, \qquad \hat{\mathbf r}_{ij}=\frac{\mathbf r_{ij}}r,

其中方向从粒子 ii 指向粒子 jj。两个质点的万有引力为

fij=Gmimjr2r^ij,\mathbf f_{i\leftarrow j} = G\frac{m_im_j}{r^2}\hat{\mathbf r}_{ij},

其中 r^ij\hat{\mathbf r}_{ij}ii 指向 jj。当 r0r\to0 时力会发散,离散模拟常引入软化长度

fij=Gmimjrij(rij2+ε2)3/2.\mathbf f_{i\leftarrow j} = Gm_im_j \frac{\mathbf r_{ij}} {(\lVert\mathbf r_{ij}\rVert^2+\varepsilon^2)^{3/2}}.

直接计算所有粒子对的成本为 O(N2)O(N^2)。大规模引力、分子动力学和群集可用网格、空间哈希、Barnes–Hut tree 或邻域列表减少候选交互。

Flocking 不要求每个个体解真实流体方程,而用分离、对齐、聚合等局部规则产生群体运动。规则是行为模型,其参数与视觉结果相关,不应解释为基本物理常数。

Flocking 由局部规则涌现群体运动

图中每个个体只观察邻域并执行分离、对齐、聚合,整体却出现队形、转向和聚散等宏观行为。局部规则的组合会产生涌现结果,不能把群体轨迹简单归因于某一个个体的预设路径。

正向运动学

正向运动学 Forward Kinematics 从关节参数计算末端位置。骨架是关节组成的树,每个关节保存相对父关节的旋转和平移,根节点位于世界坐标。沿父子链相乘即可得到关节 jj 的全局变换:

Tjworld=TrootT1Tj.T_j^{\mathrm{world}} = T_{\mathrm{root}} T_1\cdots T_j.

矩阵顺序由层级决定,父节点运动会影响所有后代。正向运动学输入关节参数,输出末端位置,计算直接且结果唯一。

二维平面中的 mm 段机械臂,段长为 k\ell_k,关节相对角为 θk\theta_k。第 kk 段的世界朝向是累计角

ϕk=j=1kθj.\phi_k=\sum_{j=1}^{k}\theta_j.

末端位置因此为

x(θ)=k=1mkcosϕk,y(θ)=k=1mksinϕk.x(\boldsymbol\theta) = \sum_{k=1}^{m}\ell_k\cos\phi_k, \qquad y(\boldsymbol\theta) = \sum_{k=1}^{m}\ell_k\sin\phi_k.

这个函数 f(θ)f(\boldsymbol\theta) 就是后续逆运动学要反求的映射。

两杆反解

逆向运动学 Inverse Kinematics 从末端目标反求关节参数。两段平面机械臂的段长为 1,2\ell_1,\ell_2,目标为 (x,y)(x,y),目标到根部的距离满足

r2=x2+y2.r^2=x^2+y^2.

由余弦定理,

r2=12+22+212cosθ2,r^2 = \ell_1^2+\ell_2^2 +2\ell_1\ell_2\cos\theta_2,

所以

cosθ2=r21222212.\cos\theta_2 = \frac{r^2-\ell_1^2-\ell_2^2} {2\ell_1\ell_2}.

若右侧超出 [1,1][-1,1],目标不在可达环域

12r1+2.|\ell_1-\ell_2| \le r \le\ell_1+\ell_2.

有效时 sinθ2\sin\theta_2 有正负两个选择,对应肘部向上或向下。选定 θ2\theta_2 后,

θ1=atan2(y,x)atan2(2sinθ2,1+2cosθ2).\theta_1 = \operatorname{atan2}(y,x) -\operatorname{atan2} \left( \ell_2\sin\theta_2, \ell_1+\ell_2\cos\theta_2 \right).

第一项是目标方向,第二项修正第一段与根部到目标连线之间的夹角。这个解析解展示了 IK 的三个基本现象:目标可能无解、可能有多个解,也可能在完全伸直等奇异姿态附近对目标变化非常敏感。

FK 是确定的正向映射;IK 是带约束的反问题,多解、无解和奇异位形都属于问题本身。

数值反解

复杂骨架通常通过优化求解。设末端位置为 f(θ)f(\boldsymbol\theta),目标为 p\mathbf p^*,可最小化

E(θ)=12f(θ)p2.E(\boldsymbol\theta) = \frac12 \lVert f(\boldsymbol\theta)-\mathbf p^*\rVert^2.

令误差 e=f(θ)p\mathbf e=f(\boldsymbol\theta)-\mathbf p^*Jacobian

J=fθ,J=\frac{\partial f}{\partial\boldsymbol\theta},

链式法则给出

θE=JTe.\nabla_{\boldsymbol\theta}E = J^T\mathbf e.

最简单的梯度下降更新为

θk+1=θkηJTe.\boldsymbol\theta_{k+1} = \boldsymbol\theta_k -\eta J^T\mathbf e.

Gauss–Newton 在局部线性化 f(θ+Δθ)f(θ)+JΔθf(\boldsymbol\theta+\Delta\boldsymbol\theta)\approx f(\boldsymbol\theta)+J\Delta\boldsymbol\theta 后,求解

JTJΔθ=JTe.J^TJ\Delta\boldsymbol\theta = -J^T\mathbf e.

接近奇异姿态时 JTJJ^TJ 可能病态,Damped Least Squares 改为

(JTJ+λI)Δθ=JTe(J^TJ+\lambda I)\Delta\boldsymbol\theta = -J^T\mathbf e

以提高稳定性。关节限位、姿态偏好、脚底接触和避障都可作为约束或附加能量加入。

逆运动学从末端目标反求关节参数,通常存在多解与约束

蒙皮绑定

Rigging 把可变形网格绑定到骨架。线性混合蒙皮 Linear Blend Skinning 为每个顶点分配若干关节权重 wijw_{ij},满足

wij0,jwij=1.w_{ij}\ge0, \qquad \sum_jw_{ij}=1.

以下统一采用 column vector,并让 xˉi\bar{\mathbf x}_i 位于模型的绑定姿态空间;BjB_jTjT_j 分别把关节 jj 的局部坐标变换到绑定姿态模型空间和当前模型空间。这样二者处在同一个目标坐标系约定下,顶点更新为

xˉi=jwijTjBj1xˉi.\bar{\mathbf x}_i' = \sum_j w_{ij}T_jB_j^{-1}\bar{\mathbf x}_i.

Bj1B_j^{-1} 先把顶点送到关节绑定空间,TjT_j 再送到当前姿态,最后按权重混合。线性混合简单高效,但大角度扭转会损失体积并产生 candy-wrapper artifact。双四元数蒙皮、修正形变或数据驱动方法可改善。

骨骼、关节权重与蒙皮网格的关系

图中骨骼层提供关节变换,蒙皮层为每个顶点保存多关节权重,网格位置是这些变换的加权结果。局部关节运动先沿骨架层级传播,再通过权重影响附近顶点,因此权重突变会造成明显折痕。

Blend Shapes 直接在线性形状基上组合面部表情:

x=x0+kwkΔxk.\mathbf x = \mathbf x_0+\sum_kw_k\Delta\mathbf x_k.

它适合嘴型和表情等局部形变,也可与骨骼蒙皮叠加。权重范围和组合关系需要约束,否则会产生超出制作意图的形状。

Blend Shapes 由形状基和权重组合表情

图中每个 blend shape 是相对基准网格的一组位移,权重改变时把多个局部形变线性叠加。它直接表达嘴角、眼睑等形状目标,和骨骼提供的整体刚性运动属于不同数据层,可以组合使用。

动作捕捉

动作捕捉 Motion Capture 从真实演员获得身体或面部运动。光学系统用多台标定相机观察标记点,通过多视图射线的最近交会恢复三维位置,再把标记轨迹拟合到骨架。惯性系统使用 IMU 估计各部位旋转,不依赖固定相机,但会积累漂移。

捕捉数据自然、细节丰富,却仍需处理遮挡、标记混淆、缺帧、抖动和骨架比例差异。动作重定向 Retargeting 把源演员动作映射到不同角色,需要保持足底接触、关节限制和运动风格。

动作捕捉从观测数据恢复骨架运动

图中光学标记主要提供三维位置,IMU 主要提供局部旋转,系统把这些观测拟合成随时间变化的骨架参数;清理缺帧和重定向后才得到角色动画。捕捉数据是测量结果,不等于已经满足角色比例、接触和关节约束的最终姿态。

面部捕捉对微小形变和眼神很敏感。即使几何准确,只要眼睛、皮肤或时序略有不协调,也会产生 恐怖谷 Uncanny Valley。制作流程通常结合捕捉、表情基、人工修整与物理次级运动,而不直接把原始测量当作最终动画。