第14章:物理模拟与动力学

物理模拟是 Blender 中最强大的功能之一,它能够自动计算物体的运动、碰撞、变形等行为,让动画更加真实自然。本章将深入探讨 Blender 的各种物理系统,包括刚体、软体、布料、流体等模拟技术。通过学习这些工具,您将能够创建逼真的破坏效果、飘动的布料、流动的液体等复杂动画,大大提升作品的视觉冲击力。与传统的手动关键帧动画相比,物理模拟可以自动生成符合物理规律的运动,不仅节省时间,还能产生意想不到的自然效果。

14.1 刚体模拟基础

14.1.1 刚体物理原理

刚体模拟用于模拟不会变形的硬质物体,如石块、木头、金属等。Blender 使用 Bullet 物理引擎进行刚体计算,能够精确模拟重力、碰撞、摩擦等物理现象。

刚体类型:
┌─────────────┬──────────────────────────┐
│   Active    │ 受物理影响,可以运动      │
│   Passive   │ 不受物理影响,作为障碍物   │
│   Animated  │ 通过关键帧控制,影响其他物体│
└─────────────┴──────────────────────────┘

14.1.2 设置刚体属性

在物理属性面板中,可以调整刚体的各种参数:

质量(Mass):物体的重量,影响惯性和碰撞力度。较重的物体更难被推动,碰撞时产生更大的冲击力。

摩擦力(Friction):表面粗糙度,决定物体滑动的难易程度。冰面摩擦力接近0,橡胶摩擦力接近1。

弹性(Bounciness):碰撞后的反弹程度。0表示完全不反弹,1表示完全弹性碰撞。

阻尼(Damping)

  • 线性阻尼:减缓直线运动
  • 角阻尼:减缓旋转运动

14.1.3 碰撞形状优化

选择合适的碰撞形状对性能至关重要:

碰撞形状复杂度(从简单到复杂):
    Box → Sphere → Capsule → Convex Hull → Mesh

性能消耗:低 ────────────────────────────→ 高
精度:    低 ────────────────────────────→ 高

优化策略

  1. 尽可能使用简单形状
  2. 复杂模型使用 Convex Hull
  3. 只在必要时使用 Mesh 碰撞
  4. 合理设置 Margin 值避免穿透

14.1.4 刚体约束系统

约束(Constraints)用于连接刚体,创建机械结构:

固定约束(Fixed):完全锁定两个物体的相对位置和旋转。

点约束(Point):允许物体围绕连接点自由旋转,类似球形关节。

铰链约束(Hinge):限制在一个轴上旋转,如门铰链。

滑动约束(Slider):沿一个轴滑动,如抽屉导轨。

活塞约束(Piston):结合旋转和滑动,如螺丝运动。

通用约束(Generic):提供六个自由度的完全控制。

14.2 软体模拟系统

14.2.1 软体变形原理

软体模拟用于创建可变形的弹性物体,如橡胶、果冻、肌肉等。系统将物体视为由弹簧连接的质点系统:

软体结构示意:
    ●───●───●
    │ × │ × │    ● = 质点
    ●───●───●    ─ = 结构弹簧
    │ × │ × │    × = 剪切弹簧
    ●───●───●

14.2.2 软体参数设置

质量(Mass):每个顶点的质量,影响整体重量分布。

速度(Speed):模拟计算的时间缩放,调整动画快慢。

摩擦(Friction):空气阻力,防止无限振荡。

弹簧参数

  • Pull:拉伸刚度
  • Push:压缩刚度
  • Damp:弹簧阻尼
  • Plastic:塑性变形阈值
  • Bending:弯曲刚度

14.2.3 目标形状控制

使用 Goal 功能可以让软体部分保持原始形状:

Goal Strength:目标强度,0-1之间,决定保持原形的力度。

Goal Weight:通过顶点组控制不同部位的目标强度,实现局部软体效果。

应用场景:

  • 角色肌肉的局部变形
  • 部分固定的软体结构
  • 渐变刚度的物体

14.2.4 软体碰撞设置

软体的自碰撞和外部碰撞需要仔细调整:

自碰撞(Self Collision)

  • Ball Size:碰撞球大小
  • Stiffness:碰撞刚度
  • Damping:碰撞阻尼

边缘碰撞(Edge Collision):防止边缘穿透,特别适用于薄片状软体。

面碰撞(Face Collision):检测面与面的碰撞,计算量较大。

14.3 布料模拟系统

14.3.1 布料物理特性

Blender 的布料系统专门优化用于织物模拟,支持各种材质特性:

常见布料预设参数:
┌──────────┬────────┬─────────┬─────────┐
│  材质     │ 密度   │ 刚度    │ 阻尼    │
├──────────┼────────┼─────────┼─────────┤
│ 棉布     │  0.3   │  15     │  5      │
│ 丝绸     │  0.1   │  5      │  2      │
│ 牛仔布   │  0.5   │  30     │  8      │
│ 皮革     │  0.8   │  50     │  15     │
│ 橡胶     │  1.0   │  80     │  25     │
└──────────┴────────┴─────────┴─────────┘

14.3.2 布料形状控制

缝合(Sewing):模拟真实的缝制过程,将分离的布片连接成衣服。

固定(Pinning):通过顶点组固定布料的某些部分,如衣领、袖口。

压力(Pressure):模拟内部压力,用于充气物体如气球、枕头。

收缩/增长(Shrinking/Growing):动态改变布料尺寸,模拟收缩或膨胀效果。

14.3.3 布料碰撞优化

布料碰撞是性能瓶颈,需要合理优化:

质量细分(Quality Steps)

  • 更高的步数提供更准确的模拟
  • 建议值:5-10 用于预览,15-30 用于最终渲染

碰撞质量(Collision Quality)

  • Distance:碰撞检测距离
  • Impulse Clamping:限制碰撞冲量,防止爆炸

碰撞对象优化

  1. 使用简化的碰撞网格
  2. 增加 Thickness 避免穿透
  3. 合理设置 Friction 和 Damping

14.3.4 高级布料技术

内部弹簧(Internal Springs):创建更复杂的布料结构,如多层织物。

动态网格(Dynamic Mesh):运行时自适应细分,提高褶皱细节。

力场交互(Force Field Interaction):让布料响应风力、涡流等外部力场。

14.4 流体与烟雾模拟

14.4.1 流体域设置

Mantaflow 是 Blender 的流体引擎,支持液体和气体模拟:

流体系统组成:
┌────────────────────────────┐
│         Domain             │
│  ┌──────┐  ┌──────────┐  │
│  │ Flow │→ │  Solver  │   │
│  └──────┘  └──────────┘   │
│  ┌──────────┐  ↓          │
│  │ Effector │  Output     │
│  └──────────┘              │
└────────────────────────────┘

域(Domain)类型

  • Gas:烟雾、火焰模拟
  • Liquid:水、油等液体
  • 分辨率划分:32-512,越高越精细

14.4.2 流体源设置

流入(Inflow):持续产生流体

  • 流量控制
  • 温度差异
  • 初始速度

流出(Outflow):删除接触的流体

几何体(Geometry):使用物体形状作为初始流体

14.4.3 烟雾与火焰

烟雾模拟的关键参数:

浮力(Buoyancy)

  • 密度差:冷热空气的上升下沉
  • 温度差:火焰的上升速度
  • Alpha:烟雾透明度
  • Beta:温度扩散率

涡度(Vorticity):增加湍流细节,让烟雾更真实。

火焰设置

  • Reaction Speed:燃烧速度
  • Flame Smoke:火焰产生的烟雾量
  • Temperature:火焰温度,影响颜色和上升速度
  • Ignition:点火温度阈值

14.4.4 液体表面细节

FLIP 粒子

  • 用于跟踪液体表面
  • 粒子半径影响细节程度
  • 窄带宽度控制计算区域

网格生成

  • Upres Factor:上采样因子,提高表面细节
  • Particle Radius:影响表面平滑度
  • Concave Upper/Lower:控制凹面生成

泡沫与飞溅

  • Foam:泡沫粒子
  • Spray:飞溅水花
  • Bubble:气泡粒子

14.5 破碎效果制作

14.5.1 Cell Fracture 插件

Cell Fracture 是 Blender 内置的破碎工具:

破碎方式

  1. 点云分布:随机或自定义点
  2. Voronoi 图:生成自然的碎片形状
  3. 递归细分:创建层次化破碎
破碎层次示意:
原始物体 → 大碎片 → 中碎片 → 小碎片
  ■      →  ◆ ◆    → ▪▪ ▪▪ → ∙∙∙∙
         →  ◆ ◆    → ▪▪ ▪▪ → ∙∙∙∙

14.5.2 破碎参数优化

Source Limit:控制碎片数量,平衡细节和性能。

Noise:添加随机性,让破碎更自然。

Margin:碎片间距,防止初始相交。

Material Index:为内部面指定不同材质。

14.5.3 动态破碎控制

阈值触发

  • 速度阈值:当碰撞速度超过设定值时破碎
  • 力量阈值:受力超过临界值触发
  • 距离触发:靠近特定物体时破碎

级联破碎

  1. 初始冲击产生大碎片
  2. 大碎片继续破碎成中等碎片
  3. 根据能量递减逐级破碎

14.5.4 碎片物理设置

质量分配:根据体积自动计算各碎片质量。

约束强度

  • 初始约束保持碎片连接
  • 逐渐减弱或瞬间断裂
  • 不同材质的断裂特性

碎片激活

  • Animated:破碎前作为整体
  • Active:破碎后独立运动
  • Deactivation:静止后停止计算

14.6 物理系统集成

14.6.1 多系统协作

Blender 允许多个物理系统同时工作:

系统优先级

  1. 力场(Force Fields):全局影响
  2. 刚体(Rigid Body):硬质物体碰撞
  3. 软体(Soft Body):弹性变形
  4. 布料(Cloth):织物特性
  5. 流体(Fluid):液体气体

交互矩阵

         刚体  软体  布料  流体
刚体      ✓    ✓    ✓    ✓
软体      ✓    ✗    △    △
布料      ✓    △    ✗    ✓
流体      ✓    △    ✓    ✓

✓ = 完全支持  △ = 部分支持  ✗ = 不支持

14.6.2 缓存管理策略

物理模拟依赖缓存系统存储计算结果:

缓存类型

  • Memory Cache:内存缓存,快速但容量有限
  • Disk Cache:磁盘缓存,容量大但速度较慢

缓存工作流

  1. Bake:完整计算并存储
  2. Free:释放缓存重新计算
  3. Current Cache to Bake:将预览转为最终
  4. Bake All Dynamics:批量烘焙所有物理

14.6.3 性能优化技巧

LOD 策略

  • 远景使用简化碰撞体
  • 近景使用完整物理
  • 视野外暂停计算

时间步长优化

场景类型        子步数  时间缩放
快速运动         20      1.0
正常运动         10      1.0
慢动作           5       0.1
超慢动作         2       0.01

分层计算

  1. 主要物体高精度
  2. 次要物体中等精度
  3. 背景物体低精度或预烘焙

14.6.4 调试与故障排除

常见问题诊断

爆炸现象:

  • 降低时间步长
  • 增加子步数
  • 检查初始穿透

穿透问题:

  • 增加碰撞 Margin
  • 提高 Quality Steps
  • 使用 Thickness

不稳定振荡:

  • 增加阻尼
  • 降低刚度
  • 检查约束设置

本章小结

本章深入学习了 Blender 的物理模拟系统,掌握了从刚体碰撞到流体动力学的完整工作流程。主要知识点包括:

  1. 刚体系统:理解了 Active、Passive、Animated 三种刚体类型的区别,掌握了质量、摩擦、弹性等关键参数的设置方法,学会了使用约束系统创建机械结构。

  2. 软体模拟:学习了弹簧质点系统的原理,掌握了 Goal 功能实现局部软体效果,理解了自碰撞和边缘碰撞的优化策略。

  3. 布料系统:熟悉了不同织物材质的参数特征,掌握了缝合、固定、压力等高级控制技术,学会了碰撞优化提高性能。

  4. 流体模拟:理解了 Mantaflow 引擎的工作原理,掌握了烟雾、火焰、液体的参数设置,学会了 FLIP 粒子和网格生成控制表面细节。

  5. 破碎效果:掌握了 Cell Fracture 工具的使用,理解了 Voronoi 破碎原理,学会了动态破碎和级联破碎的实现方法。

  6. 系统集成:理解了多物理系统的协作机制,掌握了缓存管理和性能优化策略,学会了常见问题的诊断和解决方法。

物理模拟的核心是在真实感和性能之间找到平衡。记住:先用简单设置快速迭代,确定效果后再提高精度;合理使用缓存避免重复计算;多个物理系统配合使用可以创造出令人惊叹的效果。

练习题

基础题

练习 14.1:刚体多米诺骨牌 创建一组多米诺骨牌(至少20个),设置合适的物理参数,实现连锁倒塌效果。

  • Hint:注意调整摩擦力和质量,使用 Array Modifier 快速创建骨牌
参考答案
  1. 创建单个骨牌(缩放的立方体)
  2. 添加 Array Modifier,设置间距为骨牌高度的 0.7 倍
  3. Apply Modifier 后分离为独立物体
  4. 全选添加 Rigid Body(Active)
  5. 设置参数:Mass=0.1, Friction=0.8, Bounciness=0.1
  6. 第一个骨牌添加关键帧动画触发倒塌
  7. 调整 Scene 的 Rigid Body World 的 Speed 控制速度

练习 14.2:弹力球落地 创建一个弹力球从 10 米高处落到地面,要求反弹至少 3 次,每次高度递减。

  • Hint:关键在于 Bounciness 和 Damping 的平衡
参考答案
  1. 创建 UV Sphere 作为球体
  2. 创建 Plane 作为地面,添加 Rigid Body(Passive)
  3. 球体添加 Rigid Body(Active)
  4. 设置球体参数: - Mass = 1.0 - Bounciness = 0.7(不要设为1避免永动) - Friction = 0.3 - Linear Damping = 0.04 - Angular Damping = 0.1
  5. 将球体移到 Z=10 位置
  6. 播放动画观察反弹效果

练习 14.3:简单布料悬挂 创建一块方形布料,固定两个顶角,模拟自然悬挂效果。

  • Hint:使用 Vertex Group 和 Pinning 功能
参考答案
  1. 创建 Plane,细分 50x50
  2. 进入 Edit Mode,选择两个顶角顶点
  3. 创建 Vertex Group 命名为 "Pin"
  4. 添加 Cloth 修改器
  5. Shape 面板中设置 Pin Group 为 "Pin"
  6. 使用 Cotton 预设作为基础
  7. 调整 Quality Steps = 10
  8. 播放动画查看悬挂效果

练习 14.4:烟雾上升效果 创建一个简单的烟雾从圆柱体顶部上升的效果。

  • Hint:注意 Temperature Difference 和 Vorticity
参考答案
  1. 创建 Cube 作为 Domain,缩放至合适大小
  2. 添加 Fluid 修改器,Type = Gas,分辨率 = 64
  3. 创建 Cylinder 作为烟雾源
  4. 为 Cylinder 添加 Fluid 修改器,Type = Flow,Flow Type = Smoke
  5. 设置 Flow Source: - Surface Emission = 1.0 - Temperature Difference = 2.0
  6. Domain 设置: - Vorticity = 0.1 - Buoyancy Density = 2.0
  7. 烘焙并查看效果

挑战题

练习 14.5:链条摆动系统 创建一条由 10 个环组成的链条,顶端固定,底端挂一个重物,实现真实的摆动效果。

  • Hint:使用 Rigid Body Constraints 连接各个环节
参考答案
  1. 创建 Torus 作为链环,复制 10 个
  2. 交错排列形成链条结构
  3. 所有链环添加 Rigid Body(Active),除了第一个设为 Animated
  4. 在每两个相邻链环之间添加 Empty
  5. 为 Empty 添加 Rigid Body Constraint(Point)
  6. 设置 Constraint 的两个目标为相邻链环
  7. 底部添加 Sphere 作为重物,Mass = 5.0
  8. 用 Constraint 连接最后一个链环和重物
  9. 给第一个链环添加旋转关键帧启动摆动
  10. 调整 Linear Damping = 0.02 模拟空气阻力

练习 14.6:衣服飘动动画 创建一个角色(可用简单圆柱体代替)穿着披风,在风中行走的动画。

  • Hint:结合 Wind Force Field 和 Collision
参考答案
  1. 创建简化角色模型(圆柱体 + 球体)
  2. 创建披风:Plane 细分 80x80,放置在角色背后
  3. 选择披风顶部边缘顶点创建 Pin Group
  4. 添加 Cloth 修改器,设置 Silk 预设
  5. 角色添加 Collision 修改器
  6. 创建 Wind Force Field: - Strength = 500 - Flow = 0.1 - Noise = 0.5
  7. 为角色创建向前行走动画
  8. 调整披风参数: - Air Viscosity = 2.0 - Quality Steps = 15
  9. 烘焙查看飘动效果

练习 14.7:玻璃破碎特效 创建一块玻璃被球体撞击后破碎的效果,要求碎片自然飞散。

  • Hint:Cell Fracture + Rigid Body + 关键帧控制
参考答案
  1. 创建 Plane 作为玻璃,适当缩放
  2. 使用 Cell Fracture 插件: - Source Limit = 100 - Noise = 0.25 - Margin = 0.001
  3. 所有碎片添加 Rigid Body(Active)
  4. 创建 Sphere 作为撞击物,Rigid Body(Animated)
  5. 在碰撞前一帧: - 碎片设为 Animated - 使用 Rigid Body Constraints 连接碎片
  6. 碰撞时刻: - 碎片改为 Active - Constraints 设置 Breaking Threshold
  7. 球体参数:Mass = 10, 设置运动路径
  8. 添加 Gravity 和轻微的 Turbulence Field
  9. 调整碎片的 Linear/Angular Damping = 0.4

练习 14.8:水花四溅效果 创建一个物体落入水中产生水花的完整效果。

  • Hint:FLIP 流体 + Obstacle + 二次粒子系统
参考答案
  1. 创建 Domain(大立方体),Fluid Type = Liquid
  2. 设置分辨率 = 128,FLIP Ratio = 0.95
  3. 创建水体:Domain 内部的立方体,Flow Type = Geometry
  4. 创建落体:Sphere,添加 Fluid(Effector)
  5. 为落体创建下落动画
  6. Domain 粒子设置: - Generate Particles = Spray + Foam + Bubble - Particle Maximum = 10000 - Threshold = 2.0
  7. 网格设置: - Mesh Upres Factor = 2 - Particle Radius = 1.5
  8. 烘焙 Data 和 Mesh
  9. 为二次粒子创建材质: - Spray:小水滴 - Foam:白色泡沫 - Bubble:透明气泡
  10. 渲染设置运动模糊增强动感

常见陷阱与错误

刚体模拟陷阱

  1. 初始穿透:物体在第一帧就相交会导致爆炸,始终检查初始位置。

  2. Scale 应用:忘记应用 Scale 会导致物理计算错误,Ctrl+A 应用变换。

  3. Origin 点位置:刚体以 Origin 为中心计算,错误的 Origin 导致奇怪旋转。

布料模拟陷阱

  1. 顶点数过多:超过 10000 个顶点的布料计算极慢,使用 Decimate 优化。

  2. Self Collision 过度:不必要的自碰撞严重影响性能,简单布料可关闭。

  3. Pin Group 权重:权重不是 0 或 1 会导致拉伸,检查 Weight Paint。

流体模拟陷阱

  1. Domain 太小:流体超出 Domain 会消失,预留足够空间。

  2. 分辨率误区:分辨率不是越高越好,128-256 对大多数场景足够。

  3. 缓存覆盖:修改参数后忘记清除缓存,导致结果不更新。

破碎效果陷阱

  1. 碎片数量失控:递归破碎容易产生数千碎片,设置合理上限。

  2. Margin 设置:过小导致碎片粘连,过大产生明显缝隙。

  3. 约束强度:太强永不破碎,太弱立即散架,需要反复测试。

最佳实践检查清单

项目开始前

  • [ ] 确定场景单位和比例
  • [ ] 规划物理系统组合
  • [ ] 设置合理的帧率(24/30/60 fps)
  • [ ] 创建测试场景快速迭代
  • [ ] 备份原始模型

建模阶段

  • [ ] 应用所有 Transform(Scale、Rotation)
  • [ ] 检查 Normal 方向
  • [ ] 设置正确的 Origin 点
  • [ ] 为碰撞创建简化版本
  • [ ] 合理控制多边形数量

模拟设置

  • [ ] 从低分辨率开始测试
  • [ ] 逐步增加复杂度
  • [ ] 为不同系统设置优先级
  • [ ] 合理设置子步数
  • [ ] 使用预设作为起点

优化阶段

  • [ ] 视野外物体暂停计算
  • [ ] 远景使用预烘焙
  • [ ] 简化碰撞形状
  • [ ] 合并相似材质的物体
  • [ ] 控制粒子数量上限

缓存管理

  • [ ] 设置独立缓存文件夹
  • [ ] 定期清理旧缓存
  • [ ] 重要阶段备份缓存
  • [ ] 使用外部驱动器存储大缓存
  • [ ] 记录每次烘焙的参数

渲染准备

  • [ ] 检查所有物理系统已烘焙
  • [ ] 设置运动模糊采样
  • [ ] 优化粒子渲染设置
  • [ ] 准备多层渲染用于合成
  • [ ] 最终质量检查