VPhysics(物理引擎系统)
< Zh
		
		
		
		Jump to navigation
		Jump to search
		
VPhysics是Source引擎内置的3D物理模拟系统,通过模拟 质量、
 质量、 重力、
 重力、 摩擦力、
 摩擦力、 空气阻力、
 空气阻力、 惯性和
 惯性和 浮力等物理特性,使物体运动碰撞更真实。
 浮力等物理特性,使物体运动碰撞更真实。
该引擎基于Ipion Virtual Physics技术开发,现由 Havok维护(后被微软收购)。在
 Havok维护(后被微软收购)。在 起源2引擎中其继承者为Rubikon。
 起源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
- 创建物理对象时传递的参数集。


























