天天看点

physx学习手记

physx放下了一段时间,最近重新拣起,很多东西都忘记,重新复习一下。

1,创建基本物理对象

physx的碰撞对象是actor,每个actor都可以包含任意多个基本物理模型(shape)。

shape有很多种,cube,sphere,capsule,plane,heightfield。

创建一个actor需要3个对象的信息才能创建,body描述,shape描述,actor描述。

body描述了物体的质量,重心等

shape描述的是物体的外形

actor描述位置等

如果希望创建一个静态actor,只需要设置一个空actor的body设置为null,那么在运行时这个物体将不能移动,即便是使用程序。如果希望在运行时,能够通过程序来移动物体,但是他本身是不动的,也不会被其他物体推动,那么在创建的时候,我们可以给body的flag设置一个NX_BF_KINEMATIC 标志。

动态actor必须提供一个有效的body描述,或者不提供shape描述。

质量和密度:

physx通过3种方法计算:

1) actorDesc.density == 0, bodyDesc.mass > 0, bodyDesc.massSpaceInertia.magnitude() > 0

Here the mass properties are specified explicitly, there is nothing to compute.

2) actorDesc.density > 0, actorDesc.shapes.size() > 0, bodyDesc.mass == 0, bodyDesc.massSpaceInertia.magnitude() == 0

Here a density and the shapes are given. From this both the mass and the inertia tensor is computed.

3) actorDesc.density == 0, actorDesc.shapes.size() > 0, bodyDesc.mass > 0, bodyDesc.massSpaceInertia.magnitude() == 0

Here a mass and shapes are given. From this the inertia tensor is computed.

除了以上三种,其他的情况都是无效的。

actor和shape都有密度属性,如果同时指定,那么最终这个shape的密度是两者相乘的值(注意一个actor可能有多个shape)。

物体的group和groupmask

physx可以将物体分组,每组物体之间都可以设置是否碰撞NxShape::setGroup

通过NxScene::setGroupCollisionFlag设置那些组之间可以碰撞

还可以使用分组mask,当boolean等式为真时,物体之间才进行碰撞。

NxShape::setGroupsMask可以设置一个128位值,这个值将放入一个boolean等式中进行计算

boolean等式:

(G0 op0 K0) op2 (G1 op1 K1) == b

G0和G1是分别两个NxShape::setGroupsMask设置。

K0和K1是2个常数分别用NxScene::setFilterConstant0 和NxScene::setFilterConstant1设置

op0,op1,op2是3个boolean操作,使用NxScene::setFilterOps 函数来进行设置,有以下操作:

NX_FILTEROP_AND   与

NX_FILTEROP_OR   或

NX_FILTEROP_XOR   异或

NX_FILTEROP_NAND   与非

NX_FILTEROP_NOR   或非

NX_FILTEROP_NXOR   异或非

NX_FILTEROP_SWAP_AND   ?

b是boolean,用NxScene::setFilterBool 设置

2,射线查询

射线查询可以使用scene直接调用函数,也可以创建scenequery对象来查询,效果是一样的,只不过scenequery必须调用execute函数后,才开始执行查询。

射线查询可以设置同步或者异步

同步时,程序将等待查询完毕,函数才会返回

异步时,函数立刻返回,程序必须检查NxSceneQuery::finish() ,如果返回true,说明查询完毕。

继续阅读