启动Nvidia Physx

来自:http://gputoaster.wordpress.com/2010/10/16/tutorial-1-kick-start-nvidia-physx/

 

   Let's Start    

本篇主要内容:

1) 创建PhysX上下文

2)初始化图形环境Graphics Environment

3)销毁PhysX 

 

   1) 初始化PhysX SDK   

开始使用PhysXAPI之前,必须初始化SDK,必须obligatory。通常分一下几个步骤:

    创建NxPysicsSDK对象    

SDK对象是一切的基础。如果SDK没有完成初始化,其后所有的对PhysX对象的操作都只能失败。

NxPhysicsSDK *pPhysics ; //declare globally
pPhysics = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
if(!pPhysics)
   return;

 

 

    创建NxSceneDesc对象    

场景包含如下特性properties:  bodies, restraints 和 effectors。

它们之间会相互作用。场景负责随时间流逝模拟物体状态。

可以同时存在多个场景,条件是所有场景都是某个大场景的一部分。

NxVec3 defaultGravity(0.f, -9.8f0.f); //Declare somewhere in the global scope

NxSceneDesc sceneDesc;
sceneDesc.simType = NX_SIMULATION_HW;
sceneDesc.gravity = defaultGravity;

 

NxSceneDesc结构体有很多内容,每一项都可看做一个描述符,包含了创建NxScene所需的某项信息。

可以用pushBack()方法添加描述符对象到对象描述的列表中。

PhysX描述符定义了会影响到整个PhysX计算的性质nature, 行为behaviour和参数parameters.

simType描述符定义了物理模拟可能是硬件模拟(NX_SIMULATION_HW)或软件模拟(NX_SIMULATION_SW)。硬件模拟需要硬件PPU单元的支持。Nvidia Geforce 8800GT以上的显卡都是支持的。ATI Radeon GPU也支持。

gravity描述符定义的是重力参数,是一个3维向量值,y方向分量为-9.8,m/s。

注: PhysX貌似默认是左右坐标系,+x左+y上+z屏幕向内) 

除此以外,还有很多其他描述符。更多细节参考PhysX文档。 

 

    创建NxScene对象    

上面创建的NxSceneDesc对象是一次性的,只在创建场景对象时有效。

创建对象的方法是使用SDK对象以NxSceneDesc对象为参数调用其createScene()方法。 

复制代码
NxScene *pScene; //Declare Globally (Recommended)
pScene = pPhysics->createScene(sceneDesc);

if(!pScene)
{
    sceneDesc.simType = NX_SIMULATION_SW;
    sceneDesc.gravity = defaultGravity;
    pScene = pPhysics->createScene(sceneDesc);
    if (!pScene) return;

复制代码

可能会因为创建SDK对象时硬件不支持硬件模拟,因此pPhysics对象是NULL,后导致pScene创建失败为NULL。

因此在第一次创建后如果为NULL,在此以软件模型的方式创建SDK对象,并创建pScene。

或者你不需要这么麻烦,直接在创建SDK时就判断硬件对PPU的支持如何,像这样

if (gPhysicsSDK->getHWVersion() > 0)
sceneDesc.simType = NX_SIMULATION_HW;
else

sceneDesc.simType = NX_SIMULATION_SW;   


    开始模拟    

有了NxScene对象就可以用NxScene::simulate()方法开始模拟了。

该方法接收一个表示时间间隔的参数。

通过调用simulate(),PhysX引擎会进行一系列内部操作和计算,得出经过时间间隔之后场景的情形。

复制代码
void StartPhysics(void)
{
NxReal currentTime = GetTime();
pScene->simulate(gDeltaTime);
pScene->flushStream();

复制代码

StartPhysics()方法是PhysX模拟到当前时刻。GetTime()返回是一个NxReal即float型,表示当前时间。

flushStream(),在返回模拟结果前刷新缓存中的所有命令,保证PhysX完成了设置的命令。

 

   2)初始化图形环境   

 

PhysX是独立于图形环境的。你喜欢在哪儿(OpenGL,D3D,Orge,OSG)使用它的模拟结果数据度可以。 


   3)销毁PhysX    

 

复制代码
if(pScene)
{
    ...
    pPhysics->releaseScene(*pScene);
}

if(pPhysics)

    pPhysics->release();  

复制代码


展开阅读全文

没有更多推荐了,返回首页