给物体创建射线ray

通过raycastSingle函数去获取发射的射线是否会碰到物体,不需要特殊处理的可以不使用回调。

不用回调的版本

// origin是起点, unitDir是方向
int RayCaseSingle(PxVec3 &origin, PxVec3 &unitDir)
{PxRaycastHit hitInfo; // 返回的点,法向量信息等都在这里PxReal maxDist = FLT_MAX; // 最大射线距离//PxHitFlag::eMESH_ANY //返回任一次的射线与mesh的交互,因为是raycaseSingle,设不设置这个无所谓// 获取点, 法向量,还有UV信息PxHitFlags hitFlags = PxHitFlag::ePOSITION | PxHitFlag::eNORMAL | PxHitFlag::eUV ;bool isRayHit = PxSceneQueryExt::raycastSingle(*gScene,origin,unitDir,maxDist,hitFlags,hitInfo);if (isRayHit) {cout << "=====hitInfo.x: " << hitInfo.position.x << " y: " << hitInfo.position.y << " z: " << hitInfo.position.z << endl;PxVec3 pose = actor->getGlobalPose().p;cout << "actor x:" << pose.x << " y:" << pose.y << " z:" << pose.z << endl;}elsecout << "rayHit is not hit" << endl;return isRayHit;
}

带回调版本的射线

因为我设置的是从物体的身体里面发射出来的,所以我需要特殊处理一下,将该物体过滤一下,让这个物体对于射线而言是一个忽略状态。

  • 设置一个用于全局过滤的变量
const PxFilterData collisionGroupIgnore(0, 0, 0, 1); // 用于忽略物体,内容自定义
  • 下面是回调配置
class  PxSenceRayCallback : public PxSceneQueryFilterCallback
{public:virtual PxQueryHitType::Enum preFilter(const PxFilterData& filterData, const PxShape* shape, const PxRigidActor* actor, PxHitFlags& queryFlags) override{cout << "hit preFilter" << endl;if (shape->getSimulationFilterData() == collisionGroupIgnore){cout << "ignore data" << endl;return PxQueryHitType::Enum::eNONE; //should ignore this shape}return PxQueryHitType::Enum::eBLOCK;//eNONE   //should ignore this shape//eTOUCH // 要使用这个要有缓冲区//eBLOCK // 射线发出有hit需要返回用这个}virtual PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit) override{cout << "hit postFilter" << endl;return PxQueryHitType::Enum::eBLOCK;}};PxSenceRayCallback gSenceRay;
  • 下面是封装好的调用api
bool GetShapeSimulationFilterData(PxRigidActor *actor, PxFilterData &filterdata)
{const PxU32 numShapes = actor->getNbShapes();if (numShapes <= 0) {return false;}PxShape* shapes = NULL;actor->getShapes(&shapes, 1);filterdata = shapes->getSimulationFilterData();return true;
}bool SetShapeSimulationFilterData(PxRigidActor *actor, const PxFilterData &filterdata)
{const PxU32 numShapes = actor->getNbShapes();if (numShapes <= 0) {return false;}PxShape* shapes = NULL;actor->getShapes(&shapes, 1);shapes->setSimulationFilterData(filterdata);PxFilterData oldFilterdata = shapes->getSimulationFilterData();return true;
}
// 此处使用actor进行传入是为了测试方便
int RayCaseSingle(PxRigidActor * actor, PxVec3 &unitDir)
{PxVec3 origin = actor->getGlobalPose().p ;PxRaycastHit hitInfo; // 返回的点,法向量信息等都在这里PxReal maxDist = FLT_MAX; // 最大射线距离PxU32 maxHits = 1; // 返回的最多命中个数//PxHitFlag::eMESH_ANY //返回任一次的射线与mesh的交互,因为是raycaseSingle,设不设置这个无所谓// 获取点, 法向量,还有UV信息PxHitFlags hitFlags = PxHitFlag::ePOSITION | PxHitFlag::eNORMAL | PxHitFlag::eUV ;PxQueryFilterData filterdata = PxQueryFilterData();// 因为我是从actor的中心发出的射线,会碰到自身的actor,使用回调忽略掉自身的actorfilterdata.flags |= PxQueryFlag::ePREFILTER; // 设置回调信息,可以用作特殊处理// 获取之前的filterdata暂存一下PxFilterData oldFilterdata;GetShapeSimulationFilterData(actor, oldFilterdata);// 设置碰撞忽略SetShapeSimulationFilterData(actor, collisionGroupIgnore);bool isRayHit = PxSceneQueryExt::raycastSingle(*gScene,origin,unitDir,maxDist,hitFlags,hitInfo,filterdata,&gSenceRay);if (isRayHit) {cout << "=====hitInfo.x: " << hitInfo.position.x << " y: " << hitInfo.position.y << " z: " << hitInfo.position.z << endl;PxVec3 pose = actor->getGlobalPose().p;cout << "actor x:" << pose.x << " y:" << pose.y << " z:" << pose.z << endl;}elsecout << "rayHit is not hit" << endl;// 还原回来SetShapeSimulationFilterData(actor, oldFilterdata);return isRayHit;
}

你以为这样就结束了嘛?

有个小坑!!!!!

shape这个变量是一个坑,为什么这么说呢? 它使用下面这个接口创建的时候,不能使用setSimulationFilterData这个函数!!!!!!!!!!!!!!!!!!这个函数在过滤的时候,非常重要。 不过呢,使用userdata定义自己的结构代替也可以。

PX_FORCE_INLINE PxShape* PxPhysics::createShape  (   const PxGeometry &  geometry,
const PxMaterial &  material,
bool    isExclusive = false,
PxShapeFlags    shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE
)

如果之前创建刚体是用的这种方法,那么setSimulationFilterData就会无法调用,会提示警告。
shared shapes attached to actors are not writable.

void createBody(const PxTransform& t, PxGeometry& geometry)
{PxShape* shape = NULL;// 创建出形状 shape = gPhysics->createShape(geometry, *gMaterial);PxRigidDynamic* dynamic = gPhysics->createRigidDynamic(t);dynamic->attachShape(*shape);PxRigidBodyExt::updateMassAndInertia(*dynamic, 10.0f);// 场景中添加演员gScene->addActor(*dynamic);shape->release();
}

需要使用setSimulationFilterData接口的话,请使用下面的方法创建

void createBody(const PxTransform& t, PxGeometry& geometry)
{// 最后一个参数也就是使用 PxRigidBodyExt::updateMassAndInertia(*dynamic, 10.0f);设置的第二个参数PxRigidDynamic* dynamic = PxCreateDynamic(*gPhysics, t, geometry, *gMaterial, 10.0f);// 场景中添加演员gScene->addActor(*dynamic);shape->release();
}

如果想要使用回调进行过滤,又无法使用setSimulationFilterData接口的情况下,在shape变量中有userdata指针,可以通过给他定义自己想要的结构或者数据, 然后在回调里面调用shape指针,判断使用自己设置好的userdata即可。

在physx中创建射线raycase,并获取碰撞点相关推荐

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

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

  2. java插件获取首选项_Eclipse RCP 中创建自定义首选项,并能读取首选项中的值

    Eclipse RCP的插件中若想自己定义首选项需要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse. ...

  3. java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...

    Java中创建String 对象的方法有哪些 发布时间:2020-11-25 16:45:30 来源:亿速云 阅读:71 作者:Leah 这篇文章将为大家详细讲解有关Java中创建String 对象的 ...

  4. Java 文件操作二(重命名、设置只读、是否存在、指定目录中创建文件、获取文件修改日期、创建文件、文件路径比较)

    文件重命名 import java.io.File;public class Main {public static void main(String[] args) {File oldName = ...

  5. git拉取远程分支并创建本地分支和Git中从远程的分支获取最新的版本到本地

    git拉取远程分支并创建本地分支 一.查看远程分支 使用如下Git命令查看所有远程分支: git branch -r 二.拉取远程分支并创建本地分支 方法一 使用如下命令: git checkout ...

  6. c# 获取word表格中的内容_Java 在Word中创建嵌套表格

    嵌套表格,即在一个大的表格单元格中再嵌进去一个或几个小的表格,使表格内容布局合理.本文将通过java程序来演示如何在Word中创建嵌套表格. 使用工具:Free Spire.Doc for Java ...

  7. Unity 3D中的射线与碰撞检测

    创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction).这两个参数也是Ray的成员变量.注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理. ...

  8. Unity 3D中的射线与碰撞检测 1

    创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction).这两个参数也是Ray的成员变量.注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理. ...

  9. Unity3D客户端在游戏场景中创建阻挡并用二进制导出

    在公司的项目中给策划做了一个可以在场景中创建简单阻挡物体的小工具,也许大家有用的到的,拿出来分享一下. 整体思路是把地形用一米见方的格子分隔,然后在格子里放置cube代替阻挡,存盘时用一维数组,1表示 ...

最新文章

  1. 解决nginx使用proxy_pass反向代理时,session丢失的问题
  2. java泛型机制的好处_java 泛型机制
  3. 7.类的访问控制和继承
  4. centos6.8安装php7.3,CentOS7.6源码编译安装PHP 7.3.8
  5. msg批量转html,SysTools MSG Converter(MSG格式转换器)
  6. linux-mint下搭建android,angularjs,rails,html5开发环境
  7. 今日头条自动开宝箱脚本
  8. dcos 1.7 安装
  9. 设计简单计算机主机系统,【效率】专为Win7系统设计的最小Pomodoro-MiniPomodoro(随附...
  10. 人工智能对生活的影响
  11. Itest(爱测试),最懂测试人的开源测试管理, 开源BUG跟踪管理软件隆重发布
  12. 做html5抽奖程序xu,用jQuery实现抽奖程序
  13. 路由器局域网IP(内网IP)和外网IP的关系
  14. C++string字符串初始化与使用
  15. 推荐一个免费超级好用的简历模板网站
  16. matlab常用代码(读取文件、批量导入数据、与或非)
  17. pcs与crmsh命令比较
  18. 谷歌推出以太坊区块链的大数据视图
  19. 《纽约时报》发文评选掀起区块链革命的10位代表性人物,吴忌寒上榜
  20. HTML_个人简历表

热门文章

  1. 免费送一块 500G 固态硬盘!
  2. C/C++代码获取今天凌晨零点零时零分的时间戳
  3. java迭代器和for循环区别_迭代器和增强for循环
  4. Dubbox——基本认识
  5. HTML+CSS——实现跳动的心
  6. 病狗问题 (逻辑推理)
  7. 【java基础】史上最详细的配置环境变量步骤
  8. QT连接PostgresSQL9.4(X86)
  9. 企业如何做好微信营销
  10. 二级java和二级c_全国计算机考试中,二级C语言和java报考哪个更好?