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

Zh/VPhysics: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
Line 51: Line 51:
=== 计量单位 ===
=== 计量单位 ===
{| class="standard-table"
{| class="standard-table"
! 测量项       | 单位               | 说明
! 测量项
|--------------|---------------------|------------------
! 单位
| 距离         | 英寸 (Inches)      | 基础长度单位
|-
| 质量         | 千克 (Kilogrammes)  | 国际标准质量单位
| 距离
| 体积         | 立方英寸 (Cubic inches) | 基于长度单位推导
| 英寸
| 速度         | 英寸/秒 (Inches per second) | 位移变化率
|-
| 加速度       | 英寸/秒² (Inches per second per second) | 速度变化率
| 质量
| 密度         | 千克/立方米 (Kilogrammes per cubic metre) | 质量体积比
| 千克
| 力           | 英寸·千克/秒² (Inch·kg/s²) | 牛顿第二定律推导单位
|-
| 扭矩         | 度·千克/秒² (Deg·kg/s²) | 旋转力作用单位
| 体积
| 立方英寸
|-
| 速度
| 英寸/秒
|-
| 加速度
| 英寸/秒²
|-
| 密度
| 千克/立方米
|-
| 力
| 英寸·千克/秒²
|-
| 扭矩
| 度·千克/秒²
|}
|}



Revision as of 09:21, 27 June 2025

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
创建物理对象时传递的参数集。

相关条目

重要物理实体

Category:Constraints|约束系统]](en)