NxOgre 笔记02

来源:互联网 发布:linux bind 编辑:程序博客网 时间:2024/05/03 21:41

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

原创粉丝点击