下面就在InitNx()中开始初始化实例以及建立场景。
①.实例化 physics SDK
gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
初始化完Physics SDK后,只是简单的一个实例。可以通过设置实例的物理参数来充实我们的模拟效果。
gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01);
②.创建场景
NxSceneDesc sceneDesc; //场景表述表对象
sceneDesc.gravity = gDefaultGravity;
sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;
sceneDesc.collisionDetection = true;
gScene = gPhysicsSDK->createScene(sceneDesc);
在PhysX中,不管是创建场景还是创建各个物体角色时,都是先通过各自对应的描述器(翻译的不是很准确)设置场景和各个物体的物理参数,用来模拟真实的世界环境和物体。建立好表述器后,通过函数createScene(NxSceneDesc)函数就可以建立需要的场景对象。
一般情况下,场景描述器的参数就是设置重力加速度sceneDesc.gravity,是否进行碰撞检测collisionDetection, true为进行,在PhysX SDK中描述器被广泛的应用。 描述器包括所有你创建物体的信息broadphase-coherent是三种碰撞检测中的一种。
gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01);
当相互碰撞的物体的材质都很软的时候,在现实中就会发现当发生碰撞的时候物体之间就会相互嵌入一部分,在这里我们就可以利用物理参数NX_SKIN_WIDTH,它的默认值为0.05m,该值越大,嵌入的就越多
同时,我们可以对场景中的所有物体创建材质。创建的材质定义了碰撞和物体材料的物理属性。比如反弹系数、静摩擦力、滑动摩擦力等。
// Create the default material通过材质索引创建一个材质的对象
NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
defaultMaterial->setRestitution(0.5);
defaultMaterial->setStaticFriction(0.5);
defaultMaterial->setDynamicFriction(0.5);
创建物体,以box为例
NxActor* box = CreateBox(NxVec3(5,1,0));
NxActor* CreateBox(const NxVec3& pos)
{
// Add a single-shape actor to the scene
NxActorDesc actorDesc;
NxBodyDesc bodyDesc;
// The actor has one shape, a box
NxBoxShapeDesc boxDesc;
boxDesc.dimensions.set(0.5,1,0.5);
actorDesc.shapes.pushBack(&boxDesc);
actorDesc.body = &bodyDesc;
actorDesc.density = 10;
actorDesc.globalPose.t = pos;
return gScene->createActor(actorDesc);
}
我们创建一个角色参与者box,它的类型为NxActor*。建立该对象的时候需要设置它的描述器,然后利用函数createActor(NxActorDesc actorDesc)将该对象加入场景中。每一个对象又有和自己形状相对应的描述器。利用它设置对象的物理参数。boxDesc该描述器描述了该盒子的长、宽、高分别为0.5,初始化的位置以及该盒子的密度。
③.创建完所有的物体对象时,调用UpdateTime()得到从上一帧渲染到现在经过的时间
④.当创建的场景成功,利用函数StartPhysics()开始它的第一帧模拟。
void StartPhysics()
{
// Update the time step
NxReal deltaTime = UpdateTime();
// Start collision and dynamics for delta time since the last frame
gScene->simulate(deltaTime);
gScene->flushStream();
}
simulate(deltaTime)是PhysX 解决物理学的关键
flushStream()对时间步进行仿真
四。glutMainLoop()
程序将一直停留在glutMainLoop()中,直到用户自己结束。当场景一旦被渲染后,在每次设置下一场景时,RenderCallback()回调函数将被调用
五。ReleaseNx()
删除场景中所有的物体对象以及场景本身