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,说明查询完毕。