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