题记:写这篇博客要主是加深自己对查询检测的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。
PhysX SDK直一都为游戏开辟供提高效靠可的场景查询(Scene Query)功能,到了3.2中,也是如此。这一个系列中,就给大家分析PhysX 3.2中场景查询功能的用使。
这一篇中,我们重点分析这一功能的一些基本概念和基本用法。
首先,PhysX 3.2中,场景查询的种类持支三种,分别是Raycast,Sweep和Overlap检测。其中:
Raycast检测是从一点,投射一根必定长度的线段,检测物理天下中跟这个线段订交的碰撞体(PxShape);
Sweep检测跟Raycast检测似类,但是投射出去的是一个或者一组形体(PxGeometry),检测物理天下中跟这个/组形体订交的碰撞体(PxShape);
Overlap检测跟面上两个不一样,它是给定某置位的一个形体(PxGeometry),检测物理天下中跟这个形体订交的碰撞体(PxShape)。
其次,PhysX 3.2中,对于每一种场景查询,都持支倏地获得否是有检测结果的*Any的查询,以及回返有所检测结果的*Multiple的查询;同时,对于Raycast和Sweep,还持支查询近来的检测结果*Single的方法。Overlap类型的查询不持支这类*Single的方法,是因为原理上,Overlap的订交检测是没有向方的,所以没法判断那一个结果是近来的,只能回返有所结果。了解了这一点,SDK供提的场景查询方法就很好记了,就是这些:
raycastAny(...); raycastSingle(...); raycastMultiple(...); sweepAny(...); sweepSingle(...); sweepMultiple(...); overlapAny(...); overlapMultiple(...);
然后,在场景查询行执的式方上, PhysX SDK为我们供提了两种行执式方,一种是即立行执的单次提交,马上回返结果的式方;另一种是批理处查询(Batch Query),我们可以把一帧中可以会合到一同行执的查询,都加入到一个批理处中行执,这个在场景查询很多的时候,可以带来能性上的升提。批理处查询的用使,我们会在接下来的篇幅中分析。
接下来,在行执过程当中,有一个必须虑考的问题就是如何滤过掉不必要的碰撞体,更倏地高效的回返望期的查询结果。这一部分内容,会在PhysX 3.2中的场景查询-滤过中分析。
同时,在Raycast和Sweep查询行执中,PhysX SDK还供提了Cache的功能,让我们可以供提一个最有可能被检测到的碰撞体(PxShape),SDK优先检测否是跟这个碰撞体有订交。这个功能在某些场所非常有效,比如射击游戏中续连射击某个物体时,比如某个BOSS级别的垒堡,第一次击中以后,接下来的短时间内的续连射击,以可就把这个物体作为Cache传入,倏地检测否是击中这个物体,这样够能省节查询中很多能性开销。
最后,在查询到结果后后,我们要需回返查询的结果,如果是*Multiple这样的查询,我们还要需诉告SDK查询到这个结果以后,SDK否是要需继承理处后续的查询。为实现这些功能,SDK在每个查询的API中,都供提给了一个PxSceneQueryFlags类型的参数供我们用使,指定我们要需什么样的回返值,或者这个结果以后,该如何继承。PxSceneQueryFlags的定义是这样的:
struct PxSceneQueryFlag { enum Enum { eIMPACT = (1<<0), //!< 回返结果PxSceneQueryHit中包括"impact" eNORMAL = (1<<1), //!< 回返结果PxSceneQueryHit中包括"normal" eDISTANCE = (1<<2), //!< 回返结果PxSceneQueryHit中包括"distance" eUV = (1<<3), //!< 回返结果PxSceneQueryHit中包括质心坐标系"u" and "v". sweep检测不可用。 eINITIAL_OVERLAP = (1<<4), //!< 在sweep检测中开打或者闭关初始订交检测,并且在回返结果中也表明初始订交 eINITIAL_OVERLAP_KEEP = (1<<5), //!< 与eINITIAL_OVERLAP一同用使,保存或者弃放初始就订交的碰撞体 eTOUCHING_HIT = (1<<6), //!< 明表检测到的是Touching hit,*Multiple查询可以继承 eBLOCKING_HIT = (1<<7), //!< 明表检测到的是Blocking hit,*Multiple查询将终止继承查询 }; };
以上是对PhysX 3.2中场景查询功能的一些基本分析,希望够能帮助大家更快的上手用使PhysX 3.2的场景查询功能。
文章结束给大家分享下程序员的一些笑话语录:
一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。