physx中判断actor是否会发生碰撞
一、物理碰撞模拟方法
通过模拟一个真实的碰撞,但是不体现碰撞的特性,通过回调的方式来获取到对应的actor的指针来判断是否碰撞,但是要忽略掉当前的碰撞。
设置分类
const PxFilterData collisionGroupIgnore(0, 0, 0, 1); // 分类自己怎么定义都可以
设置形状shape中的分类,方便在filtershape函数中做过滤
PxRigidDynamic* createIgnoreDynamic(const PxTransform& t, const PxGeometry& geometry, const PxVec3& velocity = PxVec3(0)) {PxRigidDynamic* dynamic = PxCreateDynamic(*gPhysics, t, geometry, *gMaterial, 10.0f);dynamic->userData = new int;int shapeNb = dynamic->getNbShapes();cout << "shapeNb:" << shapeNb << endl;PxShape * shape = nullptr;dynamic->getShapes(&shape, 1);if (shape) {cout << "shape is not null" << endl;// 设置shape的FilterData,用在filtershape做匹配shape->setSimulationFilterData(collisionGroupIgnore); }else {cout << "shape is null" << endl;}memcpy(dynamic->userData, &userid, sizeof(int));userid++;// 场景中添加零件gScene->addActor(*dynamic);return dynamic; }
设置filterShader的回调,从此处可以获取到碰撞的actor,返回值设置PxFilterFlag::eKILL即可放弃此次碰撞。
class ContactFilterCallback : public PxSimulationFilterCallback {public:virtual PxFilterFlags pairFound(PxU32 pairID, PxFilterObjectAttributes attributes0, PxFilterData filterData0, const PxActor* a0, const PxShape* s0, PxFilterObjectAttributes attributes1, PxFilterData filterData1, const PxActor* a1, const PxShape* s1, PxPairFlags& pairFlags) override{cout << "pairFound !!!!!!!!!" << endl;cout << "pairFound actor0:" << *(int *)(a0->userData) << " actor1:" << *(int *)(a1->userData) << endl;//return PxFilterFlag::eKILL; // 将该碰撞事件丢弃,此时就没有碰撞效果了return PxFilterFlag::eSUPPRESS; // 对象的边界体积重叠,或者直到其中一个碰撞对象的过滤相关数据发生更改,就忽略该碰撞对}virtual void pairLost(PxU32 pairID, PxFilterObjectAttributes attributes0, PxFilterData filterData0, PxFilterObjectAttributes attributes1, PxFilterData filterData1, bool objectRemoved) override{}virtual bool statusChange(PxU32& pairID, PxPairFlags& pairFlags, PxFilterFlags& filterFlags) override{return false;}};ContactFilterCallback gContactFilterCallback;
设置场景过滤条件函数
在场景配置中设置过滤函数:
sceneDesc.filterShader = filterShader;
static PxFilterFlags filterShader(PxFilterObjectAttributes attributes0,PxFilterData filterData0,PxFilterObjectAttributes attributes1,PxFilterData filterData1,PxPairFlags& pairFlags,const void* constantBlock,PxU32 constantBlockSize) {// 默认对所有为过滤的碰撞产生默认回调pairFlags = PxPairFlag::eCONTACT_DEFAULT;pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND; // 普通的触碰,调用回调if (filterData0 == collisionGroupIgnore || filterData1 == collisionGroupIgnore){cout << "filterShader this is ignore shape" << endl;return PxFilterFlag::eCALLBACK; // 调用filterShader的回调}pairFlags |= PxPairFlag::eDETECT_CCD_CONTACT; // 检测到CCD碰撞的时候pairFlags |= PxPairFlag::eNOTIFY_TOUCH_CCD; // 触碰且CCD,调用回调pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND; // 普通的触碰,调用回调return PxFilterFlag::eDEFAULT; }
设置场景过滤函数的回调
sceneDesc.filterCallback = &gContactFilterCallback;
运行调试即可
二、通过Geometry和Tranform来判断是否会出现碰撞
在physx中,有通过geometry+transform的api来获取两个几何体是否出现内嵌,我们可以通过这种方式来获取两个actor是否回发生碰撞。
physx里面有两种,一种只判断内嵌,一种是判断内嵌的深度,api分别如下
// 判断是否内嵌
bool PxGeometryQuery::overlap(const PxGeometry & geom0,
const PxTransform & pose0,
const PxGeometry & geom1,
const PxTransform & pose1
);// 判断是否内嵌,并求出内嵌深度
bool PxGeometryQuery::computePenetration ( PxVec3 & direction,
PxF32 & depth,
const PxGeometry & geom0,
const PxTransform & pose0,
const PxGeometry & geom1,
const PxTransform & pose1
)
调用方式如下
int myOverlap(PxRigidActor * actor, PxGeometry &geom, PxTransform &trans)
{if (!actor) {cout << "actor is null" << endl;return -1;}bool isOverlapping = false;PxTransform pole = actor->getGlobalPose();const PxU32 numShapes = actor->getNbShapes();if (numShapes <= 0){cout << "Shape num is <= 0" << endl;return -1;}PxShape** shapes = (PxShape**)malloc(sizeof(PxShape*)*numShapes);actor->getShapes(shapes, numShapes);for (PxU32 i = 0; i < numShapes; i++){PxShape* shape = shapes[i];cout << "shape[" << i << "]:" << shape->getGeometryType() << endl;;PxGeometry &geometry = shape->getGeometry().any();isOverlapping = PxGeometryQuery::overlap(geometry, pole, geom, trans);if (isOverlapping) {cout << "myOverlap isOverlapping:" << isOverlapping << endl;break;}cout << "myOverlap isOverlapping:" << isOverlapping << endl;}free(shapes);return isOverlapping;
}int myOverlap(PxRigidActor * actor0, PxRigidActor * actor1)
{if (!actor0 || !actor1) {cout << "actor is null" << endl;return -1;}PxTransform pole0 = actor0->getGlobalPose();PxTransform pole1 = actor1->getGlobalPose();const PxU32 numShapes0 = actor0->getNbShapes();const PxU32 numShapes1 = actor1->getNbShapes();if (numShapes0 <= 0 || numShapes1 <= 0) {cout << "test Shape num is <= 0" << endl;return -1;}PxShape* shapes0 = NULL;actor->getShapes(&shapes0, 1);PxShape* shapes1 = NULL;actor->getShapes(&shapes1, 1);PxGeometry &geometry0 = shapes0->getGeometry().any();PxGeometry &geometry1 = shapes1->getGeometry().any();bool isOverlapping = PxGeometryQuery::overlap(geometry0, pole0, geometry1, pole1);cout << "testShapeGetGeometry isOverlapping:" << isOverlapping << endl;return isOverlapping;
}
physx中判断actor是否会发生碰撞相关推荐
- 在physx中创建射线ray,并获取碰撞点
在physx中创建射线ray,并获取碰撞点 通过raycastSingle函数去获取发射的射线是否会碰到物体,不需要特殊处理的可以不使用回调. 不用回调的版本 // origin是起点, unitDi ...
- 在physx中创建射线raycase,并获取碰撞点
给物体创建射线ray 通过raycastSingle函数去获取发射的射线是否会碰到物体,不需要特殊处理的可以不使用回调. 不用回调的版本 // origin是起点, unitDir是方向 int Ra ...
- android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法
今天实现listview的下拉刷新和上拉加载的时候,遇到了一个问题,*就是说需要根据listview中滑动的位置来进行下拉刷新和上拉加载.* 具体点,只有当我的listview滑动到最顶部的时候,这时 ...
- Linux系统中判断多个设备使用了同一个IP地址,判断IP地址冲突的问题
在Linux系统中,如果多个设备使用了同一个IP地址,就会发生IP地址冲突的问题.IP地址冲突会导致网络连接不稳定,甚至会导致网络中断.因此,在使用Linux系统时,需要及时发现和解决IP地址冲突问题 ...
- oracle里面子判断,在过程中添加子进程,在子过程中判断
在过程中添加子过程,在子过程中判断 本帖最后由 wu_xiao_xian 于 2014-10-28 15:23:03 编辑 现在有一个过程BI_OSS_SHOULD_CALL_P DROP PROCE ...
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...
- java中判断两个字符(或者字符串相等)
string a,b;//两字符串 在java中判断两个字符(字符串)相等,用a.equals(b); if(a.equals(b)){ //如果相等,返回值为true }else{ //如果不相等, ...
- 虚拟机Linux中判断用户输入的是 Yes 或 NO
Linux中判断用户输入的是 Yes 或 NO #!/bin/bash # 判断用户输入的是 Yes 或 NO read -p "Are you sure?[y/n]:" sure ...
- java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...
[单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...
最新文章
- 单向链表JAVA代码
- mysql性能监控qps,tps,iops
- 数学大神攻克猜字游戏Wordle,求解算法成绩逼近理论极限,连信息论都用上了...
- Android编译小结(新建android项目)
- jupyter python版本_Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)...
- eclipse 用jsp文件连接mysql_用本地navicat去连接阿里云ECS中的mysql
- Android Studio项目转Eclipse项目
- 最大流ISAP算法模板
- 微软推出Windows XP SP3中文版
- deepin执行apt-get update报错https://deb.opera.com/opera-stable stable Release” 没有 Release 文件N: 无法安全地用该
- 计算机 java_Java程序到底是如何运行的?
- 使用CountDownLatch模拟高并发场景
- 在网页中放入贴纸插画是怎样的体验?这样的UI素材,你还不收藏!
- 使用vue完成一个分页效果
- H2O中的随机森林算法介绍及其项目实战(python实现)
- 2019年四月计算机语言排名,2019编程排行榜_编程语言排行榜2019年4月 TIOBE编程语言排行榜2019年最新版...
- visual studio 2015 Enterprise key vs2015密钥
- 2018最新--Win10屏幕亮度无法调节问题的解决方法
- 转载:大师之间的论战 jQuery之父谈YUI3差在哪
- Git - git push origin master 报错的解决方法 出现[rejected] master -」 master (non-fast-forward)问题解决