这篇条目有关 Source引擎。如需详情,点击这里。

VPhysics(物理引擎系统)

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

VPhysicsSource(en)引擎内置的3D物理模拟系统,通过模拟Wikipedia icon 质量Wikipedia icon 重力Wikipedia icon 摩擦力Wikipedia icon 空气阻力Wikipedia icon 惯性Wikipedia icon 浮力等物理特性,使物体运动碰撞更真实。

该引擎基于Ipion Virtual Physics技术开发,现由Wikipedia icon Havok维护(后被微软收购)。在起源2 起源2引擎中其继承者为Rubikon(en)

碰撞模型

Dr. Breen(en)的关节碰撞网格

VPhysics碰撞模型不可见,因为物理模拟需要保持高效性。虽然实体可见部分会匹配碰撞模型形状,但模拟器完全忽略可见网格。

碰撞模型通常从模型文件(en)内嵌的碰撞网格(en)加载,也可通过包围盒(en)等自动生成。球形碰撞模型(en)也是可行的。

Tip.png提示:使用控制台命令(en)vcollide_wireframe 1可显示碰撞网格

QPhysics

VPhysics与QPhysics(代码中称为"game physics")共存,后者是继承自Quake II(en)的简易物理系统。玩家和行走NPC仍使用QPhysics,因为VPhysics的复杂性会超出AI处理能力。但载具(en)飞行单位(en)使用VPhysics,func_rotating(en)等移动笔刷实体也使用QPhysics。

QPhysics实体会生成VPhysics"影子"进行有限交互:可推动物理对象或作为约束锚点(en),但不受反向影响。某些笔刷实体会被物理对象临时阻挡。

笔刷实体使用轴向/平面brushside(en)碰撞,点实体使用bounding box(en)hitbox(en)。旋转QPhysics碰撞会导致异常,如影响滑翔玩法(en)

编程实现

VPhysics通过引擎库直接控制实体运动。激活时QPhysics定位函数失效,需通过(en)和[[Zh/

Category:Constraints|约束]](en)控制系统行为(仍支持直接修改)。

以下生成函数(en)创建物理模拟模型: ```cpp

  1. 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运动定义。注意:可能对普通物理对象产生强力作用,需谨慎使用!
Note.png注意:VPhysicsInitNormal()不同,上述函数不会隐式调用SetSolid()(en)。需手动设置,否则默认SOLID_NONE将导致初始化提前终止。
Warning.png警告:单独调用SetSolid()无法启用VPhysics碰撞。

计量单位

测量项 单位
距离 英寸
质量 千克
体积 立方英寸
速度 英寸/秒
加速度 英寸/秒²
密度 千克/立方米
英寸·千克/秒²
扭矩 度·千克/秒²

另请参阅: - Origin(en):坐标系原点参考 - QAngle(en):实体角度参数说明

Note.png注意:

核心结构

IPhysicsEnvironment
VPhysics环境控制器,可创建新IPhysicsObject(en)对象并配置重力等全局参数。
默认创建IPhysicsEnvironment* physenv实例。支持多环境共存(Portal(en)Portal 2(en)采用此机制)。
IPhysicsObject(en)
VPhysics对象核心接口,提供参数调整和力施加功能。单个实体可绑定多个对象(如布娃娃系统)。
IPhysicsCollision
提供CPhysCollide/CPhysConvex工具集,通过全局实例physcollision调用。
CPhysCollide
刚性collision mesh(en)容器(引擎层定义,非实体类)。可传递给IPhysicsCollision函数。
vcollide_t
CPhysCollide集合容器。
CPhysConvex
单凸面碰撞网格元素。
CPhysPolysoup
原始多边形碰撞网格容器,通过physcollision->ConvertPolysoupToCollide()编译为CPhysCollide
solid_t
创建物理对象时传递的参数集。

相关条目

重要物理实体