PhysX使用总结

原文地址:http://www.cnblogs.com/Ryen/archive/2009/12/28/1634259.html


 PhysX中的基本概念:  

            当前的物理引擎主要还是针对刚体的模拟,所以主要总结刚体部分。

             PhysX中的概念主要有:

             Shape:   描述物体的形状。其常用实例有Primary, ConvexShape, TriangleMeshShape等。

             Body:    描述物体的速度,阻力。(Linear quantity, Angular quantity), 对于静态Actor(如地面),其Body属性无效(设置为NULL)。

             Actor: 描述物体的质量,密度(如果物体的形状给定,则不用指定质量 ,质量将通过密度和shape指定的体积计算出来),位置等属性,并最终代表的物体在物理世界中的对象,其创建需要制定相应Shape和Body属性。

  PhysX的基本用法流程:

            1. 创建PhysX SDK.

mPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, NULL, NULL, desc, &errorCode);

            2. 创建PhysX Scene

mPhysXScene = mPhysicsSDK->createScene(sceneDesc);

            3. 在场景中创建各种Actor

            4. 每帧执行物理模拟计算。

gScene -> simulate(gDeltaTime);
gScene
-> flushStream();

            5. 程序退出时回收资源

 

   PhysX中的时间:

        等同于渲染中的祯,物理模拟也有一个每帧的概念--"Simulation is done one time step at a time"。在实时模拟中,我们必须设置模拟的时间片步进以便得到实时的模拟效果。PhysX时间步进主要通过以下两个函数进行控制和实现。

void simulate(NxReal elapsedTime);  // 每帧跟新时进行调用
void setTiming(NxReal maxTimestep=1.0f/60.0f, NxU32 maxIter=8, NxTimeStepMethod method=NX_TIMESTEP_FIXED); // 在场景创建时进行调用

       其中第二个函数决定了时间片步进的策略。而第一个函数在使用是只是相当于往“时间池”中灌水,但是模拟时每步前进的时间由第二个函数控制(例如如果设置为 定常步进,则每次模拟所用的 delta time是固定的,当然这时PhysX会在每帧中尽量进行多次模拟计算,以便接近第一个函数设置的时间)。 一般来说使用使用较短定长时间步进能得到较好的模拟稳定性。

 PhysX推荐的配置是: "The recommended time stepping method for a typical application is fixed time steps where maxTimestep is an exact multiple of elapsedTime and elapsedTime is a constant. ”即:使用定长步长,并且第一个函数的参数每帧都指定一个固定值。

 

   PhysX与Ogre3D的结合:

          主要有两种方法, 转载自这篇文章

1. 将Physx的NxActor的userData指针指向Ogre的SceneNode:

 

复制代码
  
  
NxScene * PhScene; PhScene -> simulate(elapsedTime); PhScene -> flushStream(); PhScene -> fetchResults(NX_RIGID_BODY_FINISHED, false ); NxU32 nb = PhScene -> getNbActors(); NxActor ** actors = PhScene -> getActors(); while (nb -- ) { NxActor * actor =* actors ++ ; if ( ! actor -> isDynamic()) continue ; if (actor -> isSleeping()) continue ; if ( ! actor -> userData) continue ; Ogre::SceneNode * node = (Ogre::SceneNode * )actor -> userData; NxMat34 nm = actor -> getGlobalPose(); NxVec3 pos(nm.t); NxQuat quat(nm.M); node -> setPosition(pos.x,pos.y,pos.z); node -> setOrientation(quat.w,quat.x,quat.y,quat.z); }
复制代码

该方法适用于场景简单的应用。

 

2. 建立一个SceneNode和NxActor的对应表:

     对于复杂的场景,这种低耦合的方式应该更好。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值