设置过滤类型
const PxFilterData collisionGroupIgnore(0, 0, 0, 1); // 碰撞会被忽略的组
const PxFilterData collisionGroup(1, 0, 0, 0); // 需要碰撞的组
给shape设置类型
void setShapeFilterData(PxRigidActor * actor, PxFilterData &data)
{
PxShape* shapes = NULL;
actor->getShapes(&shapes, 1);
// 设置是一个碰撞组的shape 例如filter 1,0,0,0 认为是可以碰撞
shapes->setQueryFilterData(data);
}
// 给actor的shape设置是一个可以被碰撞的组
setShapeFilterData(actor, collisionGroup);
给raycasesingle函数设置过滤数据
设置方法如下
bool testRayCastFilter(PxRigidActor * actor, PxVec3 &unitDir)
{
PxVec3 origin = actor->getGlobalPose().p;
PxRaycastHit hitInfo; // 返回的点,法向量信息等都在这里
PxReal maxDist = unitDir.normalize(); // 最大射线距离
// 获取点, 法向量,还有UV信息
PxHitFlags hitFlags = PxHitFlag::ePOSITION;
// ***************************重点***********
PxQueryFilterData filterdata = PxQueryFilterData();
filterdata.data = collisionGroup; // 设置值允许打了碰撞组标的shape可以与ray出现碰撞
// ***************************重点***********
bool isRayHit = PxSceneQueryExt::raycastSingle(*gScene,
origin,
unitDir,
maxDist,
hitFlags,
hitInfo,
filterdata
);
if (isRayHit) {
PxVec3 pose = hitInfo.position;
cout << "==========================hit position x:" << pose.x << " y:" << pose.y << " z:" << pose.z << endl;
}
else
cout << "rayHit is not hit" << endl;
return isRayHit;
}