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

如果用最简单的话来描述我们使用物理引擎的目的,那么必然是来模拟游戏世界中的碰撞反应。前面两篇的重点是PhysX 2.8和3.2的架构和对象管理方面的不同,这一篇中,我

们的重点将是跟模拟相关的两件最基本的东西:模拟时间控制和碰撞过滤。

 

首先来说模拟时间控制。

我们都知道,对于游戏物理引擎来说,通常物理世界的模拟是离散的,也就是说,每一帧的物理模拟所做的事情,是根据现有世界中的物体的当前运动状态,比如速度、碰撞状态等,模拟他们经过 Δt 时间之后的运动状态。既然如此,物理引擎如何处理给定的 Δt,就是需要仔细权衡的了。

 

在2.8中,PhysX选择了给出足够的灵活性,定义了几个专门的变量来让开发者控制如何将给定的时间分片(成为substep),然后再按照分片情况分次、逐步往前模拟物理世界。这样做的目的是让开发者有足够的自由度,可以根据实际情况来选择如何划分每一帧的时间,比如,检测到最近几帧fps较低,那么可以减少分片,或者只有不分片,直接一次模拟完成,节省模拟性能;而在对模拟的平滑性要求较高的场合,则多划分几个时间片,得到更细致的模拟结果。

这一点的初衷是没有问题的,但是随灵活性而来的往往还有复杂度的提高,因此在实际使用中,常常会有分片不合理的情况发生,导致一些非预期的结果产生。同时,PhysX 有些算法对每一帧的模拟时长所分成的时间片的长短变化过大比较敏感,因此,在PhysX 3.2中,为了简化这一部分的控制,PhysX放弃了时间分片的做法,直接把给定的模拟时长作为需要模拟的时间,不再分片,同时建议开发者缩小每一帧传递给PhysX 的模拟时间变化范围,如果需要模拟的时间长,那么可以多次模拟。

如果我们在使用2.8的时候对传递给PhysX的模拟时长进行了分片处理,或者有些应用还依赖这个分片,那么我们在升级过程中,就需要针对3.2中的改变,做对应的处理。

 

关于模拟时间控制,还有一点需要提及的是,在PhysX2.8中,未禁止开发人员传入的模拟时间为0,这样的结果是模拟并未真正进行,虽然会有一些状态的更新,但是对模拟流程中期望有正常模拟时间传入的部分,无疑会有副作用。那么在3.2中,PhysX SDK不再支持传入这种方式,并且理论上这种方式也是不必要的。如果你的游戏的某些地方真的依赖这一点,请改掉这个用法。

 

然后,我们来说说碰撞过滤。

碰撞检测是物理引擎最基本的功能之一,但是实际游戏中,有些时候某些物体之间的碰撞是我们不需要的,因此,我们需要告诉物理引擎忽略这些物体之间的碰撞检测,这就是碰撞过滤。

 

在PhysX 2.8中,PhysX给我们提供了很多种碰撞过滤手段:碰撞最基本的单位NxShape上有是否可以跟其他物体碰撞的标志位;每一个NxActor、NxCloth等模拟特性的对象也有是否跟其他物体碰撞的标志位;每一个碰撞基本单位还有collision group、groupsmask等属性控制他们之间是否碰撞。。。这些加在一起,一样提供了足够的灵活性,也一样伴随着设置的复杂度。

 

在PhysX 3.2中,事情简单明了:一切都在一个新增的FilterShader函数中实现。在模拟时,SDK在判断两个物体是否需要碰撞的是时候,会用这一对物体的相关信息来调用FilterShader。为了配合这个函数,对应的,在碰撞基本单位中新增了FilterData这样的属性,原先2.8中的那些碰撞相关的标志位和属性都不再保留。这里补充说一句,由于3.2中布料跟其他特性之间没有碰撞,因此3.2中的碰撞基本单位只有各种Shape和粒子系统了。

当然,这个函数需要我们自己实现,并且指定给PxScene。这就意味着,在升级到3.2的时候,你需要根据游戏设计,定义一套碰撞规则,并且,给每一个Shape和粒子系统设置好对应的filterData,同时在filterShader函数中实现你的规则,达到过滤不需要的碰撞的目的。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值