1 基本概念与原理

1.1 物理模拟的定义与范畴

物理模拟是一种利用计算机数学模型来近似真实世界物理现象的方法。其范畴涵盖力学(刚体、流体、软体)、电磁学、热传导、声学等多个领域,旨在通过数值计算再现物体在力、场、介质中的运动与相互作用。与理论物理和实验物理不同,物理模拟聚焦于“近似”和“实用”,允许在忽略次要因素前提下,用有限的算力换取可接受的结果。

1.2 物理定律的数学建模

物理定律(如牛顿第二定律、纳维-斯托克斯方程、麦克斯韦方程组)通常以微分方程或积分方程的形式表达。数学建模的过程包括:

  • 抽象化:将实际物体简化为质点、刚体、连续介质理想模型。
  • 参数化:确定质量、刚度、黏度、电导率等关键参数。
  • 边界与初始条件:定义空间范围、约束、初始状态。

建模的好坏直接决定了模拟结果与现实的偏差——偏差太小算不动,太大则变成“魔法模拟”。

1.3 离散化与时间步进方法

连续世界的物理定律无法直接在数字计算机上求解,必须离散化。常见离散化手段包括:

  • 空间离散:将连续区域划分为网格有限差分、有限元)或粒子集合。
  • 时间离散:将连续时间划分为有限的时间步长(Δt)。

时间步进方法分为显式(如欧拉法)和隐式(如向后欧拉法)。显式法计算快但稳定性差,步长过大时模拟会爆炸(物理上表现为物体飞出太阳系);隐式法稳定但需解线性方程组,适合“宁可慢一点也不能炸”的场景。

2 核心算法与技术

2.1 刚体动力学模拟

刚体动力学模拟假设物体在受力时形状不变,重点关注质心平移和绕质心的旋转。核心环节包括碰撞检测和约束求解,两者共同确保刚体不会相互穿透或违反铰链、弹簧等连接条件。

2.1.1 碰撞检测

碰撞检测的目标是判断两个或多个物体是否发生接触,并给出接触点、法向量和穿透深度。按检测方式可分为离散和连续两类。

2.1.1.1 离散碰撞检测

在每个时间步末,检测物体之间是否发生穿透或接触。典型方法包括:

  • 层次包围盒(AABB、OBB、Sphere:用简单几何体包住复杂物体,先快速剔除不相交对。
  • SAT(分离轴定理:对凸体进行精确检测,判断是否存在一条分离轴使投影不重叠。

离散检测效率高,但存在“隧道效应”——物体移动过快时可能直接穿过另一物体而不被检测到(俗称“穿模”)。

2.1.1.2 连续碰撞检测

为了解决隧道效应,连续碰撞检测计算物体在时间步内的运动轨迹,求解首次接触时刻。常用方法:

  • 扫掠体检测:将物体在时间步内的运动路径扫成连续体积(如胶囊体),再与其他物体求交。
  • CCD(连续碰撞检测):通过解析方法或二分法寻找碰撞时间。

连续检测更准确,但计算成本高,适合高速运动物体(如子弹、赛车)或“不想让玩家发现穿模”的严肃模拟。

2.1.2 约束求解技术

碰撞检测后,需要将物体“拉回”合法位置并调整速度,这由约束求解完成。分类:

  • 惩罚力法:当物体穿透时,施加一个与穿透深度成正比的弹簧力将其推开。简单但容易产生抖动和能量不守恒。
  • 冲击法:直接修改速度分量,模拟非弹性或弹性碰撞。常见于游戏引擎(如“速度交换”)。
  • 拉格朗日乘子法/约束空间法:将约束表示为线性或非线性方程,通过求解方程组同时满足所有接触和关节约束。精确但计算量大,适合关节机器人等需要“物理正确”的场景。

2.2 流体模拟

流体模拟模拟液体、气体等介质的流动行为,常需处理湍流、涡旋、自由表面等复杂特征。主要有网格法和粒子法两大流派。

2.2.1 基于网格的方法(如欧拉法)

欧拉法将空间划分为固定网格,在网格点上计算流体的速度、压力、密度等场量。典型算法包括:

  • MAC(Marker-and-Cell):交错网格存储速度与压力,避免压力震荡。
  • FVM(有限体积法:在控制体内积分守恒方程,确保质量和动量守恒。

网格法稳定、适合大规模模拟(如工程CFD),但难以跟踪自由表面(如溅水),且固定网格对复杂几何边界处理繁琐。

2.2.2 粒子方法(如平滑粒子流体动力学)

平滑粒子流体动力学(SPH)将流体离散为一系列携带物理量的粒子,通过核函数插值计算粒子间的相互作用:

  • 密度计算:对邻域粒子质量加权求和。
  • 压力梯度力:由粒子密度差导致的压力推动。
  • 黏性力:平滑速度差异。

SPH天然跟踪自由表面,适合模拟飞溅、水花、瀑布等视觉特效。缺点是粒子数较大时计算昂贵,且音(压力波)速问题需要人工调参来保证稳定性。游戏中的“水坑”大多用SPH的简版(如Taichi流体)来制造效果。

2.3 软体与布料模拟

软体模拟处理可变形的物体(果冻、肌肉、衣物),核心是在保持形状的同时响应外力。常见模型包括弹簧质点模型和有限元方法。

2.3.1 弹簧质点模型

将物体离散为质点网格,质点间用弹簧连接(分为结构弹簧、剪切弹簧、弯曲弹簧)。运动方程由胡克定律和阻尼力给出:

  • 结构弹簧:保持网格边长。
  • 剪切弹簧:抵抗对角拉伸。
  • 弯曲弹簧:抵抗法向折叠。

弹簧质点模型实现简单、计算快,适合布料、旗帜等薄壳物体。其缺点是容易出现局部“超弹性”(伸长过度)和无体积保持,需要额外约束(如体积守恒弹簧)。

2.3.2 有限元方法基础

有限元法(FEM)将物体离散为小单元(四面体、六面体),在每个单元内用形函数近似位移场,通过变分原理建立刚度矩阵。FEM可以精确模拟材料的应力-应变关系(线弹性、超弹性),适合肌肉、内脏等要求体积保持的软体。相比弹簧模型,FEM计算更复杂但物理真实性更高,常用于医学手术模拟和电影中的角色肌肉形变。

2.4 电磁与热模拟简介

电磁模拟基于麦克斯韦方程组,常用时域有限差分(FDTD)或有限元法求解电场和磁场的传播。典型应用包括天线设计、波导计算、电磁兼容分析。热模拟则基于热传导方程或热-力耦合,分析温度场分布、热膨胀和热应力。这些模拟通常对实时性要求不高(除非做“电磁炉煎蛋模拟器”),但在工程仿真中至关重要。

3 应用领域

3.1 游戏与交互式仿真

游戏中的物理模拟追求实时(60帧/秒以上),通常牺牲精度换取速度。典型例子包括“布娃娃系统”(角色死亡后自由坠落)、爆炸飞溅碎片、可破坏场景等。交互式仿真(如VR游戏)还需低延迟,对碰撞检测和约束求解的优化要求极高。玩家最直观的体验是:石头砸碎玻璃很爽,但玻璃碎片穿墙就成了“次元裂缝”。

3.2 电影与视觉效果制作

电影中物理模拟主要服务于视觉美感,不要求实时,但追求视觉真实甚至超真实。流体模拟(雪崩、巨浪)、布料模拟(随风飘动的披风)、破碎模拟(建筑倒塌)是特效团队的核心工具。曾有一部电影的特效团队因为模拟一桶水溅起的形状不符合导演审美,反复迭代了三个月(水:我太难了)。

3.3 工程与科学计算

工程领域利用物理模拟进行产品设计验证:汽车碰撞仿真(刚体+有限元)、建筑风荷载模拟(CFD)、芯片散热分析(热模拟)。这些模拟精度要求极高,通常采用高精度网格和隐式时间步进,算一次可能需要数小时甚至数天。科学计算如天体物理模拟(星系演化)和核反应模拟(等离子体)则使用超算完成。

3.4 虚拟现实与工业训练

VR场景中,物理模拟让手与物体的交互更自然:拿起杯子、按下开关、推动重物。工业训练(如焊接、维修、驾驶)利用物理模拟降低真实设备成本和事故风险。训练模拟器常常需要实时反馈+物理精确,比如“你敲击的螺钉力道不对,它会自行滑丝”——这种模拟能让学员提前体验职业生涯的惨痛教训。

4 软件框架与工具

4.1 商业物理引擎(如PhysX、Havok)

  • NVIDIA PhysX:集成于Unreal Engine等游戏引擎,支持刚体、软布、流体和MPM(物质点法),利用GPU加速。擅长处理“把一堆箱子撞得满天飞”的场景。
  • Havok:老牌引擎,曾用于《光晕》《塞尔达传说》等大作。后来被微软收购,现免费提供基础版。以其稳定高效的碰撞检测和约束求解著称,甚至被军方用于仿真训练。
  • 其他:AME(GameWorks)、Bullet的付费版(Bullet Physics SDK)。

4.2 开源库(如Bullet、Box2D)

  • Bullet Physics:跨平台开源刚体和软体引擎,支持连续碰撞检测,常用于机器人仿真(ROS集成)和3D游戏(如《愤怒的小鸟》的物理引擎前身)。文档丰富但使用门槛略高。
  • Box2D:轻量级2D物理引擎,精于刚体、关节(马达、滑轮)和接触模拟。是《愤怒的小鸟》《Cortex》及大量独立游戏的默认选择。其创始人Erin Catto在GDC上的一句“物理引擎就是所有bug的集合”成为名梗。
  • 其他:Chipmunk(2D)、ReactPhysics3D、Jolt Physics(《地平线》系列所用)。

4.3 编程框架与API(如CUDA、Vulkan)

  • CUDA:NVIDIA提供的GPU通用计算平台,常用于自定义粒子模拟(SPH、MPM)和流体求解。程序员可以“用CUDA造一个高温等离子体,然后看着显卡啸叫”。
  • Vulkan / DirectX 12:底层图形API,支持计算着色器(Compute Shader),可在GPU上实现物理模拟与渲染的一体化流水线。适合对性能有极致追求的引擎开发。
  • 其他:OpenCL(跨平台)、Metal(苹果生态)、SYCL(异构计算标准化)。

5 挑战与发展趋势

5.1 实时性与精度的平衡

这是物理模拟永恒的矛盾。实时应用(游戏、VR)需要牺牲精度换取帧率,常采用近似方法(如粗略碰撞检测、简化约束求解)。而高精度模拟(工程仿真)则可能耗时数小时。一个有趣的尝试是“自适应精度”:在玩家视线焦点区域用高精度模拟,远处用低精度,或根据硬件负载动态调整步长。不过,当玩家发现近处的木桶正确弹跳,远处的木桶却原地抽搐时,这种平衡仍然是一门玄学。

5.2 多物理场耦合模拟

现实中多个物理场(流-固耦合、热-流-结构耦合)互相影响。例如:风吹动旗帜(流-固耦合)、发动机散热导致金属膨胀(热-结构)、水冲击大坝导致破裂(流-固-破碎耦合)。模拟多场耦合的难点在于不同场的空间尺度、时间尺度、数值格式可能完全不匹配。一种思路是“交错求解”(每个场分别求解,再交换边界条件),另一种是“全耦合”(建立统一方程组)。前者稳定但可能引入耦合误差,后者精确但解算器设计如噩梦。

5.3 机器学习与物理模拟的融合

近年来,深度学习开始介入物理模拟:

  • 神经加速:用神经网络替代部分物理求解器(如CFD的湍流模型、粒子系统的邻域搜索),或在低分辨率模拟上使用超分辨率网络补充细节。
  • 数据驱动物理:直接从观测数据中学习物理规律(物理信息神经网络PINN),用于无法显式建模的复杂材料(如泥浆、面团)。
  • 内容生成:用生成模型(GAN、扩散模型)创建物理参数(如地形破坏模式、布料褶皱)后,再用低精度模拟验证。

目前该方向仍是“研究人员兴奋、从业者观望”的状态,因为神经网络偶尔会“创造”出违反能量守恒的新物理(比如物体自己飘起来)。不过,当有一天AI学会正确地模拟一个肥皂泡破裂时,电影特效师们可能会面临二次就业风险。