从PhysX2.8升级到PhysX3.2(6)

之前的小节中,我们主要介绍的是从PhysX2.8到3.2一些较大的方面的改动,比如架构,对象管理模型,模拟时间和碰撞过滤,以及场景查询等,除了这些主要的改变之外,还有一些比较杂项的改动。因此,这一篇中,我就集中为大家介绍这些杂项的改动。

 

首先,看Compartment。

在2.8中,PhysX SDK提供了NxCompartment这个对象,让我们对场景中的物体能有更多的控制。简单点说,一个Compartment就相当于场景NxScene的一个子scene,可以有单独的模拟控制,Compartment之中的物体可以跟主NxScene中的物体交互,也可以不交互,因此在很多时候我们希望单独控制一些物体的时候比较有用,比如在GPU上模拟的布料和粒子都放到单独的Compartment中去控制模拟,可以在尽量节省性能的情况下得到不错的视觉效果。但是由于实现起来的复杂度很高,因为SDK需要尽可能保证主Scene和Compartment这两个世界中物体的同步,即便是有些在CPU模拟,有些在GPU模拟的情形,所以也是一个问题相对较多的模块。并且有些时候,保持同步是基本是不可能的,所以在3.2中,PhysX SDK选择了放弃Compartment,所有的模拟特性都在主Scene中模拟。

因此,如果你的游戏中用到了Compartment,那么就需要考虑把他们去掉,仔细分析需求,看如何在3.2中实现。

 

然后,我们看连续碰撞检测, CCD。

如果你有使用2.8中CCD的经历,那么你应该跟很多人一样会有两个感受:是的,它真的工作,可以防止物体的穿透;但是,哦,能够让它的使用简单一些吗,能不能不要每一个需要开启CCD的物体,都必须创建一个CCD Skeleton么?

好吧,在3.2中,你真的不需要了。在3.2中,开启和关闭CCD,就是PxSceneFlag::eENABLE_SWEPT_INTEGRATION的事儿。一旦检测到这个标志位是被打开的,SDK就会在这一帧中做两次Boardphase,处理连续碰撞的请求。当然,CCD基本上都会带来额外的性能开销,为了抵制浪费倡导节约,你也需要标明你对哪些Shape做CCD感兴趣,将他们的PxShapeFlag::eUSE_SWEPT_BOUNDS标志位打开,同时,在上篇介绍碰撞过滤时提到的的FilterShader函数中,用返回值之一pairFlags返回PxPairFlag::eSWEPT_INTEGRATION_LINEAR,那么SDK就会处理这个Pair中的两个Shape的连续碰撞请求。

 

接下来,是位姿Pose的描述,在3.2中也有了改变。

在2.8中,Pose的描述用的是类型为NxMat34的矩阵,其中,包含用一个NxVec3类型的向量描述位置,加上一个NxMat33类型的矩阵用来描述姿态。到了3.2中,Pose的描述用了更贴切的名字PxTransform,位置依然是类似,用的是PxVec3类型来描述,但是姿态,则用的是四元数PxQuat类型来描述,因此,我们升级时,需要将旋转矩阵转换成四元数。PhysX SDK的PxMat33.h中定义了PxQuat和PxMat33相互转换的方式,可以作为参考。

 

最后一点,我们说说NxShape到PxShape这个改变对我们的影响。

在2.8中,PhysX SDK使用描述符创建各种Shape的对象,比如创建NxBoxShape,就需要先填一个NxBoxShapeDesc,然后再调用NxActor的createShape方法。并且,在2.8中,每一种Shape,PhysX SDK都定义了一个专门的类来表示,因此,我们可以有具体的NxBoxShape、NxCapsuleShape等。

但是PhysX 3舍弃了描述符的创建方式,同时对Shape对象进行了更细致的拆分:代表几何形体的属性,由PxGeometry表示,并且派生出PxBoxGeometry、PxSphereGeometry等碰撞形体;代表运动属性和相关功能的部分,则封装在新的PxShape中。因此,现在刚体Actor创建Shape时,需要传入类型为PxGeometry的对象。从现有的升级反馈看,基本上新的方式会更加灵活,代码也会更简洁。但是如果我们现有的的设计需要知道或者存储Shape的具体形状,没有了2.8中具体的类也不用担心,在3.2中,我们可以通过PxShape的getGeometryType来得到。

 

好了,到这里,我就把我能想到的从PhysX 2.8升级到 3.2过程中需要注意的事项介绍给了大家,应该涵盖了主要的应用和功能更新。但是如果我发现有遗漏,会在新的文章中补充,也请各位看官多多批评指正,谢谢了,呵呵。

看的再多,也不如上手一试。PhysX SDK一向以API简单易用著称,也许你亲自试过之后,发现从2.8升级到3.2,真的没那么难。偷笑

猜你喜欢

转载自blog.csdn.net/linuxheik/article/details/80393155