VPhysics(物理引擎系统)
< Zh
Jump to navigation
Jump to search
VPhysics是Source引擎内置的3D物理模拟系统,通过模拟
质量、
重力、
摩擦力、
空气阻力、
惯性和
浮力等物理特性,使物体运动碰撞更真实。
该引擎基于Ipion Virtual Physics技术开发,现由
Havok维护(后被微软收购)。在
起源2引擎中其继承者为Rubikon。
碰撞模型
Dr. Breen的关节碰撞网格
VPhysics碰撞模型不可见,因为物理模拟需要保持高效性。虽然实体可见部分会匹配碰撞模型形状,但模拟器完全忽略可见网格。
碰撞模型通常从模型文件内嵌的碰撞网格加载,也可通过包围盒等自动生成。球形碰撞模型也是可行的。
vcollide_wireframe 1可显示碰撞网格QPhysics
VPhysics与QPhysics(代码中称为"game physics")共存,后者是继承自Quake II的简易物理系统。玩家和行走NPC仍使用QPhysics,因为VPhysics的复杂性会超出AI处理能力。但载具和飞行单位使用VPhysics,func_rotating等移动笔刷实体也使用QPhysics。
QPhysics实体会生成VPhysics"影子"进行有限交互:可推动物理对象或作为约束锚点,但不受反向影响。某些笔刷实体会被物理对象临时阻挡。
笔刷实体使用轴向/平面brushside碰撞,点实体使用bounding box或hitbox。旋转QPhysics碰撞会导致异常,如影响滑翔玩法。
编程实现
VPhysics通过引擎库直接控制实体运动。激活时QPhysics定位函数失效,需通过力和[[Zh/
- Category:Constraints|约束]]控制系统行为(仍支持直接修改)。
以下生成函数创建物理模拟模型: ```cpp
- define MODEL "models/props_c17/FurnitureDresser001a.mdl"
void CMyEnt::Spawn() {
PrecacheModel(MODEL); SetModel(MODEL); VPhysicsInitNormal(SOLID_VPHYSICS,0,false);
}
初始化函数说明:
VPhysicsInitNormal- 前文示例所用函数。创建可自由运动的完整物理对象,支持全物理模拟和碰撞。
VPhysicsInitStatic()- 创建静态碰撞体(永不移动)。
VPhysicsInitShadow( bool allowPhysicsMovement, bool allowPhysicsRotation, solid_t *pSolid = 0 )- 创建与其他VPhysics对象碰撞的"影子对象",其位置由实体的QPhysics运动定义。注意:可能对普通物理对象产生强力作用,需谨慎使用!
VPhysicsInitNormal()不同,上述函数不会隐式调用SetSolid()。需手动设置,否则默认SOLID_NONE将导致初始化提前终止。SetSolid()无法启用VPhysics碰撞。计量单位
| 测量项 | 单位 |
|---|---|
| 距离 | 英寸 |
| 质量 | 千克 |
| 体积 | 立方英寸 |
| 速度 | 英寸/秒 |
| 加速度 | 英寸/秒² |
| 密度 | 千克/立方米 |
| 力 | 英寸·千克/秒² |
| 扭矩 | 度·千克/秒² |
另请参阅: - Origin:坐标系原点参考 - QAngle:实体角度参数说明
注意:
核心结构
IPhysicsEnvironment- VPhysics环境控制器,可创建新IPhysicsObject对象并配置重力等全局参数。
- 默认创建
IPhysicsEnvironment* physenv实例。支持多环境共存(Portal和Portal 2采用此机制)。 - IPhysicsObject
- VPhysics对象核心接口,提供参数调整和力施加功能。单个实体可绑定多个对象(如布娃娃系统)。
IPhysicsCollision- 提供
CPhysCollide/CPhysConvex工具集,通过全局实例physcollision调用。 CPhysCollide- 刚性collision mesh容器(引擎层定义,非实体类)。可传递给
IPhysicsCollision函数。 vcollide_tCPhysCollide集合容器。CPhysConvex- 单凸面碰撞网格元素。
CPhysPolysoup- 原始多边形碰撞网格容器,通过
physcollision->ConvertPolysoupToCollide()编译为CPhysCollide。 solid_t- 创建物理对象时传递的参数集。