• OGRE学习(一)


    12.15

    因为以后工作的需要,需要熟悉OGRE引擎。先从熟悉SDK的使用入手吧。

    OgreSDK1.7.1提供的Sample,繁杂的内容过多。我列了个简单的代码,暂能够跑一个简单的OGRE程序(新手一定很喜欢^__^)。代码如下:

    //-----------------------------------------------------------------------------------------------------------------------

    #include "OgrePrerequisites.h"
    #include "OgreRoot.h"
    #include "OgreWindowEventUtilities.h"
    #include "OgreRenderWindow.h"
    #include "OgreSceneManager.h"
    #include "OgreCamera.h"
    #include "OIS/OIS.h"
    #include "windows.h"

    Ogre::Root* mRoot;              // OGRE root
    Ogre::RenderWindow* mWindow;    // render window
    Ogre::SceneManager* mSceneMgr;
    Ogre::Camera *mCamera;
    OIS::InputManager* mInputMgr;   // OIS input manager

    INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
    {
        mRoot = 0;
        mWindow = 0;
        Ogre::String pluginsPath = Ogre::StringUtil::BLANK;
        #ifdef _DEBUG
            mRoot = OGRE_NEW Ogre::Root("plugins_d.cfg");
        #else
            mRoot = OGRE_NEW Ogre::Root();
        #endif
        mRoot->showConfigDialog();
        mWindow = mRoot->initialise(true);
        mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "MySceneManager");
        mCamera = mSceneMgr->createCamera("MainCam");
        mCamera->setAspectRatio(1.333333f);
        mCamera->setFOVy(Ogre::Radian(45.0f));
        mCamera->setNearClipDistance(1.0f);
        mCamera->setFarClipDistance(1000.0f);
        mCamera->setPosition(0, 10, 0);
        Ogre::Viewport * vp1 = mWindow->addViewport(mCamera);
        Ogre::Viewport * vp2 = mWindow->addViewport(mCamera,1,0.5f,0.0f,0.5f,0.5f);
        Ogre::Viewport * vp3 = mWindow->addViewport(mCamera,2,0.0f,0.5f,0.5f,0.5f);
        Ogre::Viewport * vp4 = mWindow->addViewport(mCamera,3,0.5f,0.5f,0.5f,0.5f);
        vp1->setBackgroundColour(Ogre::ColourValue());
        vp2->setBackgroundColour(Ogre::ColourValue(0.0,0.0,1.0));
        vp3->setBackgroundColour(Ogre::ColourValue(0.0,1.0,1.0));
        vp4->setBackgroundColour(Ogre::ColourValue(1.0,0.0,1.0));

        bool run =true;
        while ( run )
        {   
            Ogre::WindowEventUtilities::messagePump();
            if (!mRoot->_fireFrameStarted())
                break;
            if ( mWindow->isClosed() )
                break;
            if (!mRoot->_updateAllRenderTargets())
                break;
            if (!mRoot->_fireFrameEnded())
                break;
            //mWindow->update();

        }
        //mRoot->startRendering();    // start the render loop

        mRoot->saveConfig();
        mRoot->shutdown();
        if (mRoot) OGRE_DELETE mRoot;

        return 0;
    }

    //-----------------------------------------------------------------------------------------------------------------------

    运行界面:

    image

          另外,抽空理了理OGRE的一些要素,以下是官方提供的一张框架图,做为参考。

          Ogre中Root挂了很多Node,Node下可以挂其他的Node。这些Node一般是可绘制的节点,称之为Renderable,Node通常又包含了一些MovableObject,

    MovableObject可以是Camera,Light,Entity(包含了位置、选择等信息)等。Node通常又拥有一个AABB(可通过MovableObject及子Node节点的AABB算出),这个AABB供SceneManager进行可见性判断。如果可见的话,Node(Renderable)被放入一个Map组织的渲染队列RenderQueue,RenderQueue会针对Renderable的情况排序。最后再统一批次做Renderable的渲染。

    image

  • 相关阅读:
    java异常
    Swfmill概述
    AS3中e4x用法纲要
    抽象工厂模式(Abstract Factory)
    动态绑定、抽象类、接口
    Form中Trigger的执行顺序
    Form 中FND_Message的用法总结
    Form属性、内置子程序、触发器、系统变量
    Oracle EBS R12 XML数据表格的Excel脚本报表 PLUS :问题杂烩
    Oralce EBS Alert
  • 原文地址:https://www.cnblogs.com/dawn/p/1906872.html
Copyright © 2020-2023  润新知