天天看點

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,說明查詢完畢。

繼續閱讀