碰撞属性系统
< Zh
Jump to navigation
Jump to search

This article needs more
links to other articles to help
integrate it into the encyclopedia. Please help improve this article by adding links
that are relevant to the context within the existing text.
Error: Invalid time.



Error: Invalid time.
所有可碰撞实体都包含CollisionProperty
组件。通过CBaseEntity 中的CollisionProp()
访问器可操作碰撞功能,主要特性包括:
使用VPhysics 的实体还拥有IPhysicsObject
接口,提供物理模拟相关的额外碰撞属性。
基础碰撞控制
实体运动时,碰撞属性的固体类型(CollisionProp()->SetSolid()
)决定使用的碰撞检测基元。
unsigned int CBaseEntity::PhysicsSolidMaskForEntity(void) const
方法确定实体与哪些内容类型发生碰撞。多数情况使用CONTENTS_SOLID ,但可通过内容标志 (主要由BSP编译器使用)进行特殊过滤。例如CONTENTS_GRATE 栅格材质,对移动实体有效但子弹和视线检测可穿透。
CBaseEntity::m_CollisionGroup
决定实体间的碰撞关系,具体规则由CGameRules::ShouldCollide()
实现,模组可自定义逻辑。
包围边界
包围边界用于碰撞检测和可见性查询的粗筛阶段。例如射线/盒体检测会先检查碰撞属性的包围边界,再决定是否检测玩家命中盒(hitbox)。因此包围边界必须完全包含所有需检测的命中盒。
默认包围边界是碰撞外壳的包围盒。若碰撞外壳小于命中盒,需通过以下调用扩展边界:
CollisionProp()->SetSurroundingBoundsType(USE_GAME_CODE);
可选参数类型:
enum SurroundingBoundsType_t {
USE_OBB_COLLISION_BOUNDS = 0, // 使用OBB碰撞边界
USE_BEST_COLLISION_BOUNDS, // 始终使用最佳边界(性能开销最大)
USE_HITBOXES, // 基于命中盒计算
USE_SPECIFIED_BOUNDS, // 使用指定边界
USE_GAME_CODE, // 由游戏代码自定义
USE_ROTATION_EXPANDED_BOUNDS, // 旋转扩展边界
USE_COLLISION_BOUNDS_NEVER_VPHYSICS, // 非物理碰撞边界
SURROUNDING_TYPE_BIT_COUNT = 3
};
