06 游戏物理

游戏物理的基本概念

物理引擎是现代商业引擎中一个非常重要模块
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映实现包括布料,破碎,粒子等各种酷炫的物理效果

主流的物理引擎

PhysX

  • 属于NVIDA,现已开源,是UE4和Unitl的主要内置物理引擎,使用它的游戏非常多

Havok

  • 老牌的商业引擎,代表作品包括:刺客信条,Doom Eternal,Monster Hunter World等

Chaos

  • Epic Games自研的新一代物理引擎,是UE5的唯一物理引擎

特性包括布料,破坏,双精度等,目前仍处于测试阶段

其他

  • Bullet Physics(开源)
  • Newton Dynamics(开源)

以下如未特别说明,一般以Chaos和PhysX作为代表

游戏物理世界的基本组成

Body和Shape:

  • Body是游戏物理引擎的基本模拟对象,它包含着一些基本状态,例如位置,旋转,动量和角动量等等

  • Body本身没有碰撞功能,碰撞功能是由附着在其之上的Shape提供的,一个Body可同时拥有多个碰撞体,以逼近视觉体验

Simulated

  • 拥有完全模拟特性的Body

Kinematic

  • 外部驱动的物理体,拥有无限质量,常用于游戏中一些按轨迹移动的机关,Kinematic之间没有碰撞

Constraint

  • 这是一类抽象实体,用来描述Body自身和Body之间的运动限制,一般最常见的是Joint Constraint,它连接着两个Body,提供了6个自由度〔3轴平移和3轴旋转)的限制功能

物理引擎假设的是一个刚性的世界,就Body和Shape本身而言没有变形和塑形的功能,以下会用刚体一词来代称Body

物理引擎中的各种shape

解析类型(最常用,效率最高的碰撞类型)

  • Sphere
  • Capsule
  • Box
  • Plane

    Convex Meshes

    • 凸多边形,性能一般

Triangle Meshes

  • 任意多边形,性能较差

Height Fields

  • 高程,主要用于地形

模拟

模拟相当于把物体的运动托管给物理系统,不需要任何的接口调用,通过simulate对场景进行模拟

物理引擎有自己额外的线程

模拟的基本流程如下

  • Pre Physics

    • 模拟前准备,在这个阶段设置好参数
  • During Physics

    • 碰撞粗检测,检测碰撞盒的交叉集, 若有,进行进一步检测
- 生成Collision Pair,生成Joint Pair, 生成其他Constraint Pair

- 生成多个island Graph
    - 将有碰撞和被Constraint连接在—起的刚体放到一个容器中,以降低计算复杂度

- 不同island之间可以并行计算,得到结果
    - integrate
    - solve Constraints(Per island)
        - Position
        - Velocity
        - Projection
    - 常见约束不同阶段的用途

        - 碰撞
            - Position:分离姿态
            - velocity:反弹和摩擦
        - 关节
            - Position:关节姿态
            - velocity:临界限制的反弹
            - Projection:后处理修饰
  • End Physics

    • 根据收集的模拟结果,回传状态

    检测

主要是场景进行相关的碰撞检测,返回查询结果,一般分为以下三种

  • Raycast,射线检测

  • Sweep,给定一个直线轨迹,用几何Shape去测试

  • Overlap,给定一个Transform,用几何Shape去测试

虚幻引擎的物理应用

碰撞shape类型

  • Simple

    • 包括Box / Sphere / Capsule /Convex

    • 支持完整的模拟特性

    • 可用于检测

  • Complex

    • 特指Triangle Mesh

    • 可用于检测

    • 在模拟时,仅支持Kinematic Body

  • Simple和Complex可以共存于同一个模型资产和Body上,分别用于不同的用途

碰撞通道

  • 在同一个物理世界中,经常需要将模拟对象相互隔离,所以要引入碰撞通道的
    概念

  • Channel(也称为Object Type)和响应关系

    • 一个刚体拥有一个Channel和一张碰撞响应表

    • 对于检测,API会给出反应Channel

    • 对于碰撞,只有两个刚体的碰撞响应表对彼此的Channel都有响应,才会发生碰撞

    • 可以在Project Settings中添加新的通道

  • 三种响应

    • lgnore忽略(对检测和碰撞都没有反应)

    • Overlap重叠〔检测时不阻挡射线,模拟时无碰撞)

    • Block阻挡〔检测时会阻挡射线,模拟时有碰撞)

  • 碰撞预设(也称为Profile)

    • 代表─个刚体的Channel和碰撞响应表组合

    • UE默认提供了一组预设,也可以在Project Settings中添加新的预设

    • 也可以在刚体上自定义

  • 注意: Profile和Channel往往拥有同一个名字,但它们不是一回事,不要混淆

物理材质

  • 记录物理参数的资源格式,包含若干个物理相关的参数

  • 可被链接在洁染材质上,方便管理

  • 也可直接在蓝图和实例上费盖

Skeletal Mesh Physics

  • 骨骼模型的顶点会参与蒙皮动画的计算,位置会随动画变化

  • 采用基本几何体和凸包,配合约束作为骨骼模型的Physics Asset

  • 理论上,可以添加Complex /Triangle Mesh作为碰撞体,但实践上很少这么做

  • 除了角色的Ragdoll,Skeletal Mesh Physics还可以应用在其它场合,比如车辆

物理动画

基于动画及真实物理模拟插值的动画系统,应用到骨骼模型上

  • 基本刚体+约束组成

  • 骨骼动画更新获取骨骼矩阵

  • 刚体基于当前数据,模拟之后获取物理数据

  • 基于一定权重做动画与真实物理的融合,得出最终的骨骼位置

物理应用层优化

优化的基本原则

  • 降低物理场景的复杂度

  • 挑选合适的模拟参数

    • 挑选合适的迭代次数

    • 使用合理的帧率

    • 使用最简单的约束设定以达到关节效果

  • 使用合适的查询方法

    • 降低碰撞盒查询得到的对象数量

    • 降低物理查询本身的损耗

    • 返回单一结果

    • 使用异步方法进行批量查询

  • 使用“替代物理”

    • 根据应用场景定制规则

    • 与主物理世界隔离

    • 能进行针对性的优化

未来发展

  • Tighter integration with gameplay

  • Deterministic Simulation

  • Big World

  • Deformable

  • GPU Acceleration

  • More data driven, more intelligence


06 游戏物理
https://enlight3n.github.io/2025/04/29/UE_TOC/06-游戏物理/
作者
Enlight3n
发布于
2025年4月29日
许可协议