版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Root类: Ogre的程序所需要作的第一件事情就是实例化一个Root对象。 Root类的构造函数: Root * root = new Root(); Root * root = new Root(“plugins.cfg”); Root * root = new Root(“plugins.cfg”, “ogre.cfg”); Root * root = new Root(“plugins.cfg”, “ogre.cfg”, “ogre.log”); Root * root = new Root(“”, “”);,第2课 Ogre应用程序基础,plugins.cfg文件 在启动的Ogre时
2、候,会载入plugins.cfg配置文件来查看有哪些插件可以被使用。 # Defines plugins to load # Define plugin folder PluginFolder=. /PluginFolder标签的值告诉了Ogre到哪个目录下找下面所使用得的插件。 # Define plugins/Ogre载入的具体插件 Plugin=RenderSystem_Direct3D9 Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_BSPSceneManager Plugin=Plugin_OctreeSc
3、eneManager Plugin=Plugin_CgProgramManager,第2课 Ogre应用程序基础,渲染窗口 可以调用Root对象的initialise()方法来进行系统初始化: root-initialise(true, ”My Render Window”); RenderWindow * window =root-getAutoCreatedWindow (); initialise方法的第一个参数告知Ogre系统是否自动建立一个渲染窗口来给用户使用。在我们这里选择了简单的方法,让Ogre给我们提供渲染窗口。 第二个参数并且把“My Render Window”作为程序窗口
4、的标题。在这里如果没有提供你自己的窗口标题,那程序就会使用默认的“OGRE Render Window”。 第二行代码可以用来得到自动创建的渲染窗口实例的指针。,第2课 Ogre应用程序基础,Ogre需要摄影机(Camera)来“拍摄” 场景: Camera * cam = sceneMgr -createCamera(“MainCamera”); cam-setNearClipDistance(5); cam-setFarClipDistance(1000); cam-setAspectRatio(Real(1.333333); 场景管理器是一个生产在你场景中不同对象实体的“工厂”。通过简单
5、调用SceneManager的createCamera()方法,就能得到一个新的摄像机实例。之后你就可以使用这台摄像机来拍摄渲染你的场景了。,第2课 Ogre应用程序基础,创建一个视口“Viewport”: Viewport * vp = window-addViewport(camera); vp-setBackgroundColour(ColourValue(0, 0, 0); 代码创建了一个视口对象的实例,同时我们也设置了视口(viewport)的背景颜色。,第2课 Ogre应用程序基础,渲染循环: 调用Root对象的srartRendering()方法开始渲染你的场景: root-st
6、artRendering(); 在调用之后,Ogre就会不断地渲染在你场景中所有能被渲染的东西。 你可以通过关闭渲染窗口来结束这个过程。 当你在注册了帧监听(Frame Listener)对象,然后在回调结束后返回一个false值给系统,同样也能结束程序渲染。,第2课 Ogre应用程序基础,帧监听: 如果决定使用startRender()来开始你的渲染过程,你就只能通过使用帧监听对象来在渲染循环中插入你自己的代码了。 所谓帧监听对象就是一个符合FrameListener接口的类的实例。当Ogre渲染每一帧的开始和结束的时候会回调FrameListener接口的方法。 当程序执行的时候,会在每一
7、次进入Ogre渲染管线之前调用你定义的frameStarted()方法。,第2课 Ogre应用程序基础,实例代码: class MyFrameListener : public FrameListener public: bool frameStarted (const FrameEvent ,第2课 Ogre应用程序基础,实例代码: Root * root = new Root(); MyFrameListener myListener; /在这里你需要在调用startRendering()方法前,注册你的帧监听对象! root-addFrameListener(,第2课 Ogre应用程序基
8、础,深入理解Ogre程序: 手动载入插件 Root提供了两种方法来处理手动载入插件: void loadPlugin(const String #endif,第2课 Ogre应用程序基础,Ogre程序已有的插件: Plugin_OctreeSceneManager:以八叉树空间管理为基础的OctreeSceneManager(八叉树场景管理器OSM)。同时包含了从其中派生出来的TerrainSceneManager(地形场景管理器),用来处理从高度图(heightMapped)派生出来的地形场景。 Plugin_BSPSceneManager:提供一个对BSP场景的管理系统,用来读取和处理来自
9、雷神之锤III中的地图文件。不过在今天看来这已经是一个古老的地图格式,并且已经没有人再维护和支持它了(提供这个插件的唯一原因是为了某个演示程序的执行)。 Plugin_CgProgramManager:这个插件负责载入、分析、编译并且管理Cg语言所写的GPU渲染程序。在今天看来,似乎Cg逐渐被当今技术所抛离(它只能支持3.0版本以前的profiles),因此其价值也越来越小;幸好Ogre在其内部同时支持HLSL和GLSL程序的GPU开发。,第2课 Ogre应用程序基础,Ogre程序已有的插件: Plugin_ParticleFX:粒子系统管理插件;提供了很多粒子的效果器(Affector)和发
10、射器(Emitter),用来实现一些基本的粒子特效。 RenderSystem_Direct3D9:Windows上面对Direct3D 9的抽象层实现 RenderSystem_GL:针对所有平台上OpenGL的抽象层实现。,第2课 Ogre应用程序基础,2. 载入渲染系统: Root类提供了用来确认那些API可以被使用的getAvailableRenderers()方法: RenderSystemList* getAvailableRenderers(); Root同时也提供了一些用于设置和得到已经载入渲染系统的方法: void addRenderSystem(RenderSystem*
11、naeRend); RenderSystem* getRenderSystemByName(const String,第2课 Ogre应用程序基础,实例代码: /RenderSystemList是std:vector类型 RenderSystemList *rList = root-getAvailableRenderers(); RenderSystemList:iterator it = rList-begin(); while(it != rList-end() /Ogre的字符串类型String是std:string的扩展 RenderSystem *rSys = *(it+); if
12、(rSys-getName().find(“OpenGL”) /把OpenGL渲染系统设置为我们使用的渲染系统 root-setRenderSystem(rSys); Break; /注意,如果系统没有支持OpenGL的话,我们就没有设置任何渲染系统!这将会引起一个Ogre设置期间的异常产生。,第2课 Ogre应用程序基础,3. 渲染窗口 当使用手动方式创建渲染窗口的时候,需要通过RenderSystem类而不是Root类的方法来创建。 #include “Ogre.h” Root *root = new Root(“”, ”); /建立一个没有配置文件的Root实例 root-loadPlu
13、gin(“RenderSystem_Direct3D9”); /载入渲染系统插件 root-loadPlugin(“RenderSystem_GL”); /在这里我们伪装成用户已经选择了OpenGL渲染器 String rName(“OpenGL Render Subsystem”); RenderSystemList * rList = root-getAvailableRenderers(); RenderSystemList:iterator it = rList-begin(); RenderSystem *rSys = 0;,第2课 Ogre应用程序基础,3. 渲染窗口 while(
14、it != rList-end() rSys = * (it+); if(rSys-getName() = rName) /设置渲染器,并结束循环 root-setRenderSystem(rSys); break; /如果没有找到一个可用的OpenGL渲染器,就在这里结束程序。 if(root-getRenderSystem() = NULL) delete root;return -1;,第2课 Ogre应用程序基础,3. 渲染窗口 /root初始化的时候,我们可以传入一个false值来告知Root不用给我们创建渲染窗口。 root-initialise(false); /在这里我们仍然使
15、用默认的参数来创建渲染窗口 RenderWindow *window = rSys-createRenderWindow( “Manual Ogre Window”, /窗口的名字 800, /窗口的宽度(像素) 600, /窗口的高度(像素) false, /是否全屏显示 0); /其他参数,使用默认值 /在这之后你就可以向之前所说的一样创摄像机和视口了。,第2课 Ogre应用程序基础,NameValuePairList类: 可用于设置窗口属性,如渲染窗口的名称和渲染窗口的标题是用不一样的字符串。 NameValuePairList params; params“left” = “0”; p
16、arams“top” = “0”; params“title” = “Alternate Window Title”; RenderWindow *window = rSys-createRenderWindow( “MainWindow”, /渲染目标的名字 800, /窗口的宽度(像素) 600, /窗口的高度(像素) false, /是否全屏显示 /其他参数,这次我们在上面已经设置了,第2课 Ogre应用程序基础,把Ogre渲染窗口插入到一个已经存在的窗口中: /hWnd是一个Win32系统中存在的窗口的句柄。 /渲染系统的指针所指的是一个初始化过的D3D9RenderSystem的实例
17、。 NameValuePairList opts; opts“parentWindowHandle” = StringConverter:toString(hWnd); /everything but “opts” is somewhat irrelevant in the context of an /explicitly parented window RenderWindow *window = RenderSystem-createRenderWindow( “WindowName”, 800, 600, false, ,第2课 Ogre应用程序基础,把Ogre渲染窗口插入到一个已经存
18、在的窗口中: Ogre的窗口消息处理函数在这里被忽略了,因此你要手动处理Ogre相关的消息,比如当用户点击关闭按键时候,清理Ogre渲染窗口。,第2课 Ogre应用程序基础,4. 场景管理器 创建方法: SceneManager* sceneMgr = root-createSceneManager(ST_GENERIC, “MySceneManager”); ST_GENERIC:最简单的场景管理器的构造器类型,其场景管理器没有对场景内容和结构做任何优化。在极其简单的场景中(例如菜单界面)中才有其价值。 ST_INTERIOR:这种场景管理器的构造器所产生的管理器,优化了室内近距离的渲染,比
19、较适合高密度的场景。 ST_EXTERIOR_CLOSE:优化了室外场景里面的中近距离可视体,比较适合用一个简单模型或者高度场产生的场景地图。 ST_EXTERIOR_FAR:Ogre历史遗留的错误,已经不需要在考虑使用它。在需要的时候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR来代替这个选项。 ST_EXTERIOR_REAL_FAR:这种类型的场景管理器特别适合那种需要动态加载的地形或者场景。动态加载的地形通常都非常巨大,甚至可能描绘了一个星球的地貌。,第2课 Ogre应用程序基础,5. 摄像机 (x, y, z)代表摄像机所在点的坐标。 X和Y分别代表近
20、截面的宽度和高度 Z代表从摄像机到近截面的距离。 X和Y代表远截面的宽度和高度,其中(Z+Z)的和代表着从摄像机到远截面的距离。 摄像机的纵宽比率(X/Y) 视方向和视截体下截面 的夹角W,第2课 Ogre应用程序基础,实例:拥有标准3:4的纵宽比;近截面距离摄像机5单位,远截面距离1000单位;视线方向和视截体的下平面(以及上平面)拥有30度夹角(换句话说,就是上图的W等于30) /sceneManager是一个已经存在的场景管理器实例的指针。 /我们在这里构建名称为“MainCam”的摄像机。 Camera *camera = sceneMgr-createCamera(“MainCam”
21、); /并不需要计算什么,可以直接从视口中得到这个尺寸 camera-setAspectRatio(1.333333f); /30度角可以让我们看到一个长而远的视野 camera-setFOVy(30.0f); camera-setNearClipDistance(5.0f); camera-setFarClipDistance(1000.0f);,第2课 Ogre应用程序基础,摄像机渲染模式: 摄像机支持3种不同的渲染模式:边框,实体,“点” camera-setPolygonMode(PM_WIREFRAME); camera-setPolygonMode(PM_POINTS); came
22、ra-setPolygonMode(PM_SOLOD); PolygonMode mode = camera-getPolygonMode();,第2课 Ogre应用程序基础,摄像机位置和变换: 摄像机是一个MovableObject(活动对象)接口的实现,因此也具有这对象的所有方法和特性。 设置摄像机位置的实例: /确认我们已经有一个指向“Camera”类型实例的指针camera。 camera-setPosition(200, 10, 200); /也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些 /camera-setPosition(Vector3(200,
23、 10, 200);,第2课 Ogre应用程序基础,移动摄像机到当前位置的相对位置的实例: /假设摄像机还在我们之前设置的200, 10, 200空间位置上。camera-move(10, 0, 0); /摄像机移动到210, 10, 200 camera-moveRelative(0, 0, 10); /摄像机移动到210, 10, 210,第2课 Ogre应用程序基础,操纵摄像机的方法: void setDirection(Real x, Real y, Real z); void setDirection(const Vector3,第2课 Ogre应用程序基础,操纵摄像机的方法: void rotate(const Vector3,第2课 Ogre应用程序基础,获得摄像机属性的方法: const Quaternion 有“Real”关键字的方法返回的是世界空间的坐标,而拥有“Derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。,第2课 Ogre应用程序基础,6.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年成都市青羊区中小学教师招聘笔试参考试题及答案详解
- 初升高完美衔接教材 英语教学 名词和代词
- 2026年阜新市新邱区中小学教师招聘笔试备考题库及答案详解
- 2026年河北省沧州市中小学教师招聘考试备考题库及答案详解
- 2026年北京市门头沟区街道办人员招聘笔试备考题库及答案详解
- 2026年杭州市余杭区街道办人员招聘笔试参考题库及答案详解
- 2026年本溪市溪湖区中小学教师招聘笔试备考试题及答案详解
- 2026年徐州市鼓楼区街道办人员招聘考试备考题库及答案详解
- 2026年枣庄市台儿庄区街道办人员招聘笔试模拟试题及答案详解
- 浙江省杭州市临安区2027届数学六上期末监测试题含解析
- 婚前教育手册
- 高效能人士的七个习惯(课件)
- DL∕T 397-2010 电力地理信息系统图形符号分类与代码
- 全国疾病预防控制机构工作规范
- 2024年高考语文全国甲卷文言文阅读挖空
- 2024年四川省农作物植保员技能竞赛参考试题库(含答案)
- 分层审核检查表(一)
- 建筑材料与检测说课
- 病理科建设与管理指南
- 七年级数学 去括号
- GB/T 9780-2013建筑涂料涂层耐沾污性试验方法
评论
0/150
提交评论