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.
推荐阅读
- 编写字典程序
- 怎么将桌面上的CAD图纸添加到软件中进行BMP格式转换()
- 2147483647与int型
- 怎样把一个字典的数据添加到另一个字典中()
- 培养习惯的倦怠期可以添加变化~74
- 如何在Kubernetes|如何在Kubernetes 里添加自定义的 API 对象(一)
- Ubuntu|Ubuntu 下添加开机启动脚本
- Android|Android Room 的坑
- (IOS)为UIView某个角添加圆角
- laravel|laravel 添加扩展包步骤