OGRE框架杂谈(二)

来源:互联网 发布:数据分析报表 编辑:程序博客网 时间:2024/04/29 06:02
杂谈第一篇,大概介绍了一下简单的OGRE使用规则。我自己觉得已经非常清楚,昨日被某老友(资深程序员)一句话说得惭愧不已,“你都研究这么久3D知识当然觉得清楚啦!我程序功夫底子也不错,但是只钻研网络数据库方面,你这篇文章基本上对我而言什么用都没有啊!!”

    为了弥补这个天大的错误。我决定从最基础的说起。OGRE这个项目,提供了非常多的例子。为了大家能够更快的用起来,我决定介绍3大基础构架:ScenceManager(场景管理器),SceneNode(场景节点),Entity(实体)。

    是否需要用比较多的代码进行说明?我考虑还不是那么清楚。先从OGRE的工作原理说起好了:

场景管理器

    在屏幕上显示的所有对象都由场景管理器统一管理。当需要在场景中添加物体时,场景管理器会记录所有物体的位置。当添加摄像机来观看场景时,场景管理器会记录摄像机的位置。添加平面,广告牌(billboard),灯光时,场景管理器同样会管理所有这一切。OGRE中有多种场景管理器,有的渲染地面,有的渲染BSP表,另外你还可以自己编码制作出适合自己制作目标的场景管理器。  

实体

    可以把实体理解为3D模型:一个实体是可以再场景中渲染的物体之一(是之一,而不是全部)。例子中的水池可以是实体,水池中游泳的鱼也可以是实体,走动的机器人是实体,甚至一些山峰也是巨大的实体。但是,灯光,广告牌,摄像机,粒子就不是实体。

    在OGRE中不能将一个实体直接放置到场景中去,必须将其与场景节点绑定,场景节点内包含了该实体的位置和方向信息。多个实体可以绑定到一个场景节点哦!我会用这种方法给主角绑上很多装备/(^o^)/~,背部装备特别适合这种方法(因为绑定和变化的方式都一样!)

场景节点

    场景节点会持续跟踪与他绑定在一起的实体方位信息。创建一个实体后,这个实体只有在与一个场景节点绑定后才会被渲染。当然,一个场景接待点也只有与一个实体绑定后才能在屏幕上显示。

    场景节点可以绑定多个实体。我们如果要创建一个发光的南瓜,很简单,只需要创建一个场景节点,然后创建一个南瓜的实体并与场景节点绑定在一起,之后创建一个发光效果(或者说光照模型)也与这个场景节点绑定在一起,这样就产生了一个发光的南瓜。如果需要更多的效果,还可以和更多的东西绑定,当然也可以与其他场景节点绑定以表现更完整的对象。

    在场景中,场景节点的位置总是与它的父节点相关。每一个场景管理器都包含一个根节点。

OGRE基础程序

    大家都知道SDK,编写基础是依赖于无数接口的。比如设置环境光,首先需要的是调用setAmbientLight函数并指定其颜色。这个的组成是0~1的float数值组成的3元色(红、绿、蓝):

//设置环境光颜色

mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) );            

//创建南瓜,第一个参数是唯一标识(南瓜的简拼)。
Entity *ent1 = mSceneMgr->createEntity( "NG", "NG.mesh" );    

//创建一个场景子节点,为了方便,现在先在根节点下创建,注意场景节点标识也要唯一。
SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "NGNode" );  

最后,绑定实体到场景节点上
node1->attachObject( ent1 );

    接着将这段代码,放在杂谈(一)中的,CreateScene()函数中中,你就会看到一个南瓜出现在屏幕上了。什么?你没有NG.mesh这个模型?那随便放个什么东西上去吧!你会看到它出现在屏幕上的。

    另外关于设置位置,方向,OGRE和其他的现实引擎没有什么区别。如果对向量只是不熟悉,建议还是努力学好基本空间几何知识再来玩这些3D引擎,不然实在是太痛苦了!但是,我的观点在于(够用理解就好,不用解那些令人头疼而且基本用不上的题目)。

    基础概念:XZ 面作为其水平面,Y 轴作为纵轴。当你面对着屏幕时,从左至右的方向为 X 轴正方向,从下至上为 Y 轴正方向,从里至外为 Z 轴的正方向。

    通过接口来进行位置的设置是非常重要的基础观念。不过,其实这里只有一点想要进行说明,就是在OGRE中场景节点所有的移动都是相对于父节点的,我们可以很容易使两个节点一起移动哦!只要把需要一同移动的那个作为主动移动的节点的子节点就好了!另外,附加说一句,场景节点还可以控制对象的缩放比例和旋转角度。

    好想觉得忘记说了一些东西……OGRE只是一个图形渲染引擎,很多都是依赖于第三方库和帮助库,GU系统,用的就是CEGUI哦!还有鼠标键盘输入通过OIS来实现(一个输入系统),音效和物理也是不同的库。物理使用的是ODE,这些东西都是些博大精深的库,确实很强大,不过真的要用起来可不简单哦!如果某些部分部没有用到,比如:你有自己的UI系统,那么就可以对依赖的OGRE库文件进行瘦身,去掉CEGUI所需要的dll文件。当然,这些都要建立在你对于整个系统都非常熟悉了解的情况才能进行,不然你就等着整个程序的罢工吧。

   还有配置文件,OGRE的运行需要几个配置文件。它们用来控制那些插件需要加载,程序资源在哪里定位等等。

plugins.cfg 指定应用程序使用的插件。resources.cfg 含有Ogre搜索资源的目录列表。media.cfg 告诉Ogre更多关于某些资源的细节。ogre.cfg 是Ogre的配置窗口生成的,这个文件与你的个人电脑和显示配置相关。

    quake3settings.cfg 这个文件是与BSPSceneManager一起使用的。非常的特别!你是不是有点什么疑问…………呵呵,不用怀疑!这个东西确实就是根据伟大的卡马克同志开源了他的代码之后,同理编写的。不过,除非使用这个场景管理器,否则我们就不需要这个文件。

    OGRE只需要找到"plugins.cfg", "resources.cfg", 和 "media.cfg",就能正确运行。

   另外,请记住,plugins.cfg,resources.cfg文件中都是可以使用绝对或者相对路径,但是不能使用好像$(SomeVariable)这样的环境变量。
    去掉某个插件,只需要在plugins.cfg中删除某一行,或用#直接注释掉它。想要添加一个插件,就要添加像"Plugin=[PluginName]"这样的一行。注意不要在插件名后面加上.dll后缀。
    resources.cfg 这个文件含有Ogre搜索资源的目录列表。资源包括:脚本、模型、纹理等等。但是,Ogre不会搜索子目录,所以你如果有多层目录必须手工输入它们。比如,你有一个目录树,像"res/meshes" and "res/meshes/small",你就要为这些路径添加两个入口(如果需要增强,可以添加代码进行子目录搜索,不过出于效率和渲染引擎实际使用方式考虑,似乎不太必要)。

    好啦!罗嗦了这么半天,基本上把OGRE的方式初步使用方式说明了。我准备去吃午饭,过节果然是很不规律……下次不能一口气写这么多有的没的了。要尽量照提纲来编写!!

原创粉丝点击