Novodex 使用介绍 ? 

2006-12-08 19:49 发布

3188 0 0


最近常有一些朋友问我关于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最基本的应用,下次我们会更深入一些

B Color Smilies

你可能喜欢

Novodex 使用介绍 ? 
联系
我们
快速回复 返回顶部 返回列表