一、物理碰撞模拟方法

通过模拟一个真实的碰撞,但是不体现碰撞的特性,通过回调的方式来获取到对应的actor的指针来判断是否碰撞,但是要忽略掉当前的碰撞。

  1. 设置分类

    const PxFilterData collisionGroupIgnore(0, 0, 0, 1); // 分类自己怎么定义都可以
    
  2. 设置形状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;
    }
  3. 设置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;
  4. 设置场景过滤条件函数

    在场景配置中设置过滤函数: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;
    }
  5. 设置场景过滤函数的回调

    sceneDesc.filterCallback = &gContactFilterCallback;

  6. 运行调试即可

二、通过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是否会发生碰撞相关推荐

  1. 在physx中创建射线ray,并获取碰撞点

    在physx中创建射线ray,并获取碰撞点 通过raycastSingle函数去获取发射的射线是否会碰到物体,不需要特殊处理的可以不使用回调. 不用回调的版本 // origin是起点, unitDi ...

  2. 在physx中创建射线raycase,并获取碰撞点

    给物体创建射线ray 通过raycastSingle函数去获取发射的射线是否会碰到物体,不需要特殊处理的可以不使用回调. 不用回调的版本 // origin是起点, unitDir是方向 int Ra ...

  3. android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法

    今天实现listview的下拉刷新和上拉加载的时候,遇到了一个问题,*就是说需要根据listview中滑动的位置来进行下拉刷新和上拉加载.* 具体点,只有当我的listview滑动到最顶部的时候,这时 ...

  4. Linux系统中判断多个设备使用了同一个IP地址,判断IP地址冲突的问题

    在Linux系统中,如果多个设备使用了同一个IP地址,就会发生IP地址冲突的问题.IP地址冲突会导致网络连接不稳定,甚至会导致网络中断.因此,在使用Linux系统时,需要及时发现和解决IP地址冲突问题 ...

  5. oracle里面子判断,在过程中添加子进程,在子过程中判断

    在过程中添加子过程,在子过程中判断 本帖最后由 wu_xiao_xian 于 2014-10-28 15:23:03 编辑 现在有一个过程BI_OSS_SHOULD_CALL_P DROP PROCE ...

  6. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

  7. java中判断两个字符(或者字符串相等)

    string a,b;//两字符串 在java中判断两个字符(字符串)相等,用a.equals(b); if(a.equals(b)){ //如果相等,返回值为true }else{ //如果不相等, ...

  8. 虚拟机Linux中判断用户输入的是 Yes 或 NO

    Linux中判断用户输入的是 Yes 或 NO #!/bin/bash # 判断用户输入的是 Yes 或 NO read -p "Are you sure?[y/n]:" sure ...

  9. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

最新文章

  1. 单向链表JAVA代码
  2. mysql性能监控qps,tps,iops
  3. 数学大神攻克猜字游戏Wordle,求解算法成绩逼近理论极限,连信息论都用上了...
  4. Android编译小结(新建android项目)
  5. jupyter python版本_Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)...
  6. eclipse 用jsp文件连接mysql_用本地navicat去连接阿里云ECS中的mysql
  7. Android Studio项目转Eclipse项目
  8. 最大流ISAP算法模板
  9. 微软推出Windows XP SP3中文版
  10. deepin执行apt-get update报错https://deb.opera.com/opera-stable stable Release” 没有 Release 文件N: 无法安全地用该
  11. 计算机 java_Java程序到底是如何运行的?
  12. 使用CountDownLatch模拟高并发场景
  13. 在网页中放入贴纸插画是怎样的体验?这样的UI素材,你还不收藏!
  14. 使用vue完成一个分页效果
  15. H2O中的随机森林算法介绍及其项目实战(python实现)
  16. 2019年四月计算机语言排名,2019编程排行榜_编程语言排行榜2019年4月 TIOBE编程语言排行榜2019年最新版...
  17. visual studio 2015 Enterprise key vs2015密钥
  18. 2018最新--Win10屏幕亮度无法调节问题的解决方法
  19. 转载:大师之间的论战 jQuery之父谈YUI3差在哪
  20. Git - git push origin master 报错的解决方法 出现[rejected] master -」 master (non-fast-forward)问题解决

热门文章

  1. 尼得科Nidec风扇4015风机和G40R风机介绍
  2. 疑问 jsp里边写的js和引入的js有差别
  3. OpenGL坐标变换
  4. IM聊天教程:发送图片/视频/语音/表情
  5. 视频会议/远程医疗/在线教育网页视频实时音视频通话目前有什么优势和不足?
  6. saiku多sort改造
  7. 教案、讲稿、讲义的区别
  8. 微博开放平台接口整理系列--短链转长链
  9. 使用银联商务实现微信小程序支付
  10. 数据分析 - 基础原理 之 第三章:数据质量管理 - 第五节:数据质量监控