天天看點

PhysX添加物體的詳細步驟

    在PhysX中,一個物體即是一個Actor類對象。要添加Actor,首先要建立這個物體所在的場景Scene,然後構造一個Actor對象,再把Actor添加到Scene中。

   我們構造一個Actor是通過構造一個角色描述NxActorDesc來實作的,描述将貫穿于整個SDK中,基本上大部分添加的物體都是先描述,然後構造的。

    NxActorDesc本身是一個類,它的成員又是由一些基本的描述類組成的,而這些類又是由更基本的類組成的。是以構造Actor就像是搭積木一樣,先擺最底下的積木,擺好一排之後再在上面構造第二層,最後構造最上面的一個積木,再把他加到Scene中。下面這個檔案展示了ActorDesc類的構造大廈。

/*/

這份資料呈現的是利用PhysX建立物體中一個重要的類: NxActorDesc 類。

它顯示了建立一個Actor所需要的一般的資料是在哪些地方指明的。

/*/

// 這不是一個c++檔案,而隻是借用了代碼折疊這個功能來展示類與類之間的包含關系。

// 首行是這個類的名字,緊随其後的是他的成員變量,如果成員變量也是一個類,那麼

// 下面将嵌套這個類的成員變量,我隻呈現比較主要的類。而比較主要的成員變量,我

// 會在上面加一行注釋:// 成員變量 ***

class NxActorDesc

{

// 繼承于:

class NxActorDescBase

{

// 成員變量 globalPose

NxMat34 globalPose ;

// 成員變量 body

const NxBodyDesc * body ;

class NxBodyDesc

{

NxMat34 massLocalPose ;

NxVec3 massSpaceInertia ;

NxReal mass ;

NxVec3 linearVelocity ;

NxVec3 angularVelocity ;

NxReal wakeUpCounter ;

NxReal linearDamping ;

NxReal angularDamping ;

NxReal maxAngularVelocity ;

NxReal CCDMotionThreshold ;

NxU32 flags ;

NxReal sleepLinearVelocity ;

NxReal sleepAngularVelocity ;

NxU32 solverIterationCount ;

NxReal sleepEnergyThreshold ;

NxReal sleepDamping ;

NxReal contactReportThreshold ;

};

// 成員變量 density

NxReal density ;

NxU32 flags ;

NxActorGroup group ;

NxDominanceGroup dominanceGroup ;

NxU32 contactReportFlags ;

NxU16 forceFieldMaterial ;

// 成員變量 userData

void * userData ;

const char * name ;

NxCompartment * compartment ;

};

// 成員變量 shapes

NxArray< NxShapeDesc *, NxAllocatorDefault > shapes ;

// 其元素是指向一個具體的形狀描述,它可以是下列類對象的一個指針

// NxBoxShapeDesc

// NxCapsuleShapeDesc

// NxConvexShapeDesc

// NxHeightFieldShapeDesc

// NxPlaneShapeDesc

// NxSphereShapeDesc

// NxTriangleMeshShapeDesc

// NxWheelShapeDesc

// 它們均繼承于 NxShapeDesc 類

// 下面僅列出 NxConvexShapeDesc 類的成員變量

class NxConvexShapeDesc

{

// 繼承于:

class NxShapeDesc

{

// 成員變量 localPose

NxMat34 localPose ;

NxU32 shapeFlags ;

NxCollisionGroup group ;

NxMaterialIndex materialIndex ;

NxCCDSkeleton * ccdSkeleton ;

// 成員變量 density

NxReal density ;

// 成員變量 mass

NxReal mass ;

// 成員變量 skinWidth

NxReal skinWidth ;

// 成員變量 userData

void * userData ;

// 針對于 NxConvexShapeDesc , 它是一個指向 NxConvexMeshDesc 的指針

class NxConvexMeshDesc

{

// 成員變量 numVertices

NxU32 numVertices ;

NxU32 numTriangles ;

// 成員變量 pointStrideBytes

NxU32 pointStrideBytes ;

NxU32 triangleStrideBytes ;

// 成員變量 points

const void * points ;

const void * triangles ;

// 成員變量 flags

NxU32 flags ;

};

const char * name ;

NxGroupsMask groupsMask ;

NxU32 nonInteractingCompartmentTypes ;

};

// 成員變量 meshData

NxConvexMesh * meshData ;

NxU32 meshFlags ;

};

};

    可以看到,NxActorDesc是由NxActorDescBase繼承來的。NxActorDesc主要包含了兩個成員變量,一個是Shapes,一個是body,body是繼承于NxActorDescBase的成員變量,shapes是它新增的.Shapes主要是描述了這個角色的頂點屬性,它是什麼形狀的,外觀是怎樣的;而body則是描述了這個Actor的實體屬性,比如品質,轉動慣量等等。Shapes是一個Nx隊列,是以,一個Actor是由許多的Shapes組成的,但隻有一個body,我們可以看到Shape也是有密度等實體屬性的,實際上,我們是通過各個Shape的實體屬性最後建立的時候才統計到body的,是以在建立body時你無須管它的成員變量。

    看起來,要建構這個Actot可不是一件易事,成員那麼多,如何下手呢?

    其實做起來很容易,按照搭積木的步驟一層一層來就可以了,大部分物體的添加都是這一個模式,按照下圖綠色箭頭的步驟添加即可。其中紅色箭頭是指針關系或者是指派關系。

PhysX添加物體的詳細步驟

    上圖上半部分是PhysX管理的東西,下半部分是圖形顯示的東西。中間通過一個具體的形狀描述類連接配接起來的。

    具體過程請參照你下載下傳的SDK教程的,如果你是2.8.1版,那麼這個教程應該在:

NVIDIA Corporation/NVIDIA PhysX SDK/v2.8.1/TrainingPrograms/Programs/Chapter1_Rigid_Bodies/Lesson102_Mesh_Shapes.