第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
性能消耗:低 ────────────────────────────→ 高
精度: 低 ────────────────────────────→ 高
优化策略:
- 尽可能使用简单形状
- 复杂模型使用 Convex Hull
- 只在必要时使用 Mesh 碰撞
- 合理设置 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:限制碰撞冲量,防止爆炸
碰撞对象优化:
- 使用简化的碰撞网格
- 增加 Thickness 避免穿透
- 合理设置 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 内置的破碎工具:
破碎方式:
- 点云分布:随机或自定义点
- Voronoi 图:生成自然的碎片形状
- 递归细分:创建层次化破碎
破碎层次示意:
原始物体 → 大碎片 → 中碎片 → 小碎片
■ → ◆ ◆ → ▪▪ ▪▪ → ∙∙∙∙
→ ◆ ◆ → ▪▪ ▪▪ → ∙∙∙∙
14.5.2 破碎参数优化
Source Limit:控制碎片数量,平衡细节和性能。
Noise:添加随机性,让破碎更自然。
Margin:碎片间距,防止初始相交。
Material Index:为内部面指定不同材质。
14.5.3 动态破碎控制
阈值触发:
- 速度阈值:当碰撞速度超过设定值时破碎
- 力量阈值:受力超过临界值触发
- 距离触发:靠近特定物体时破碎
级联破碎:
- 初始冲击产生大碎片
- 大碎片继续破碎成中等碎片
- 根据能量递减逐级破碎
14.5.4 碎片物理设置
质量分配:根据体积自动计算各碎片质量。
约束强度:
- 初始约束保持碎片连接
- 逐渐减弱或瞬间断裂
- 不同材质的断裂特性
碎片激活:
- Animated:破碎前作为整体
- Active:破碎后独立运动
- Deactivation:静止后停止计算
14.6 物理系统集成
14.6.1 多系统协作
Blender 允许多个物理系统同时工作:
系统优先级:
- 力场(Force Fields):全局影响
- 刚体(Rigid Body):硬质物体碰撞
- 软体(Soft Body):弹性变形
- 布料(Cloth):织物特性
- 流体(Fluid):液体气体
交互矩阵:
刚体 软体 布料 流体
刚体 ✓ ✓ ✓ ✓
软体 ✓ ✗ △ △
布料 ✓ △ ✗ ✓
流体 ✓ △ ✓ ✓
✓ = 完全支持 △ = 部分支持 ✗ = 不支持
14.6.2 缓存管理策略
物理模拟依赖缓存系统存储计算结果:
缓存类型:
- Memory Cache:内存缓存,快速但容量有限
- Disk Cache:磁盘缓存,容量大但速度较慢
缓存工作流:
- Bake:完整计算并存储
- Free:释放缓存重新计算
- Current Cache to Bake:将预览转为最终
- Bake All Dynamics:批量烘焙所有物理
14.6.3 性能优化技巧
LOD 策略:
- 远景使用简化碰撞体
- 近景使用完整物理
- 视野外暂停计算
时间步长优化:
场景类型 子步数 时间缩放
快速运动 20 1.0
正常运动 10 1.0
慢动作 5 0.1
超慢动作 2 0.01
分层计算:
- 主要物体高精度
- 次要物体中等精度
- 背景物体低精度或预烘焙
14.6.4 调试与故障排除
常见问题诊断:
爆炸现象:
- 降低时间步长
- 增加子步数
- 检查初始穿透
穿透问题:
- 增加碰撞 Margin
- 提高 Quality Steps
- 使用 Thickness
不稳定振荡:
- 增加阻尼
- 降低刚度
- 检查约束设置
本章小结
本章深入学习了 Blender 的物理模拟系统,掌握了从刚体碰撞到流体动力学的完整工作流程。主要知识点包括:
-
刚体系统:理解了 Active、Passive、Animated 三种刚体类型的区别,掌握了质量、摩擦、弹性等关键参数的设置方法,学会了使用约束系统创建机械结构。
-
软体模拟:学习了弹簧质点系统的原理,掌握了 Goal 功能实现局部软体效果,理解了自碰撞和边缘碰撞的优化策略。
-
布料系统:熟悉了不同织物材质的参数特征,掌握了缝合、固定、压力等高级控制技术,学会了碰撞优化提高性能。
-
流体模拟:理解了 Mantaflow 引擎的工作原理,掌握了烟雾、火焰、液体的参数设置,学会了 FLIP 粒子和网格生成控制表面细节。
-
破碎效果:掌握了 Cell Fracture 工具的使用,理解了 Voronoi 破碎原理,学会了动态破碎和级联破碎的实现方法。
-
系统集成:理解了多物理系统的协作机制,掌握了缓存管理和性能优化策略,学会了常见问题的诊断和解决方法。
物理模拟的核心是在真实感和性能之间找到平衡。记住:先用简单设置快速迭代,确定效果后再提高精度;合理使用缓存避免重复计算;多个物理系统配合使用可以创造出令人惊叹的效果。
练习题
基础题
练习 14.1:刚体多米诺骨牌 创建一组多米诺骨牌(至少20个),设置合适的物理参数,实现连锁倒塌效果。
- Hint:注意调整摩擦力和质量,使用 Array Modifier 快速创建骨牌
参考答案
- 创建单个骨牌(缩放的立方体)
- 添加 Array Modifier,设置间距为骨牌高度的 0.7 倍
- Apply Modifier 后分离为独立物体
- 全选添加 Rigid Body(Active)
- 设置参数:Mass=0.1, Friction=0.8, Bounciness=0.1
- 第一个骨牌添加关键帧动画触发倒塌
- 调整 Scene 的 Rigid Body World 的 Speed 控制速度
练习 14.2:弹力球落地 创建一个弹力球从 10 米高处落到地面,要求反弹至少 3 次,每次高度递减。
- Hint:关键在于 Bounciness 和 Damping 的平衡
参考答案
- 创建 UV Sphere 作为球体
- 创建 Plane 作为地面,添加 Rigid Body(Passive)
- 球体添加 Rigid Body(Active)
- 设置球体参数: - Mass = 1.0 - Bounciness = 0.7(不要设为1避免永动) - Friction = 0.3 - Linear Damping = 0.04 - Angular Damping = 0.1
- 将球体移到 Z=10 位置
- 播放动画观察反弹效果
练习 14.3:简单布料悬挂 创建一块方形布料,固定两个顶角,模拟自然悬挂效果。
- Hint:使用 Vertex Group 和 Pinning 功能
参考答案
- 创建 Plane,细分 50x50
- 进入 Edit Mode,选择两个顶角顶点
- 创建 Vertex Group 命名为 "Pin"
- 添加 Cloth 修改器
- Shape 面板中设置 Pin Group 为 "Pin"
- 使用 Cotton 预设作为基础
- 调整 Quality Steps = 10
- 播放动画查看悬挂效果
练习 14.4:烟雾上升效果 创建一个简单的烟雾从圆柱体顶部上升的效果。
- Hint:注意 Temperature Difference 和 Vorticity
参考答案
- 创建 Cube 作为 Domain,缩放至合适大小
- 添加 Fluid 修改器,Type = Gas,分辨率 = 64
- 创建 Cylinder 作为烟雾源
- 为 Cylinder 添加 Fluid 修改器,Type = Flow,Flow Type = Smoke
- 设置 Flow Source: - Surface Emission = 1.0 - Temperature Difference = 2.0
- Domain 设置: - Vorticity = 0.1 - Buoyancy Density = 2.0
- 烘焙并查看效果
挑战题
练习 14.5:链条摆动系统 创建一条由 10 个环组成的链条,顶端固定,底端挂一个重物,实现真实的摆动效果。
- Hint:使用 Rigid Body Constraints 连接各个环节
参考答案
- 创建 Torus 作为链环,复制 10 个
- 交错排列形成链条结构
- 所有链环添加 Rigid Body(Active),除了第一个设为 Animated
- 在每两个相邻链环之间添加 Empty
- 为 Empty 添加 Rigid Body Constraint(Point)
- 设置 Constraint 的两个目标为相邻链环
- 底部添加 Sphere 作为重物,Mass = 5.0
- 用 Constraint 连接最后一个链环和重物
- 给第一个链环添加旋转关键帧启动摆动
- 调整 Linear Damping = 0.02 模拟空气阻力
练习 14.6:衣服飘动动画 创建一个角色(可用简单圆柱体代替)穿着披风,在风中行走的动画。
- Hint:结合 Wind Force Field 和 Collision
参考答案
- 创建简化角色模型(圆柱体 + 球体)
- 创建披风:Plane 细分 80x80,放置在角色背后
- 选择披风顶部边缘顶点创建 Pin Group
- 添加 Cloth 修改器,设置 Silk 预设
- 角色添加 Collision 修改器
- 创建 Wind Force Field: - Strength = 500 - Flow = 0.1 - Noise = 0.5
- 为角色创建向前行走动画
- 调整披风参数: - Air Viscosity = 2.0 - Quality Steps = 15
- 烘焙查看飘动效果
练习 14.7:玻璃破碎特效 创建一块玻璃被球体撞击后破碎的效果,要求碎片自然飞散。
- Hint:Cell Fracture + Rigid Body + 关键帧控制
参考答案
- 创建 Plane 作为玻璃,适当缩放
- 使用 Cell Fracture 插件: - Source Limit = 100 - Noise = 0.25 - Margin = 0.001
- 所有碎片添加 Rigid Body(Active)
- 创建 Sphere 作为撞击物,Rigid Body(Animated)
- 在碰撞前一帧: - 碎片设为 Animated - 使用 Rigid Body Constraints 连接碎片
- 碰撞时刻: - 碎片改为 Active - Constraints 设置 Breaking Threshold
- 球体参数:Mass = 10, 设置运动路径
- 添加 Gravity 和轻微的 Turbulence Field
- 调整碎片的 Linear/Angular Damping = 0.4
练习 14.8:水花四溅效果 创建一个物体落入水中产生水花的完整效果。
- Hint:FLIP 流体 + Obstacle + 二次粒子系统
参考答案
- 创建 Domain(大立方体),Fluid Type = Liquid
- 设置分辨率 = 128,FLIP Ratio = 0.95
- 创建水体:Domain 内部的立方体,Flow Type = Geometry
- 创建落体:Sphere,添加 Fluid(Effector)
- 为落体创建下落动画
- Domain 粒子设置: - Generate Particles = Spray + Foam + Bubble - Particle Maximum = 10000 - Threshold = 2.0
- 网格设置: - Mesh Upres Factor = 2 - Particle Radius = 1.5
- 烘焙 Data 和 Mesh
- 为二次粒子创建材质: - Spray:小水滴 - Foam:白色泡沫 - Bubble:透明气泡
- 渲染设置运动模糊增强动感
常见陷阱与错误
刚体模拟陷阱
-
初始穿透:物体在第一帧就相交会导致爆炸,始终检查初始位置。
-
Scale 应用:忘记应用 Scale 会导致物理计算错误,Ctrl+A 应用变换。
-
Origin 点位置:刚体以 Origin 为中心计算,错误的 Origin 导致奇怪旋转。
布料模拟陷阱
-
顶点数过多:超过 10000 个顶点的布料计算极慢,使用 Decimate 优化。
-
Self Collision 过度:不必要的自碰撞严重影响性能,简单布料可关闭。
-
Pin Group 权重:权重不是 0 或 1 会导致拉伸,检查 Weight Paint。
流体模拟陷阱
-
Domain 太小:流体超出 Domain 会消失,预留足够空间。
-
分辨率误区:分辨率不是越高越好,128-256 对大多数场景足够。
-
缓存覆盖:修改参数后忘记清除缓存,导致结果不更新。
破碎效果陷阱
-
碎片数量失控:递归破碎容易产生数千碎片,设置合理上限。
-
Margin 设置:过小导致碎片粘连,过大产生明显缝隙。
-
约束强度:太强永不破碎,太弱立即散架,需要反复测试。
最佳实践检查清单
项目开始前
- [ ] 确定场景单位和比例
- [ ] 规划物理系统组合
- [ ] 设置合理的帧率(24/30/60 fps)
- [ ] 创建测试场景快速迭代
- [ ] 备份原始模型
建模阶段
- [ ] 应用所有 Transform(Scale、Rotation)
- [ ] 检查 Normal 方向
- [ ] 设置正确的 Origin 点
- [ ] 为碰撞创建简化版本
- [ ] 合理控制多边形数量
模拟设置
- [ ] 从低分辨率开始测试
- [ ] 逐步增加复杂度
- [ ] 为不同系统设置优先级
- [ ] 合理设置子步数
- [ ] 使用预设作为起点
优化阶段
- [ ] 视野外物体暂停计算
- [ ] 远景使用预烘焙
- [ ] 简化碰撞形状
- [ ] 合并相似材质的物体
- [ ] 控制粒子数量上限
缓存管理
- [ ] 设置独立缓存文件夹
- [ ] 定期清理旧缓存
- [ ] 重要阶段备份缓存
- [ ] 使用外部驱动器存储大缓存
- [ ] 记录每次烘焙的参数
渲染准备
- [ ] 检查所有物理系统已烘焙
- [ ] 设置运动模糊采样
- [ ] 优化粒子渲染设置
- [ ] 准备多层渲染用于合成
- [ ] 最终质量检查