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
解析类型(最常用,效率最高的碰撞类型)
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:后处理修饰
主要是场景进行相关的碰撞检测,返回查询结果,一般分为以下三种
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