ogre研究之第一个程序(二)

简介:

接续(一)

首先,我们要分析的就是Root类,使用Ogre的程序所需要作的第一件事情就是实例化一个Root对象。如果没有这个对象,你就无法调用(除了日志管理以外)的任何一个功能。Root类的构造函数接受一些符串对象的参数,这些字符代表着不同作用的文件名称。

 
  1. Root * root = new Root();     
  2. Root * root = new Root("plugins.cfg");      
  3. Root * root = new Root("plugins.cfg""ogre.cfg");     
  4. Root * root = new Root("plugins.cfg""ogre.cfg""ogre.log");     
  5. Root * root = new Root("""");   

上面列出了一些不同的方法来创建Root实例,这里面任何的方法都能单独的正确执行。参数也是系统所默认的值(“plugins.cfg”, “ogre.cfg”, “ogre.log”——当你没有填写参数的时候,系统就认为采用了默认的这些值)。

plugins.cfg:插件,Ogre中所谓的插件就是符合Ogre插件接口的代码模块,比如场景管理(SceneManager)插件和渲染系统(RenderSystem)插件等。在启动的Ogre时候,他会载入plugins.cfg配置文件来查看有哪些插件可以被使用。下面是一个plugins.cfg文件例子

 
  1. # Defines plugins to load     
  2.     
  3. # Define plugin folder     
  4. PluginFolder=.     
  5.     
  6. # Define plugins     
  7. Plugin=RenderSystem_Direct3D9_d     
  8. Plugin=RenderSystem_GL_d     
  9. Plugin=Plugin_ParticleFX_d     
  10. Plugin=Plugin_BSPSceneManager_d     
  11. Plugin=Plugin_CgProgramManager_d     
  12. Plugin=Plugin_PCZSceneManager_d.dll     
  13. Plugin=Plugin_OctreeZone_d.dll     
  14. Plugin=Plugin_OctreeSceneManager_d 

其中PluginFolder用于定义这些插件存在的位置(路径),  这里使用“.”,表示需要在“\”或者“/”(即根目录)。在某些平台上可以不使用“.”直接使用""(空白),ogre照样会在“\”或者“/”中去找。
而Plugin则说明了有哪些插件可以使用,但是需要注意,这些插件都没有后缀名。
这里需要注意:在“=”两边不能加入空格或者 Tab字符。
ogre.cfg则是一个属性配置文件,主要保存用户自定义的一些属性,即下图所示的界面的一些属性。

文件如下:

 
  1. Render System=Direct3D9 Rendering Subsystem     
  2.     
  3. [Direct3D9 Rendering Subsystem]     
  4. Allow NVPerfHUD=No     
  5. Anti aliasing=None     
  6. Floating-point mode=Fastest     
  7. Full Screen=No     
  8. Rendering Device=Mobile Intel(R) 945 Express Chipset Family     
  9. VSync=No     
  10. Video Mode=800 x 600 @ 32-bit colour     
  11. sRGB Gamma Conversion=No     
  12.     
  13. [OpenGL Rendering Subsystem]     
  14. Colour Depth=32    
  15. Display Frequency=N/A     
  16. FSAA=0    
  17. Full Screen=No     
  18. RTT Preferred Mode=FBO     
  19. VSync=No     
  20. Video Mode=1024 x 768    
  21. sRGB Gamma Conversion=No 

相信这里就不用多解释,大家都明白了。
Ogre.log :日志文件,用于输出一些调试信息等,比如下代码:

 
  1. LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***")   

就会在 Ogre.log文件中输出"*** Initializing OIS ***"信息。
另外需要说明得就是FrameListener接口了,当Ogre渲染每一帧的开始和结束的时候会回调FrameListener接口的方法,其中主要包括如下两个渲染方法。

 
  1. class ExampleFrameListener : public FrameListener{     
  2. public:     
  3.     bool frameStarted (const FrameEvent &evt);     
  4.     bool frameEnded (const FrameEvent &evt );     
  5. };     
  6.     
  7. bool ExampleFrameListener::frameStarted (const FrameEvent &evt){     
  8.     //在每一帧画面渲染前     
  9.     return true;     
  10.     
  11. }     
  12. bool ExampleFrameListener::frameEnded (const FrameEvent &evt ){     
  13.     //在每一帧画面渲染后     
  14.     return true;     
  15. }   

所以我们就可以根据需要来实现这两个方式,实现渲染。 
注意:在新的版本中frameRenderingQueued方法基本上取代了frameStarted,所以本例中我们就是用了frameRenderingQueued,一般在这个函数中都需要检测各种输入设备的情况,以进行相应的处理。
最后,当我们在程序中调用mRoot->startRendering();方法时,就告诉ogre,我们需要开始渲染了。ogre就会开始渲染。也正是ExampleApplication类中的go方法,所做的,初始化(setup)完成之后就开始渲染(mRoot->startRendering())。
之所以有了这两个类,上一篇中我们才可以不写任何代码就可以构建一个窗口,那么本节内容,我们要显示模型当然就很简单了。
直接在OgreDemo1类的createScene方法中来实现,
1:设置环境光,首先需要为整个场景设置环境光,这样才可以看到要显示的内容,通过调用setAmbientLight函数并指定环境光的颜色就可以做到这些。指定的颜色由红、绿、蓝三种颜色组成,且每种色数值范围在 0 到 1 之间。

 
  1. //设置环境光       
  2. mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) ) 

2:创建一个 Entity (物体),通过调用 SceneManager 的 createEntity 方法来创建

 
  1. //创建一个物体     
  2. Entity *ent1 = mSceneMgr->createEntity( "Robot""robot.mesh" );   

变量 mSceneMgr 是当前场景管理器的一个对象,createEntity 方法的第一个参数是为所创建的实体指定一个唯一的标识,第二个参数 "robot.mesh" 指明要使用的网格实体,"robot.mesh" 网格实体在 ExampleApplication 类中被装载。这样,就已经创建了一个实体。
3:还需要创建一个场景节点来与它绑定在一起。既然每个场景管理器都有一个根节点,那我们就在根节点下创建一个场景节点。

 
  1. //创建该物体对应的场景节点     
  2. SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode" );   

首先调用场景管理器的 getRootSceneNode 方法来获取根节点,再使用根节点的 createChildSceneNode 方法创建一个名为 "RobotNode" 的场景节点。与实体一样,场景节点的名字也是唯一的。 
4:最后,将实体与场景节点绑定在一起,这样机器人(Robot)就会在指定的位置被渲染:

 
  1. //将该物体和场景节点关联起来     
  2. node1->attachObject( ent1 );   

ok,现在编译运行你的程序,就可以看到我们伟大的机器人界面了。 
最后说一下,在创建Root对象时的文件一般会和程序最后的可执行文件在同一目录(因为有人说找不到这些文件)。祝你成功!

补充一下: 
需要将sdk下的media文件夹拷贝到该项目目录下,因为里面存放了一些资源文件,本文中的机器人模型也在其中。




本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/382510,如需转载请自行联系原作者

相关文章
|
15天前
|
搜索推荐 IDE 数据库连接
创建你的第一个Visual Basic程序:步步为营
【4月更文挑战第27天】探索Visual Basic编程,从安装Visual Studio开始,创建首个"HelloWorldApp"。在Form Designer中布局界面,添加Label和Button,设置属性。编写代码实现Button点击显示问候语。运行并调试程序,逐步学习更多控件和VB.NET高级概念,提升编程技能。享受编程旅程,创造无限可能!
|
15天前
|
Windows
火山中文编程 -- 第一个windows程序
火山中文编程 -- 第一个windows程序
13 0
|
11月前
|
图形学 索引
【unity每日一记】--Vector的实质
【unity每日一记】--Vector的实质
53 0
|
Python
python植物大战僵尸二十四之调整植物放置位置
python植物大战僵尸二十四之调整植物放置位置
72 0
QT QTranslator 中英文翻译linguist语言家 翻译过程
QT QTranslator 中英文翻译linguist语言家 翻译过程
QT QTranslator 中英文翻译linguist语言家 翻译过程
|
机器人 开发工具 C++
探究--gazebo里 关节是如何动起来的____撸源码探究ros gazebo里的 硬件抽象构建
探究--gazebo里 关节是如何动起来的____撸源码探究ros gazebo里的 硬件抽象构建
探究--gazebo里 关节是如何动起来的____撸源码探究ros  gazebo里的 硬件抽象构建
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | 快速找到工程中挂载某个脚本的游戏对象
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】 ☀️ | 快速找到工程中挂载某个脚本的游戏对象
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | Unity中 使用代码 激活/取消激活 某个游戏对象的方法
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、r美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
【Unity3D 灵巧小知识点】 ☀️ | Unity中 使用代码 激活/取消激活 某个游戏对象的方法
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | 使用宏定义和Application.platform判断运行平台
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!