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

 

發佈了21 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章