版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Root类:Ogre的程序所需要作的第一件事情就是实例化一个Root对象。Root类的构造函数:Root*root=newRoot();Root*root=newRoot(“plugins.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”,“ogre.log”);Root*root=newRoot(“”,“”);第2课Ogre应用程序基础Root类:第2课Ogre应用程序基础plugins.cfg文件在启动的Ogre时候,会载入plugins.cfg配置文件来查看有哪些插件可以被使用。#Definespluginstoload
#DefinepluginfolderPluginFolder=.//PluginFolder标签的值告诉了Ogre到哪个目录下找下面所使用得的插件。
#Defineplugins //Ogre载入的具体插件Plugin=RenderSystem_Direct3D9Plugin=RenderSystem_GLPlugin=Plugin_ParticleFXPlugin=Plugin_BSPSceneManagerPlugin=Plugin_OctreeSceneManagerPlugin=Plugin_CgProgramManager第2课Ogre应用程序基础plugins.cfg文件第2课Ogre应用程序基础渲染窗口可以调用Root对象的initialise()方法来进行系统初始化:
root->initialise(true,”MyRenderWindow”); RenderWindow*window=root->getAutoCreatedWindow();initialise方法的第一个参数告知Ogre系统是否自动建立一个渲染窗口来给用户使用。在我们这里选择了简单的方法,让Ogre给我们提供渲染窗口。第二个参数并且把“MyRenderWindow”作为程序窗口的标题。在这里如果没有提供你自己的窗口标题,那程序就会使用默认的“OGRERenderWindow”。第二行代码可以用来得到自动创建的渲染窗口实例的指针。第2课Ogre应用程序基础渲染窗口第2课Ogre应用程序基础Ogre需要摄影机(Camera)来“拍摄”场景:Camera*cam=sceneMgr->createCamera(“MainCamera”);cam->setNearClipDistance(5);cam->setFarClipDistance(1000);cam->setAspectRatio(Real(1.333333));场景管理器是一个生产在你场景中不同对象实体的“工厂”。通过简单调用SceneManager的createCamera()方法,就能得到一个新的摄像机实例。之后你就可以使用这台摄像机来拍摄渲染你的场景了。第2课Ogre应用程序基础Ogre需要摄影机(Camera)来“拍摄”场景:第2课创建一个视口“Viewport”:Viewport*vp=window->addViewport(camera);vp->setBackgroundColour(ColourValue(0,0,0));
代码创建了一个视口对象的实例,同时我们也设置了视口(viewport)的背景颜色。第2课Ogre应用程序基础创建一个视口“Viewport”:第2课Ogre应用程序基渲染循环:调用Root对象的srartRendering()方法开始渲染你的场景:root->startRendering();在调用之后,Ogre就会不断地渲染在你场景中所有能被渲染的东西。你可以通过关闭渲染窗口来结束这个过程。当你在注册了帧监听(FrameListener)对象,然后在回调结束后返回一个false值给系统,同样也能结束程序渲染。第2课Ogre应用程序基础渲染循环:第2课Ogre应用程序基础帧监听: 如果决定使用startRender()来开始你的渲染过程,你就只能通过使用帧监听对象来在渲染循环中插入你自己的代码了。
所谓帧监听对象就是一个符合FrameListener接口的类的实例。当Ogre渲染每一帧的开始和结束的时候会回调FrameListener接口的方法。 当程序执行的时候,会在每一次进入Ogre渲染管线之前调用你定义的frameStarted()方法。第2课Ogre应用程序基础帧监听:第2课Ogre应用程序基础实例代码:classMyFrameListener:publicFrameListener{public: boolframeStarted(constFrameEvent&evt); boolframeEnded(constFrameEvent&evt); }; boolMyFrameListener::frameStarted(constFrameEvent&evt){
//在每一帧画面渲染前,调用这里你写好的代码 returntrue; } boolMyFrameListener::frameEnded(constFrameEvent&evt){
//在每一帧画面渲染后,调用这里你写好的代码 returntrue; }
第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础实例代码:Root*root=newRoot();MyFrameListenermyListener;
//在这里你需要在调用startRendering()方法前,注册你的帧监听对象!!!root->addFrameListener(&myListener);root->startRendering();第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础深入理解Ogre程序:手动载入插件Root提供了两种方法来处理手动载入插件:voidloadPlugin(constString&pluginName);voidunloadPlugin(constString&pluginName);第一个方法是用来通过名称载入相应插件的。第二个方法是被用来卸载插件。#ifdefined(_DEGUG)
root->loadPlugin(“Plugin_ParticleFX_d”);#else
root->loadPlugin(“Plugin_ParticleFX”);#endif第2课Ogre应用程序基础深入理解Ogre程序:第2课Ogre应用程序基础 Ogre程序已有的插件:
·Plugin_OctreeSceneManager:以八叉树空间管理为基础的OctreeSceneManager(八叉树场景管理器——OSM)。同时包含了从其中派生出来的TerrainSceneManager(地形场景管理器),用来处理从高度图(heightMapped)派生出来的地形场景。·Plugin_BSPSceneManager:提供一个对BSP场景的管理系统,用来读取和处理来自雷神之锤III中的地图文件。不过在今天看来这已经是一个古老的地图格式,并且已经没有人再维护和支持它了(提供这个插件的唯一原因是为了某个演示程序的执行)。
·Plugin_CgProgramManager:这个插件负责载入、分析、编译并且管理Cg语言所写的GPU渲染程序。在今天看来,似乎Cg逐渐被当今技术所抛离(它只能支持3.0版本以前的profiles),因此其价值也越来越小;幸好Ogre在其内部同时支持HLSL和GLSL程序的GPU开发。第2课Ogre应用程序基础 Ogre程序已有的插件:第2课Ogre应用程序基础 Ogre程序已有的插件:·Plugin_ParticleFX:粒子系统管理插件;提供了很多粒子的效果器(Affector)和发射器(Emitter),用来实现一些基本的粒子特效。·RenderSystem_Direct3D9:Windows上面对Direct3D9的抽象层实现·RenderSystem_GL:针对所有平台上OpenGL的抽象层实现。第2课Ogre应用程序基础 Ogre程序已有的插件:第2课Ogre应用程序基础2.载入渲染系统:Root类提供了用来确认那些API可以被使用的getAvailableRenderers()方法:RenderSystemList*getAvailableRenderers();
Root同时也提供了一些用于设置和得到已经载入渲染系统的方法:
voidaddRenderSystem(RenderSystem*naeRend);RenderSystem*getRenderSystemByName(constString&name);voidsetRenderSystem(RenderSystem*system);RenderSystem*getRenderSystem(void);第2课Ogre应用程序基础2.载入渲染系统:第2课Ogre应用程序基础实例代码://RenderSystemList是std::vector类型RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();
while(it!=rList->end()){//Ogre的字符串类型String是std::string的扩展RenderSystem*rSys=*(it++);if(rSys->getName().find(“OpenGL”)){
//把OpenGL渲染系统设置为我们使用的渲染系统
root->setRenderSystem(rSys);Break; } }//注意,如果系统没有支持OpenGL的话,我们就没有设置任何渲染系统!这将会引起一个Ogre设置期间的异常产生。第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础3.渲染窗口 当使用手动方式创建渲染窗口的时候,需要通过RenderSystem类而不是Root类的方法来创建。#include“Ogre.h”Root*root=newRoot(“”,””);
//建立一个没有配置文件的Root实例root->loadPlugin(“RenderSystem_Direct3D9”);//载入渲染系统插件root->loadPlugin(“RenderSystem_GL”);
//在这里我们伪装成用户已经选择了OpenGL渲染器StringrName(“OpenGLRenderSubsystem”);RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();RenderSystem*rSys=0;第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础3.渲染窗口while(it!=rList->end()){
rSys=*(it++);
if(rSys->getName()==rName){
//设置渲染器,并结束循环
root->setRenderSystem(rSys);
break; } }
//如果没有找到一个可用的OpenGL渲染器,就在这里结束程序。if(root->getRenderSystem()==NULL){
deleteroot; return-1; }第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础3.渲染窗口
//root初始化的时候,我们可以传入一个false值来告知Root不用给我们创建渲染窗口。root->initialise(false);
//在这里我们仍然使用默认的参数来创建渲染窗口RenderWindow*window=rSys->createRenderWindow(
“ManualOgreWindow”,//窗口的名字
800,
//窗口的宽度(像素)
600,
//窗口的高度(像素)
false,
//是否全屏显示0);
//其他参数,使用默认值//在这之后你就可以向之前所说的一样创摄像机和视口了。第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础NameValuePairList类:可用于设置窗口属性,如渲染窗口的名称和渲染窗口的标题是用不一样的字符串。NameValuePairListparams;params[“left”]
=“0”;params[“top”]=“0”;params[“title”]=“AlternateWindowTitle”;
RenderWindow*window=rSys->createRenderWindow(
“MainWindow”,
//渲染目标的名字
800,
//窗口的宽度(像素)
600,
//窗口的高度(像素)
false,
//是否全屏显示 ¶ms);
//其他参数,这次我们在上面已经设置了第2课Ogre应用程序基础NameValuePairList类:第2课Ogre应用程把Ogre渲染窗口插入到一个已经存在的窗口中://hWnd是一个Win32系统中存在的窗口的句柄。//渲染系统的指针所指的是一个初始化过的D3D9RenderSystem的实例。
NameValuePairListopts;opts[“parentWindowHandle”]=StringConverter::toString(hWnd);//everythingbut“opts”issomewhatirrelevantinthecontextofan//explicitlyparentedwindowRenderWindow*window=RenderSystem->createRenderWindow(
“WindowName”,
800,600,
false,&opts);第2课Ogre应用程序基础把Ogre渲染窗口插入到一个已经存在的窗口中:第2课Ogr把Ogre渲染窗口插入到一个已经存在的窗口中:
Ogre的窗口消息处理函数在这里被忽略了,因此你要手动处理Ogre相关的消息,比如当用户点击关闭按键时候,清理Ogre渲染窗口。第2课Ogre应用程序基础把Ogre渲染窗口插入到一个已经存在的窗口中:第2课Ogr4.场景管理器创建方法:SceneManager*sceneMgr=root->createSceneManager(ST_GENERIC,“MySceneManager”);·ST_GENERIC:最简单的场景管理器的构造器类型,其场景管理器没有对场景内容和结构做任何优化。在极其简单的场景中(例如菜单界面)中才有其价值。·ST_INTERIOR:这种场景管理器的构造器所产生的管理器,优化了室内近距离的渲染,比较适合高密度的场景。·ST_EXTERIOR_CLOSE:优化了室外场景里面的中近距离可视体,比较适合用一个简单模型或者高度场产生的场景地图。·ST_EXTERIOR_FAR:Ogre历史遗留的错误,已经不需要在考虑使用它。在需要的时候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR来代替这个选项。
·ST_EXTERIOR_REAL_FAR:这种类型的场景管理器特别适合那种需要动态加载的地形或者场景。动态加载的地形通常都非常巨大,甚至可能描绘了一个星球的地貌。第2课Ogre应用程序基础4.场景管理器第2课Ogre应用程序基础5.摄像机(x,y,z)代表摄像机所在点的坐标。X和Y分别代表近截面的宽度和高度Z代表从摄像机到近截面的距离。X’和Y’代表远截面的宽度和高度,其中(Z+Z’)的和代表着从摄像机到远截面的距离。摄像机的纵宽比率(X/Y)视方向和视截体下截面的夹角W第2课Ogre应用程序基础5.摄像机第2课Ogre应用程序基础实例:拥有标准3:4的纵宽比;近截面距离摄像机5单位,远截面距离1000单位;视线方向和视截体的下平面(以及上平面)拥有30度夹角(换句话说,就是上图的W等于30°)//sceneManager是一个已经存在的场景管理器实例的指针。//我们在这里构建名称为“MainCam”的摄像机。Camera*camera=sceneMgr->createCamera(“MainCam”);
//并不需要计算什么,可以直接从视口中得到这个尺寸camera->setAspectRatio(1.333333f);
//30度角可以让我们看到一个长而远的视野camera->setFOVy(30.0f);camera->setNearClipDistance(5.0f);camera->setFarClipDistance(1000.0f);第2课Ogre应用程序基础实例:拥有标准3:4的纵宽比;近截面距离摄像机5单位,远截面摄像机渲染模式:摄像机支持3种不同的渲染模式:边框,实体,“点”camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonModemode=camera->getPolygonMode();第2课Ogre应用程序基础摄像机渲染模式:第2课Ogre应用程序基础摄像机位置和变换:摄像机是一个MovableObject(活动对象)接口的实现,因此也具有这对象的所有方法和特性。设置摄像机位置的实例://确认我们已经有一个指向“Camera”类型实例的指针camera。camera->setPosition(200,10,200);
//也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些//camera->setPosition(Vector3(200,10,200));第2课Ogre应用程序基础摄像机位置和变换:第2课Ogre应用程序基础移动摄像机到当前位置的相对位置的实例://假设摄像机还在我们之前设置的200,10,200空间位置上。
camera->move(10,0,0);//摄像机移动到210,10,200camera->moveRelative(0,0,10);//摄像机移动到210,10,210第2课Ogre应用程序基础移动摄像机到当前位置的相对位置的实例:第2课Ogre应用程操纵摄像机的方法:voidsetDirection(Realx,Realy,Realz);voidsetDirection(constVector3&vec);Vector3getDirection(void)const;Vector3getUp(void)const;Vector3getRight(void)const;voidlookAt(constVector3&angle);voidlookAt(Realx,Realy,Realz);voidroll(constRadian&angle);voidroll(Realdegrees){roll(Angle(degrees));}voidyaw(constRadian&angle);voidyaw(Realdegrees){yaw(Angle(degrees));}voidpitch(constRadian&angle);voidpitch(Realdegrees){yaw(Angle(degrees));}第2课Ogre应用程序基础操纵摄像机的方法:第2课Ogre应用程序基础操纵摄像机的方法:voidrotate(constVector3&axis,constRadian&angle);voidrotate(constVector3&axis,Realdegrees){rotate(axis,Angle(degrees));}void
setFixedYawAxis(booluseFixed,constVector3&fixedAxis=Vector3::UNIT_Y)constQuaternion&getOrientation(void)constvoidsetOrientation(constQuaternion&q);voidsetAutoTracking(boolenabled,SceneNode*target=0,constVector3&offset=Vector3::ZERO);第2课Ogre应用程序基础操纵摄像机的方法:第2课Ogre应用程序基础获得摄像机属性的方法:constQuaternion&getDerivedOrientation(void)const;constVector3&getDerivedPosition(void)const;Vector3getDerivedDirection(void)const;Vector3getDerivedUp(void)const;Vector3getDerivedRight(void)const;constQuaternion&getRealOrientation(void)const;constVector3&getRealPosition(void)const;Vector3getRealDirection(void)const;Vector3getRealUp(void)const;Vector3getRealRight(void)const; 有“Real”关键字的方法返回的是世界空间的坐标,而拥有“Derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。第2课Ogre应用程序基础获得摄像机属性的方法:第2课Ogre应用程序基础6.主渲染循环之前我们通过调用Root::startRendering()方法来执行这个循环。其实这个方法也只是简单的循环调用renderOneFrame()(渲染一帧)来进行程序运行工作。手动渲染循环的框架例程:boolkeepRendering=true;
//在这里填入所有这个章节之前提到的设置过程://载入插件,创建渲染窗口和场景管理器以及摄像机和视口,//然后再场景中填入你希望的内容。
while(keepRendering){//在这里处理引擎使用的网络消息。//在这里处理引擎使用的输入消息。//根据消息更新场景管理状态。
//根据新的场景管理状态,渲染下一帧。root->renderOneFrame();第2课Ogre应用程序基础6.主渲染循环第2课Ogre应用程序基础6.主渲染循环手动渲染循环的框架例程:
//检查是否需要退出渲染循环//注意:NextMessageInQueue()这个函数只是为了便于解释程序含义//而虚构出来的函数——Ogre引擎中并没有实现它。If(NextMessageInQueue()==QUIT){
keepRendering=false; } }
//在这里进行你需要的清理工作//然后,关闭Ogre
deleteroot;
第2课Ogre应用程序基础6.主渲染循环第2课Ogre应用程序基础Root中renderOneFrame()的全部代码(在Ogre源码的root.cpp中)boolRoot::renderOneFrame(void){
if(!_fireFrameStarted())
returnfalse;
_updateAllRenderTargets();
return_fireFrameEnded();}第2课Ogre应用程序基础Root中renderOneFrame()的全部代码(在Og附:例题讲解:场景节点与实体。第2课Ogre应用程序基础附:第2课Ogre应用程序基础附:例题讲解:场景节点与实体。第2课Ogre应用程序基础附:第2课Ogre应用程序基础Root类:Ogre的程序所需要作的第一件事情就是实例化一个Root对象。Root类的构造函数:Root*root=newRoot();Root*root=newRoot(“plugins.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”,“ogre.log”);Root*root=newRoot(“”,“”);第2课Ogre应用程序基础Root类:第2课Ogre应用程序基础plugins.cfg文件在启动的Ogre时候,会载入plugins.cfg配置文件来查看有哪些插件可以被使用。#Definespluginstoload
#DefinepluginfolderPluginFolder=.//PluginFolder标签的值告诉了Ogre到哪个目录下找下面所使用得的插件。
#Defineplugins //Ogre载入的具体插件Plugin=RenderSystem_Direct3D9Plugin=RenderSystem_GLPlugin=Plugin_ParticleFXPlugin=Plugin_BSPSceneManagerPlugin=Plugin_OctreeSceneManagerPlugin=Plugin_CgProgramManager第2课Ogre应用程序基础plugins.cfg文件第2课Ogre应用程序基础渲染窗口可以调用Root对象的initialise()方法来进行系统初始化:
root->initialise(true,”MyRenderWindow”); RenderWindow*window=root->getAutoCreatedWindow();initialise方法的第一个参数告知Ogre系统是否自动建立一个渲染窗口来给用户使用。在我们这里选择了简单的方法,让Ogre给我们提供渲染窗口。第二个参数并且把“MyRenderWindow”作为程序窗口的标题。在这里如果没有提供你自己的窗口标题,那程序就会使用默认的“OGRERenderWindow”。第二行代码可以用来得到自动创建的渲染窗口实例的指针。第2课Ogre应用程序基础渲染窗口第2课Ogre应用程序基础Ogre需要摄影机(Camera)来“拍摄”场景:Camera*cam=sceneMgr->createCamera(“MainCamera”);cam->setNearClipDistance(5);cam->setFarClipDistance(1000);cam->setAspectRatio(Real(1.333333));场景管理器是一个生产在你场景中不同对象实体的“工厂”。通过简单调用SceneManager的createCamera()方法,就能得到一个新的摄像机实例。之后你就可以使用这台摄像机来拍摄渲染你的场景了。第2课Ogre应用程序基础Ogre需要摄影机(Camera)来“拍摄”场景:第2课创建一个视口“Viewport”:Viewport*vp=window->addViewport(camera);vp->setBackgroundColour(ColourValue(0,0,0));
代码创建了一个视口对象的实例,同时我们也设置了视口(viewport)的背景颜色。第2课Ogre应用程序基础创建一个视口“Viewport”:第2课Ogre应用程序基渲染循环:调用Root对象的srartRendering()方法开始渲染你的场景:root->startRendering();在调用之后,Ogre就会不断地渲染在你场景中所有能被渲染的东西。你可以通过关闭渲染窗口来结束这个过程。当你在注册了帧监听(FrameListener)对象,然后在回调结束后返回一个false值给系统,同样也能结束程序渲染。第2课Ogre应用程序基础渲染循环:第2课Ogre应用程序基础帧监听: 如果决定使用startRender()来开始你的渲染过程,你就只能通过使用帧监听对象来在渲染循环中插入你自己的代码了。
所谓帧监听对象就是一个符合FrameListener接口的类的实例。当Ogre渲染每一帧的开始和结束的时候会回调FrameListener接口的方法。 当程序执行的时候,会在每一次进入Ogre渲染管线之前调用你定义的frameStarted()方法。第2课Ogre应用程序基础帧监听:第2课Ogre应用程序基础实例代码:classMyFrameListener:publicFrameListener{public: boolframeStarted(constFrameEvent&evt); boolframeEnded(constFrameEvent&evt); }; boolMyFrameListener::frameStarted(constFrameEvent&evt){
//在每一帧画面渲染前,调用这里你写好的代码 returntrue; } boolMyFrameListener::frameEnded(constFrameEvent&evt){
//在每一帧画面渲染后,调用这里你写好的代码 returntrue; }
第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础实例代码:Root*root=newRoot();MyFrameListenermyListener;
//在这里你需要在调用startRendering()方法前,注册你的帧监听对象!!!root->addFrameListener(&myListener);root->startRendering();第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础深入理解Ogre程序:手动载入插件Root提供了两种方法来处理手动载入插件:voidloadPlugin(constString&pluginName);voidunloadPlugin(constString&pluginName);第一个方法是用来通过名称载入相应插件的。第二个方法是被用来卸载插件。#ifdefined(_DEGUG)
root->loadPlugin(“Plugin_ParticleFX_d”);#else
root->loadPlugin(“Plugin_ParticleFX”);#endif第2课Ogre应用程序基础深入理解Ogre程序:第2课Ogre应用程序基础 Ogre程序已有的插件:
·Plugin_OctreeSceneManager:以八叉树空间管理为基础的OctreeSceneManager(八叉树场景管理器——OSM)。同时包含了从其中派生出来的TerrainSceneManager(地形场景管理器),用来处理从高度图(heightMapped)派生出来的地形场景。·Plugin_BSPSceneManager:提供一个对BSP场景的管理系统,用来读取和处理来自雷神之锤III中的地图文件。不过在今天看来这已经是一个古老的地图格式,并且已经没有人再维护和支持它了(提供这个插件的唯一原因是为了某个演示程序的执行)。
·Plugin_CgProgramManager:这个插件负责载入、分析、编译并且管理Cg语言所写的GPU渲染程序。在今天看来,似乎Cg逐渐被当今技术所抛离(它只能支持3.0版本以前的profiles),因此其价值也越来越小;幸好Ogre在其内部同时支持HLSL和GLSL程序的GPU开发。第2课Ogre应用程序基础 Ogre程序已有的插件:第2课Ogre应用程序基础 Ogre程序已有的插件:·Plugin_ParticleFX:粒子系统管理插件;提供了很多粒子的效果器(Affector)和发射器(Emitter),用来实现一些基本的粒子特效。·RenderSystem_Direct3D9:Windows上面对Direct3D9的抽象层实现·RenderSystem_GL:针对所有平台上OpenGL的抽象层实现。第2课Ogre应用程序基础 Ogre程序已有的插件:第2课Ogre应用程序基础2.载入渲染系统:Root类提供了用来确认那些API可以被使用的getAvailableRenderers()方法:RenderSystemList*getAvailableRenderers();
Root同时也提供了一些用于设置和得到已经载入渲染系统的方法:
voidaddRenderSystem(RenderSystem*naeRend);RenderSystem*getRenderSystemByName(constString&name);voidsetRenderSystem(RenderSystem*system);RenderSystem*getRenderSystem(void);第2课Ogre应用程序基础2.载入渲染系统:第2课Ogre应用程序基础实例代码://RenderSystemList是std::vector类型RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();
while(it!=rList->end()){//Ogre的字符串类型String是std::string的扩展RenderSystem*rSys=*(it++);if(rSys->getName().find(“OpenGL”)){
//把OpenGL渲染系统设置为我们使用的渲染系统
root->setRenderSystem(rSys);Break; } }//注意,如果系统没有支持OpenGL的话,我们就没有设置任何渲染系统!这将会引起一个Ogre设置期间的异常产生。第2课Ogre应用程序基础实例代码:第2课Ogre应用程序基础3.渲染窗口 当使用手动方式创建渲染窗口的时候,需要通过RenderSystem类而不是Root类的方法来创建。#include“Ogre.h”Root*root=newRoot(“”,””);
//建立一个没有配置文件的Root实例root->loadPlugin(“RenderSystem_Direct3D9”);//载入渲染系统插件root->loadPlugin(“RenderSystem_GL”);
//在这里我们伪装成用户已经选择了OpenGL渲染器StringrName(“OpenGLRenderSubsystem”);RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();RenderSystem*rSys=0;第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础3.渲染窗口while(it!=rList->end()){
rSys=*(it++);
if(rSys->getName()==rName){
//设置渲染器,并结束循环
root->setRenderSystem(rSys);
break; } }
//如果没有找到一个可用的OpenGL渲染器,就在这里结束程序。if(root->getRenderSystem()==NULL){
deleteroot; return-1; }第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础3.渲染窗口
//root初始化的时候,我们可以传入一个false值来告知Root不用给我们创建渲染窗口。root->initialise(false);
//在这里我们仍然使用默认的参数来创建渲染窗口RenderWindow*window=rSys->createRenderWindow(
“ManualOgreWindow”,//窗口的名字
800,
//窗口的宽度(像素)
600,
//窗口的高度(像素)
false,
//是否全屏显示0);
//其他参数,使用默认值//在这之后你就可以向之前所说的一样创摄像机和视口了。第2课Ogre应用程序基础3.渲染窗口第2课Ogre应用程序基础NameValuePairList类:可用于设置窗口属性,如渲染窗口的名称和渲染窗口的标题是用不一样的字符串。NameValuePairListparams;params[“left”]
=“0”;params[“top”]=“0”;params[“title”]=“AlternateWindowTitle”;
RenderWindow*window=rSys->createRenderWindow(
“MainWindow”,
//渲染目标的名字
800,
//窗口的宽度(像素)
600,
//窗口的高度(像素)
false,
//是否全屏显示 ¶ms);
//其他参数,这次我们在上面已经设置了第2课Ogre应用程序基础NameValuePairList类:第2课Ogre应用程把Ogre渲染窗口插入到一个已经存在的窗口中://hWnd是一个Win32系统中存在的窗口的句柄。//渲染系统的指针所指的是一个初始化过的D3D9RenderSystem的实例。
NameValuePairListopts;opts[“parentWindowHandle”]=StringConverter::toString(hWnd);//everythingbut“opts”issomewhatirrelevantinthecontextofan//explicitlyparentedwindowRenderWindow*window=RenderSystem->createRenderWindow(
“WindowName”,
800,600,
false,&opts);第2课Ogre应用程序基础把Ogre渲染窗口插入到一个已经存在的窗口中:第2课Ogr把Ogre渲染窗口插入到一个已经存在的窗口中:
Ogre的窗口消息处理函数在这里被忽略了,因此你要手动处理Ogre相关的消息,比如当用户点击关闭按键时候,清理Ogre渲染窗口。第2课Ogre应用程序基础把Ogre渲染窗口插入到一个已经存在的窗口中:第2课Ogr4.场景管理器创建方法:SceneManager*sceneMgr=root->createSceneManager(ST_GENERIC,“MySceneManager”);·ST_GENERIC:最简单的场景管理器的构造器类型,其场景管理器没有对场景内容和结构做任何优化。在极其简单的场景中(例如菜单界面)中才有其价值。·ST_INTERIOR:这种场景管理器的构造器所产生的管理器,优化了室内近距离的渲染,比较适合高密度的场景。·ST_EXTERIOR_CLOSE:优化了室外场景里面的中近距离可视体,比较适合用一个简单模型或者高度场产生的场景地图。·ST_EXTERIOR_FAR:Ogre历史遗留的错误,已经不需要在考虑使用它。在需要的时候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR来代替这个选项。
·ST_EXTERIOR_REAL_FAR:这种类型的场景管理器特别适合那种需要动态加载的地形或者场景。动态加载的地形通常都非常巨大,甚至可能描绘了一个星球的地貌。第2课Ogre应用程序基础4.场景管理器第2课Ogre应用程序基础5.摄像机(x,y,z)代表摄像机所在点的坐标。X和Y分别代表近截面的宽度和高度Z代表从摄像机到近截面的距离。X’和Y’代表远截面的宽度和高度,其中(Z+Z’)的和代表着从摄像机到远截面的距离。摄像机的纵宽比率(X/Y)视方向和视截体下截面的夹角W第2课Ogre应用程序基础5.摄像机第2课Ogre应用程序基础实例:拥有标准3:4的纵宽比;近截面距离摄像机5单位,远截面距离1000单位;视线方向和视截体的下平面(以及上平面)拥有30度夹角(换句话说,就是上图的W等于30°)//sceneManager是一个已经存在的场景管理器实例的指针。//我们在这里构建名称为“MainCam”的摄像机。Camera*camera=sceneMgr->createCamera(“MainCam”);
//并不需要计算什么,可以直接从视口中得到这个尺寸camera->setAspectRatio(1.333333f);
//30度角可以让我们看到一个长而远的视野camera->setFOVy(30.0f);camera->setNearClipDistance(5.0f);camera->setFarClipDistance(1000.0f);第2课Ogre应用程序基础实例:拥有标准3:4的纵宽比;近截面距离摄像机5单位,远截面摄像机渲染模式:摄像机支持3种不同的渲染模式:边框,实体,“点”camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonModemode=camera->getPolygonMode();第2课Ogre应用程序基础摄像机渲染模式:第2课Ogre应用程序基础摄像机位置和变换:摄像机是一个MovableObject(活动对象)接口的实现,因此也具有这对象的所有方法和特性。设置摄像机位置的实例://确认我们已经有一个指向“Camera”类型实例的指针camera。camera->setPosition(200,10,200);
//也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些//camera->setPosition(Vector3(200,10,200));第2课Ogre应用程序基础摄像机位置和变换:第2课Ogre应用程序基础移动摄像机到当前位置的相对位置的实例://假设摄像机还在我们之前设置的200,10,200空间位置上。
camera->move(10,0,0);//摄像机移动到210,10,200camera->moveRelative(0,0,10);//摄像机移动到210,10,210第2课Ogre应用程序基础移动摄像机到当前位置的相对位置的实例:第2课Ogre应用程操纵摄像机的方法:voidsetDirection(Realx,Realy,Realz);voidsetDirection(constVector3&vec);Vector3getDirection(void)const;Vector3getUp(void)const;Vector3getRight(void)const;voidlookAt(constVector3&angle);voidlookAt(Realx,Realy,Realz);voidroll(constRadian&angle);voi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度拆除工程安全教育培训拆房协议范本4篇
- 个人家居装潢服务协议(2024版)版B版
- 二零二五年度FXBIB房地产经纪网络平台合作协议3篇
- 2025年度产业园企业入驻产业园区安全与应急管理合作协议4篇
- 2025年度高科技园区产权转让合同模板及范文3篇
- 二零二五年度南京市房产赠与合同(亲情关怀版)3篇
- 事业单位固定期限劳动协议样式版A版
- 2025年度城市轨道交通建设合同协议4篇
- 2025年度老旧厂房拆迁评估及补偿执行标准合同3篇
- 2025年度户外活动柴油补给服务协议4篇
- 手术器械与敷料的传递
- 提高护士手卫生执行率PDCA案例汇报课件(32张)
- 日本人的色彩意识与自然观
- 校园网络系统的设计规划任务书
- 部编版5年级语文下册第五单元学历案
- 建造师建设工程项目管理二局培训精简版课件
- 电工(三级)理论知识考核要素细目表
- 单位就业人员登记表
- 卫生监督协管-医疗机构监督
- 初中英语知识大汇总(374张)
- 记录片21世纪禁爱指南
评论
0/150
提交评论