跳转至

L21 Animation

1 动画(Animation)

“赋予事物生命力”

  • 作为一种沟通工具
  • 美学问题往往优先于技术问题
    建模的延伸

  • 将场景模型表示为时间的函数(即加入时间维度,让静态模型动起来)
    输出:连续播放时能产生运动感的图像序列

  • 电影:24 帧 / 秒(fps)

  • 视频(通用标准):30 帧 / 秒(fps)
  • 虚拟现实(VR):90 帧 / 秒(fps)

1.1 History

First Film


Pasted image 20260130154253.png

第一步手绘剧场版动画(First Hand-Drawn Feature-Length (>40 mins) Animation)(1937)


Pasted image 20260130154315.png

第一个电子计算机生成的动画(First Digital-Computer-Generated Animation)(1963)


Pasted image 20260130154539.png

数字恐龙


Pasted image 20260130154636.png

第一个纯CG(Computer-Generated)电影(First CG Fearute-Length Film)(1995)


Pasted image 20260130154722.png

1.2 Keyframe Animation


Pasted image 20260130155011.png

关键帧动画制作流程

  • 动画师(如首席动画师)(Animator (e.g. lead animator))负责创建关键帧(keyframes)
  • 助理(人工或计算机)(Assistant (person or computer))负责生成中间帧(in-between frames),这个过程称为 “补间(tweening)”
    将每一帧(frame)当作一个参数值的向量(Think of each frame as a vector of parameter values)

Pasted image 20260130155252.png

线性插值通常不够好。回想(recall)一下用于平滑 / 可控制插值(interpolation)的样条曲线(splines)


Pasted image 20260130155246.png

2 物理模拟(Physical Simulation)

2.1 Newton's law

\[\boldsymbol{F} = m\boldsymbol{a}\]

\(\boldsymbol{F}\): Force(力,矢量)
\(m\): Mass(质量,标量)
\(\boldsymbol{a}\): Acceleration(加速度,矢量)
通过数值模拟(numerical simulation)生成物体的运动


Pasted image 20260130155713.png

2.2 质点弹簧系统(Mass Spring System)

质点弹簧系统可以用来对绳子、头发、布料进行模拟


Pasted image 20260130160205.png

2.2.1 Spring

理想弹簧模型(Idealized spring)


Pasted image 20260130160748.png

\[ \begin{align} \boldsymbol{f}_{a \to b} &= k_s (\boldsymbol{b} - \boldsymbol{a}) \\ \boldsymbol{f}_{b \to a} &= -\boldsymbol{f}_{a \to b} \end{align} \]
  • 力的作用是将两个点(a 和 b)拉向彼此
  • 力的大小与两点间的位移成正比(符合胡克定律的核心逻辑)
  • \(k_s\) 是弹簧系数:代表弹簧的刚度(stiffness)
    核心问题:这种理想弹簧会趋向于收缩到零长度(与现实物理不符)

具有非零原长的弹簧模型(Spring with non-zero rest length)

\[\boldsymbol{f}_{a \to b} = k_s \frac{\boldsymbol{b} - \boldsymbol{a}}{||\boldsymbol{b} - \boldsymbol{a}||} \left( ||\boldsymbol{b} - \boldsymbol{a}|| - l \right)\]
  • \(l\):原长(Rest length)(弹簧自然松弛状态下的长度)
    核心问题:该模型中的弹簧会永远振荡(oscillates forever)(无能量损耗,与现实物理不符)

导数的点记法(Dot Notation for Derivatives)

如果 \(x\) 是目标点的位置矢量,我们将用点表示法来表示速度和加速度:
\(\boldsymbol{x} \quad \text{:位置矢量(Position vector)}\)
\(\dot{\boldsymbol{x}} = \boldsymbol{v} \quad \text{:一阶导数,速度矢量(Velocity vector)}\)
\(\ddot{\boldsymbol{x}} = \boldsymbol{a} \quad \text{:二阶导数,加速度矢量(Acceleration vector)}\)

2.2.2 Energy Loss

简单运动阻尼(Simple motion damping)


Pasted image 20260130161600.png

\[\boldsymbol{f} = -k_d \dot{\boldsymbol{b}}\]
  • 表现类似运动中的粘性阻力(viscous drag)
  • 会在速度的方向上减慢运动(阻力方向与速度方向始终相反)
  • \(k_d\) 是阻尼系数(damping coefficient)
    这种阻力无法仅表示弹簧内部的阻力。因为它会影响弹簧整体的运动。
    仅阻尼内部由弹簧驱动的运动
\[\boldsymbol{f}_b = -k_d \left( \frac{\boldsymbol{b} - \boldsymbol{a}}{||\boldsymbol{b} - \boldsymbol{a}||} \cdot (\dot{\boldsymbol{b}} - \dot{\boldsymbol{a}}) \right) \frac{\boldsymbol{b} - \boldsymbol{a}}{||\boldsymbol{b} - \boldsymbol{a}||}\]

Pasted image 20260130161954.png

红框部分:两点的相对速度在a 到 b 方向上的投影(标量值)。这是因为相对速度在垂直于ab方向上的分量并不会导致阻尼(比如圆周运动)。
核心特点:

  • 仅对弹簧长度变化的运动施加粘性阻力
  • 不会减慢弹簧系统的整体运动(如整个弹簧组的全局平移或旋转)
  • 注意:这只是阻尼的一种特定类型

2.2.3 由弹簧形成的结构(Structures form Springs)

我们想用弹簧系统来模拟布料.


Pasted image 20260130162832.png

这种结构无法抵抗剪切力(not resist shearing)。


Pasted image 20260130162936.png

这种结构能抵抗剪切力(shearing),但存在各向异性偏差(anisotropic bias)。


Pasted image 20260130163031.png

这种结构将能抵抗剪切力(shearing)。方向性偏差(directional bias)更小。
和前面的结构一样,这种结构也无法抵抗平面外弯曲(out-of-plane bending)。


Pasted image 20260130163405.png

这种结构将抵抗平面外弯曲(out-of-plane bending),红色弹簧应该弱得多(much weaker),一种比较通俗的名称叫(skip connection)。

其他的方法:有限元法(FEM,Finite Element Method)而非弹簧

2.3 Particle Systems

粒子系统基础

  • 将动态系统建模为大量粒子的集合
  • 每个粒子的运动由一组物理(或非物理)(physical or non-physical)力定义
    在图形学与游戏中的应用特点

  • 易于理解与实现:原理直观,开发门槛低

  • 可扩展性强:用更少的粒子追求速度,用更多的粒子实现更高复杂度的效果
    面临的挑战

  • 可能需要海量粒子(如模拟流体、烟雾时)

  • 可能需要加速结构(如用于快速查找邻近粒子以计算相互作用)

粒子系统动画渲染流程
在动画的每一帧中执行以下步骤:

  • 【按需执行】创建新粒子(补充生命周期结束的粒子,维持效果连续性)
  • 计算每个粒子所受的力(如重力、风力、碰撞力等)
  • 更新每个粒子的位置和速度(通过积分算法实现运动更新)
  • 【按需执行】移除死亡粒子(清理生命周期结束或超出边界的粒子,优化性能)
  • 渲染粒子(将粒子绘制到屏幕上)

粒子系统的力与碰撞分类

吸引与排斥力

  • 重力(Gravity)、电磁力(electromagnetism)等
  • 弹簧力(Springs)、推进力(propulsion)等
    阻尼力

  • 摩擦力(Friction)、空气阻力(air drag)、粘性阻力(viscosity)等
    碰撞

  • 墙壁(Walls)、容器(containers)、固定物体(fixed objects)等

  • 动态物体(Dynamic objects)、角色身体部位(character body parts)等

模拟与渲染分离

实际应用中是先模拟再渲染,二者互相并不干扰。

2.4 模拟集群行为(Simulated Flocking Behavior)

作为常微分方程的模拟群体行为(Simulated Flocking as an ODE)
群体行为模拟(Flocking Behavior Simulation)
将每只鸟建模为一个粒子(particle),受以下简单力(forces)的驱动:

  • 吸引(attraction):向邻近个体(neighbors)的中心位置聚集
  • 排斥(repulsion):与过近的邻近个体保持距离,避免碰撞
  • 对齐(alignment):与邻近个体的平均运动轨迹(average trajectory)方向保持一致
    通过数值方法(numerically)模拟大规模粒子系统的演化(evolution)。涌现(Emergent)出复杂的全局群体行为,这一现象也见于鱼群、蜂群等生物群体

Pasted image 20260130164920.png

3 运动学(Kinematics)

3.1 Forward Kinematics

关节骨骼(Articulated skeleton)

  • 拓扑结构(Topology):定义骨骼各部件的连接关系(如 “哪块骨骼连接到哪块骨骼”)
  • 关节的几何关系(Geometric relations from joints):描述骨骼段的长度、初始角度等空间参数
  • 树状层级结构(Tree structure):骨骼系统通常为无环路的树状结构(如人体骨骼从脊柱延伸至四肢,避免运动冲突)
    关节类型(Joint types)

  • 销关节(Pin joint):1 维旋转(1D rotation),仅能在单一平面内转动(如人的肘关节、膝关节)

  • 球关节(Ball joint):2 维 / 3 维旋转(2D/3D rotation),可在多个平面内转动(如人的肩关节、髋关节)
  • 棱柱关节(Prismatic joint):平移(translation),沿固定轴线做直线运动(如机械臂的伸缩关节、手指的滑动关节)

Pasted image 20260130165946.png

我们可以通过 \(\theta_1\)\(\theta_2\) 等参数计算出end point \(p\)的位置

\[ \begin{align*} p_z &= l_1 \cos(\theta_1) + l_2 \cos(\theta_1 + \theta_2) \\ p_x &= l_1 \sin(\theta_1) + l_2 \sin(\theta_1 + \theta_2) \end{align*} \]

Pasted image 20260130170833.png

优缺点(Kinematics Pros and Cons)
优点(Strengths)

  • 直接控制(Direct control) 便捷:动画师可以直接调整关节角度或关键帧,精准控制角色的每一个动作姿态。
  • 实现(Implementation) 简单直接:技术门槛低,无需复杂的物理引擎或反向运动学求解器,开发与制作流程清晰。
    缺点(Weaknesses)

  • 动画效果可能与 物理(physics) 规律不符:纯手工调整的动作可能出现违反物理直觉的效果(如角色跳跃时的重力感不足、肢体运动过于僵硬)。

  • 动画师(artists) 来说耗时费力:需要逐帧或逐关键帧调整角色姿态,制作复杂动作(如舞蹈、打斗)时工作量极大,且难以保证动作的连贯性与自然性。

3.2 Inverse Kinematics

逆运动学的手要问题是计算复杂。即使是只有两个关节的计算公式就已经非常复杂。

\[ \begin{align*} \theta_2 &= \cos^{-1}\left( \frac{p_z^2 + p_x^2 - l_1^2 - l_2^2}{2 l_1 l_2} \right) \\ \theta_1 &= \frac{-p_z l_2 \sin(\theta_2) + p_x \left( l_1 + l_2 \cos(\theta_2) \right)}{p_x l_2 \sin(\theta_2) + p_z \left( l_1 + l_2 \cos(\theta_2) \right)} \end{align*} \]

除此之外,还存在多解、无解的问题。


Pasted image 20260130172205.png

通用 N 连杆反向运动学(IK, Inverse Kinematics)问题的数值解法

  • 选择初始配置(Choose an initial configuration):为所有关节设定初始角度,作为迭代优化的起点(通常可使用当前关节状态或自然姿态)。
  • 定义误差度量(Define an error metric):例如目标位置(goal)与当前末端位置(current position)的距离平方,用于量化末端点与目标的偏差程度。
  • 计算误差关于配置的梯度(Compute gradient of error as function of configuration):分析每个关节角度变化对误差的影响,得到误差的梯度方向(核心是计算雅可比矩阵(Jacobian Matrix))。
  • 应用梯度下降(或牛顿法等优化算法)(Apply gradient descent (or Newton’s method, or other optimization procedure)):沿梯度的反方向迭代调整关节角度,逐步减小误差,直到末端点足够接近目标位置。

4 角色动画

4.1 角色绑定(Rigging)

角色绑定(Rigging)是为角色创建的一套高级控制(higher level controls)系统,可让动画师更快速、直观地修改角色的姿态(pose)、形变(deformations)、表情(expression)等。
核心特点(Important)

  • 像木偶上的提线(strings on a puppet):控制逻辑类似木偶提线,通过上层控制驱动底层骨骼与形变,无需直接调整每个关节。
  • 覆盖所有有意义的角色变化(Captures all meaningful character changes)
  • 因角色而异(Varies from character to character)
    制作成本高的原因(Expensive to create)

  • 依赖大量人工操作(Manual effort)

  • 要求兼具艺术与技术能力(Requires both artistic and technical training)

Pasted image 20260130173057.png

4.2 形态键(Blend Shapes)

融合变形(Blend Shape / Morph Target)
不依赖骨骼(skeleton),直接在不同表面(surfaces)之间进行插值。比如建模一系列面部表情:

  • 最简单的方案:对顶点位置进行线性组合(linear combination)
  • 使用样条曲线(Spline)来控制权重随时间的变化

4.3 动作捕捉(Motion Capture)

数据驱动式动画序列生成(Data-driven approach to creating animation sequences)

  • 记录现实世界中的动作表演(Record real-world performances):例如让演员执行目标动作(如跑步、打斗、表情变化)。
  • 从采集的数据中提取随时间变化的姿态(Extract pose as a function of time from the data collected)

优点(Strengths)

  • 可快速捕捉大量真实数据(Can capture large amounts of real data quickly)
  • 真实度极高(Realism can be high)
    缺点(Weaknesses)

  • 设备与场景搭建复杂且成本高昂(Complex and costly set-ups)

  • 捕捉的动画可能不符合艺术需求,需要二次修改(Captured animation may not meet artistic needs, requiring alterations)

Pasted image 20260130173722.png

动捕设备可能通过光学(即视觉)、磁场、机械等方式来采集运动数据。
最一般的方法就是再运动的人体贴上小球,通过相机甚至更高级的设备记录这些小球的运动信息。
《阿凡达》是电影史上的一块里程碑,一部分是因为它最先使用了面部动捕。


Pasted image 20260130174246.png

VFX:Visual Effects,视觉效果,视效

评论

如果你已登录 GitHub,就可以直接在这里评论。