日志系统:
日志记录了基于ogre的程序每次运行时的所有事件,系统初始化,状态,性能信息。输出的内容被放在磁盘文件上,文件缺省名是ogre.log。也可以手动显示创建日志系统,这需要在创建Root对象之前实施。// create an instance of LogManager prior to using LogManager::getSingleton()LogManager* logMgr = new LogManager;Log *log = LogManager::getSingleton().createLog("mylog.log", true, true, false);// third param is not used since we already created a log in the previous stepRoot *root = new Root("", "");可以用Ogre LogManager注册一个Log Listener, 以任何方式重定向log data。可以用这种方式来屏蔽任何日志信息。然后还一个更简单的方法达到上述目的:在实例化Root之前,当实例化一个LogManager后,不调用createLog()方法。以下是实现日志信息截流的代码片断:class MyLogListener : public LogListener{ public:void write (const String& name, const String& message,LogMessageLevel level, bool maskDebug){ // redirect log output here as needed};MyLogListener *myListener = new MyLogListener;// this is the same as calling LogManager::getSingletonPtr() after the// LogManager has first been instanced; the same pointer value is returnedLogManager *logMgr = new LogManager;LogMgr->addListener(myListener);logMgr->createLog("mylog.log", true, false, true);logMgr->setLogDetail(LL_NORMAL);Root *root = new Root("", "", "mylog.log");Ogre手动初始化int main(int argc, char *argv[]) {// tell Root not to load from any plugins or settings file Root *root = new Root("", "");
// Load feature plugins. Scene managers will register // themselves for all scene types they support root->loadPlugin("Plugin_CgProgramManager");
root->loadPlugin("Plugin_OctreeSceneManager");// load rendersystem plugin(s). The order is important in that GL // should be available on on platforms, while D3D9 would be available // only on Windows -- the try/catch will intercept the exception in this // case where D3D9 is not available and continue gracefully.
try { root->loadPlugin("RenderSystem_GL"); root->loadPlugin("RenderSystem_Direct3D9"); } catch (...) {}try {
// We'll simulate the selection of a rendersystem on an arbirtary basis; normally // you would have your own code to present the user with options and select the // rendersystem on that basis. Since a GUI is beyond the scope of this example, we'll // just assume the user selected OpenGL. RenderSystemList *rList = root->getAvailableRenderers(); RenderSystemList::iterator it = rList->begin(); RenderSystem *rSys = 0;while (it != rList->end()) {
rSys = *(it++); if (rSys->getName().find("OpenGL")) { root->setRenderSystem(rSys); break; } }// check to see if a render system was selected; if we reached the end of the list // without selecting a render system then none was found.
if (rSys == 0) { delete root; std::cerr << "No RenderSystem available, exiting..." << std::endl; return -1; }// We can initialize Root here if we want. "false" tells Root NOT to create // a render window for us root->initialise(false);
// set up the render window with all default params RenderWindow *window = rSys->createRenderWindow(
"Manual Ogre Window", // window title 800, // window width, in pixels 600, // window height, in pixels false, // fullscreen or not 0); // use defaults for all other values// from here you can set up your camera and viewports as normal // get a pointer to the default base scene manager -- sufficient for our purposes
SceneManager *sceneMgr = root->createSceneManager(ST_GENERIC);// create a single camera, and a viewport that takes up the whole window (default behavior) Camera *camera = sceneMgr->createCamera("MainCam");
Viewport *vp = window->addViewport(camera); vp->setDimensions(0.0f, 0.0f, 1.0f, 1.0f); camera->setAspectRatio((float)vp->getActualWidth() / (float) vp->getActualHeight()); camera->setFarClipDistance(1000.0f); camera->setNearClipDistance(5.0f);// Run the manual render loop. Since we are not using a frame listener in this case, we // will count to 15 seconds and then instead of exiting, we'll change the render window settings // and re-initialize it. bool renderLoop = true;
Timer *timer = Ogre::PlatformManager::getSingleton().createTimer(); timer->reset(); float s = 0.0f;while (renderLoop && window->isActive()) {
renderLoop = root->renderOneFrame();
// accumulate total elapsed time
s += (float)timer->getMilliseconds() / 1000.0f;// if greater than 15 seconds, break out of the loop
if (s >= 15.0f) renderLoop = false;// we must call the windowing system's message pump each frame to // allow Ogre to process messages //PlatformManager::getSingleton().messagePump();
} } catch (Exception &e) { std::cerr << e.getFullDescription() << std::endl; }delete root;
return 0;}视口通过视口上的一点与相机的原点产生世界空间中的一条光线
// x and y are in "normalized" (0.0 to 1.0) screen coordinatesRay getCameraToViewportRay(Real x, Real y) const;视口,创建多个视口,通过Z序(越高越在上) 确定覆盖效果,每个视口可以有不同的背景。
// assume window is a valid pointer to an existing render window, and// a valid pointer to an existing camera instanceViewport *vpTop, *vpBottom;// second parameter is z-order, remaining params are position and size,vpBottom = window->addViewport(camera, 0);// create a smaller viewport on top, in the center, 25% of main vp sizevpTop = window->addViewport(camera, 1,0.375f, 0.375f,0.25, 0.25);// set the background of the top window to blue (the default is black// need to set the bottom window explicitly)vpTop->setBackgroundColour(ColourValue(0.0f, 0.0f, 1.0f));// an alternate way to set the color is to use the manifest constant// vpTop->setBackgroundColour(ColourValue::Blue);在多视口情况下,overlay缺省在每个视口中渲染。可以关掉。Skybox, Shadow也是如此。vpTop->setOverlaysEnabled(false);vpTop->setSkiesEnabled(false);vpTop->setShadowsEnabled(true);