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_t
CPhysCollide
集合容器。CPhysConvex
- 单凸面碰撞网格元素。
CPhysPolysoup
- 原始多边形碰撞网格容器,通过
physcollision->ConvertPolysoupToCollide()
编译为CPhysCollide
。 solid_t
- 创建物理对象时传递的参数集。