游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6423|回复: 3

Novodex 使用介绍

[复制链接]

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-4-6 10:40:00 | 显示全部楼层 |阅读模式
最近常有一些朋友问我关于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(&amplaneDesc);
把形状描述加入到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最基本的应用,下次我们会更深入一些


































8

主题

553

帖子

560

积分

高级会员

Rank: 4

积分
560
发表于 2005-4-6 12:14:00 | 显示全部楼层

Re:Novodex 使用介绍

Novodex相对于ODE和Tokamak最大的优势就是支持kinematics(正向动力学),而且不想Havok它可以免费使用,我正是因为kinematic才选择它的,不过不开源的东西我有点不喜欢。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-4-6 12:26:00 | 显示全部楼层

Re:Novodex 使用介绍

NovodeX比较好的地方是SDK的文档以及相关的例子比较全,用起来会比其他引擎方便很多。

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2005-4-7 02:32:00 | 显示全部楼层

Re:Novodex 使用介绍

物理引擎这东西....如果谁能实现一个安全的分布式计算方案应用到网络游戏中.就爽了..我这几天在看Mosix集群计算的架设....对这个非常有兴趣...
唯一遗憾的是,没那么多计算机和交换机.要不弄个集群玩玩.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表