相信每一位读者朋友一直会有一个这样的疑问,虽然我们通过前面章节的学习可以做出一些相对比较复杂的应用程序了,但是总是感觉不能完全把握整个Ogre3D的流程,而且我们前面都是在继承Ogre3D为我们提供的模板类的基础上构建的应用程序,虽然这样减少了我们不少工作,但是对于刚接触Ogre3D的我们来说或许并不是什么好事,是的,现在是时候和大家一起学习一下Ogre3D框架是怎样一步一步搭建起来,是怎样一步一步启动起来的了。
这一节我们不再继承Ogre3D为我们提供的ExampleApplication类,也不再使用我们一直用的那个模板代码,我们自己从头编写所有代码来完成所有工作,以此让大家来跟好的理解Ogre3D的启动序列。
手动建立第一个应用
第一步,我们建立一个空的Win32项目;
第二步,添加OgreMain_d.lib OIS_d.lib,并修改工作目录(如果你对这里有任何疑问,请参阅《Ogre初步》一章);
第二步,新建一个Main.cpp文件(名字任意),并添加如下代码:
#include <windows.h> #include "Ogre.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { return 0; } |
第三步,创建一个Ogre3D的Root对象,在WinMain函数中加入如下代码:
Ogre::Root*mRoot = new Ogre::Root("plugins_d.cfg"); |
第四步,添加Ogre配置对话框,继续在WinMain函数中加入如下代码:
if (!mRoot->showConfigDialog()) { return -1; } |
第五步,创建渲染窗口:
Ogre::RenderWindow*mWindow = mRoot->initialise(true,"IMedia Project"); |
第六步,创建场景管理器:
Ogre::SceneManager*mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC); |
第七步,创建相机:
Ogre::Camera*mCamera = mSceneMgr->createCamera("MyCamera"); mCamera->setPosition(Ogre::Vector3(0,0,80)); mCamera->lookAt(Ogre::Vector3(0,0,-300)); mCamera->setNearClipDistance(5); |
第八步,创建视口,并设置背景色以及纵横比:
Ogre::Viewport*vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(Ogre::ColourValue(0,0,0)); mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight())); |
第九步,调用跟对象的startRendering函数开始渲染场景:
mRoot->startRendering(); |
下面列出我们添加的所有代码:
#include <windows.h> #include "Ogre.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { Ogre::Root*mRoot = new Ogre::Root("plugins_d.cfg"); if (!mRoot->showConfigDialog()) { return -1; } Ogre::RenderWindow*mWindow = mRoot->initialise(true,"IMedia Project"); Ogre::SceneManager*mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC); Ogre::Camera*mCamera = mSceneMgr->createCamera("MyCamera"); mCamera->setPosition(Ogre::Vector3(0,0,80)); mCamera->lookAt(Ogre::Vector3(0,0,-300)); mCamera->setNearClipDistance(5);
Ogre::Viewport*vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(Ogre::ColourValue(0,0,0)); mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight()));
mRoot->startRendering(); return 0; } |
编译并运行程序,如果读者能看到一个黑屏