来自: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对象的操作都只能失败。
pPhysics = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
if(!pPhysics)
return;
创建NxSceneDesc对象
场景包含如下特性properties: bodies, restraints 和 effectors。
它们之间会相互作用。场景负责随时间流逝模拟物体状态。
可以同时存在多个场景,条件是所有场景都是某个大场景的一部分。
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()方法。
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的支持如何,像这样
sceneDesc.simType = NX_SIMULATION_HW;
else
sceneDesc.simType = NX_SIMULATION_SW;
开始模拟
有了NxScene对象就可以用NxScene::simulate()方法开始模拟了。
该方法接收一个表示时间间隔的参数。
通过调用simulate(),PhysX引擎会进行一系列内部操作和计算,得出经过时间间隔之后场景的情形。
{
NxReal currentTime = GetTime();
pScene->simulate(gDeltaTime);
pScene->flushStream();
}
StartPhysics()方法是PhysX模拟到当前时刻。GetTime()返回是一个NxReal即float型,表示当前时间。
2)初始化图形环境
PhysX是独立于图形环境的。你喜欢在哪儿(OpenGL,D3D,Orge,OSG)使用它的模拟结果数据度可以。
3)销毁PhysX
{
...
pPhysics->releaseScene(*pScene);
}
if(pPhysics)
pPhysics->release();