人气 260

[游戏程序] Novodex 使用介绍 ? [复制链接]

九艺网 2017-3-10 17:01:55

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-18 14:13 , Processed in 0.126049 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.