Physx减少碰撞检测的优化

来源:互联网 发布:php设计模式 编辑:程序博客网 时间:2024/06/08 07:02

首先说明这里的碰撞检测(Collision Detection)包括的内容:
1. 接触 Collision
2. 触发 Trigger
3. 射线检测 Raycast
4. 范围检测 Overlap


检测过程:

首先Physx本身并不是每次都遍历所有2v2组合,判断是否需要判断。而是自动把Shape根据区域进行了划分。每个shape只会与自己附近的Shape进行碰撞检测。

另外Shape所属的Actor必须至少有一个是Dynamic的。
其次默认情况下joint的shape之间是不会碰撞的,如果需要添加碰撞需要修改初始化参数NX_COLL_VETO_JOINTED


除此之外,还提供了两种用户可以设置的检测标志,用来判断是否需要进行校验。一种无效就无效
1.Shape分组
一共有0-31组,默认Shape都在Group 0

Shape提供了设置组的方法 NxShape::setGroup(NxColGroup)
Scene提供了设置分组之间碰撞标志的方法 NxScene::setGroupCollisionFlag(NxColGroup1, NxColGroup2, bool)


2.Actor分组. 比第一种方法多了可以设置具体的碰撞事件。而不是所有的事件
一共有0x7fff个分组, 默认所有Actor都在分组0

NxActor提供了设置组的方法 NxActor::setGroup(NxColGroup)
Scene提供了设置分组之间碰撞标志的方法 NxScene::setActorGroupPairFlags(NxColGroup1, NxColGroup2, NX_NOTIFY_XXX)


3.专门的Pair对
NxScene::setActorPairFlags(NxActor&, NxActor&, NxU32 flag)
NxScene::setShapePairFlags(NxShape&, NxShape&, NxU32 flag)


4.Contact Filtering
Shape保留GroupMask
Scene保留Const0, Const1, Op0, Op1, Op2, boolValue

通过 ((Mask0 Op0 Const0) Op2 (Mask1 Op1 Const1)) == boolValue 来判定是否碰撞。如果true,则碰撞

    void NxScene::setFilterOps(NxFilterOp op0, NxFilterOp op1, NxFilterOp op2);    
void NxScene::setFilterBool(bool flag);    
void NxScene::setFilterConstant0(const NxGroupsMask& mask);    
void NxScene::setFilterConstant1(const NxGroupsMask& mask);

void NxShape::setGroupsMask(const NxGroupsMask& mask);    
const NxGroupsMask NxShape::getGroupsMask() const;