1. 单位声明
NxOgre使用“米-千克-第二 系统”,以米为长度单位,千克为质量单位,秒为时间单位。
2. 初始化代码
2.1 最顶层类World,单实例。最大容纳32个Scene。不同场景之间的物体不能交互。
2.2 每个场景都有很多Actor,这个数目仅受限于你的机器配置。这些Actor在World中表现成一个物理对象,但他们都是不可见的。
想看到他们,需要使用一个Body,一个简单的Actor,它通过RenderSystem渲染到你的屏幕。
BloodyMess内建了几个渲染系统,包括OpenGL和Ogre,但这并不是要限制你创建自己的渲染系统。
2.3 NxOgre的另一个重要元素就是TimeController。它控制着World中的Actor所逝去的时间。
2.4 为了使用NxOgre及其指定的Ogre渲染类,头文件及链接库
#include <NxOgre.h>
#include <NxOgreOGRE3D.h>
NxOgre.lib
NxOgreOGRE3D.lib
2.5 在类的保护区域,声明世界、场景、和渲染系统的变量
NxOgre::World *mWorld;
NxOgre::Scene *mScene;
OGRE3DRenderSystem *mRenderSystem; // 并非属于NxOgre名称空间
2.6 在createScene()函数中初始化世界
mWorld = NxOgre::World::createWorld();
// 通过场景描述符,初始化场景
NxOgre::SceneDescription sceneDesc;
sceneDesc.mGravity = NxOgre::Vec3(0,-9.8f,0);
sceneDesc.mName = "BloodyMessTutorial2";
mScene = mWorld->createScene(sceneDesc);
// 指定一些应用到整个场景的默认物理量
mScene->getMaterial(0)->setStaticFriction(0.5); // 静摩擦系数
mScene->getMaterial(0)->setDynamicFriction(0.5); // 动摩擦系数
mScene->getMaterial(0)->setRestitution(0.1); // 恢复系数
mRenderSystem = new OGRE3DRenderSystem(mScene);
// 添加物体,外形为1x1x1的盒子,位置是Y正方向上20米
OGRE3DBody *mCube;
mCube = mRenderSystem->createBody(new NxOgre::Box(1,1,1),NxOgre::Vec3(0,20,0),"cube.1m.mesh");
2.7 获取运动需要每一帧都在FrameListener中advance我们的TimeController。
NxOgre::TimeController::getSingleton()->advance(evt.timeSinceLastFrame);
2.8 物理交互作用
OGRE3DBody *mCubeTwo;
mCubeTwo = mRenderSystem->createBody(new NxOgre::Box(1,1,1),NxOgre::Vec3(20,35,0),"cube.1m.mesh");
mCubeTwo->addForce(NxOgre::Vec3(-800,-200,0));
// 创建一个地面平面,这是一个actor,有无限尺寸,不能被移动
mScene->createSceneGeometry(new NxOgre::PlaneGeometry(0,NxOgre::Vec3(0,1,0)),Matrix44_Identity);
// 创建一个OGRE渲染的可见平面,因为NxOgre中的actor是不可见的
MovablePlane *plane = new MovablePlane("Plane");
plane->d = 0;
plane->normal = Vector3::UNIT_Y;
MeshManager::getSingleton().createPlane("PlaneMesh",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
*plane,120,120,1,1,true,1,3,3,Vector3::UNIT_Z);
Entity *planeEnt = mSceneMgr->creatEntity("PlaneEntity","PlaneMesh");
planeEnt->setMaterialName("Examples/Rockwall");
SceneNode *mPlaneNode = mSceneMgr->getRootScenNode()->createChildSceneNode();
mPlaneNode->attachObject(planeEnt);
mPlaneNode->scale(100,100,100);
教程原文
http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_2