最近常有一些朋友问我关于NovodeX的一些问题 在这里,我就自己了解的一些写下来,希望能有点帮助 要使用NovodeX,我们首先需要在自己的项目中 包含 NxPhysics.h 这个头文件 然后在项目或者IDE中(以下都以VC为例),加入两个link libs NxPhysics.lib NxFoundation.lib
以上三个文件都可以在下载的sdk中找到 下面我们正式开始使用NovodeX 第一步,让我们来创建一个nx所支持的物理世界 先来定义两个变量 NxPhysicsSDK PhysicsSDK; NxScene* Scene;
PhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, 0, 0); 创建PhysicsSDK PhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY, -0.0001f); 这一步设置了物理叠代的最小精度 NxSceneDesc sceneDesc; 声明一个scene描述 sceneDesc.gravity = NxVec3(0, -98.0, 0); 设全局重力加速度方向和大小 sceneDesc.broadPhase = NX_BROADPHASE_COHERENT; 设叠代算法 sceneDesc.collisionDetection = true; 是否允许碰撞检测 Scene = PhysicsSDK->createScene(sceneDesc); 创建一个physics scene OK ,到此我们已经拥有了一个物理环境,下一步该加入一些物体看看效果了 在NovodeX里,如果想要把物体和物理世界交互,比如创建一个actor,而actor又是根据形状(shape)和 刚体(body)来创建的 NovodeX里提供了4种基本的刚体形状 盒子,球,胶囊以及平面 我们先给世界加个底,设置一个地面 NxPlaneShapeDesc PlaneDesc; 声明一个平面描述 PlaneDesc.normal = NxVec3(0, 1, 0); /// 法线朝上 PlaneDesc.d = 0; //位置在原点 NxActorDesc ActorDesc; 声明一个actor描述 ActorDesc.shapes.pushBack(&PlaneDesc); 把形状描述加入到actor的形状列表里 Scene->createActor(ActorDesc); 创建这个平面的actor 下一步。。。做个盒子好了 NxBoxShapeDesc BoxDesc; 声明一个盒子描述 BoxDesc.dimensions = NxVec3(5, 5, 5); 定义盒子的大小 NxActorDesc ActorDesc; 声明一个actor描述 ActorDesc.shapes.pushBack(&BoxDesc); 把形状描述加入到actor的形状列表里 ActorDesc.density = 1.0f; // 设置actor的密度 ActorDesc.globalPose.t = NxVec3(0, 50, 0); // 设置actor的初始位置 NxActor* boxActor = Scene->createActor(ActorDesc); 创建盒子actor 上面会发现和平面不同的是,出现了两个新的属性globalPose和density globalPose是一个NxMat34类,我们一般取它的两个成员t和M 其中t是一个3元向量,确定位移,而M是一个3X3的矩阵,确定旋转,以后会经常用到 density则代表的是actor的密度,NovodeX会根据密度和物体体积来求出物体的质量,当然 我们也可以直接设置质量,成员是mass,需要注意的是,如果设置了质量,那么密度就 必须设置为0 有了物体,我们就开始让他们动起来 叠代物理世界 Scene->startRun(1/60.f); Scene->flushStream(); Scene->finishRun(); 这三个函数就完成了一次物理叠代,如果没有自定义的Stream,可以忽略掉第2个函数 在第一个函数中我们使用了1/60作为参数,这个代表了一次叠代的时间间隔 在实际应用中,最好是用我们应用程序的每帧间隔时间来代替固定的时间间隔 恩,让我们看看我们的成果吧 boxActor是我们刚才创建的盒子物体,每一祯,我们可以用 float mat[16]; boxActor->getGlobalPoseReference().getColumnMajor44(mat); 得到它的object matrix,那么就用这个矩阵把它画出来看看 怎么,在高处没动静 :), 原谅我卖了个关子 刚才我们只是加入了box的形状,而形状本身只能起到构建物理环境的作用 在我们不主动移动它位置的时候,它是不会动的,若要建立一个符合物理特性的物体 我们还需要给它加上一个刚体,回到刚才创建box actor的地方 加上这两句 NxBodyDesc BodyDesc; BodyDesc.angularVelocity = NxVec3(0.0f, 20.0f, 0.0f); 加上一个初始的角速度 ActorDesc.body = &BodyDesc; 好了,再运行看看? 盒子一边旋转一边落下来了吧 恭喜你,已经成功掌握了NovodeX最基本的应用,下次我们会更深入一些 |