Ogre 1.8 terrain 和 paging 组件

Terrain是地形,就是一般你进入游戏的地图部分,是静态的那一部分(Jason Gregory说过:动态和静态没那么严格的区别)。

老规矩,从头文件

OgreTerrain.h

这个头文件定义了两个类:Terrain和TerrainGlobalOption,第一个类很明显是存放具体的地形数据的,第二个是存放地形数据的全局选项的,因为一个地形会有很多个Terrain对象组成(每个Terrain表示某种地形的一小片地域),统一的的配置对象就是TerrainGlobalOption了。

OgreTerrainGroup.h

定义了TerrainGroup这个类,按照Ogre的思路部件都是要注册到统一管理的接口的。TerrainGroup把每一片地域(Terrain)连接起来,管理各个Terrain之间的关系。你就可以直接通过配置TerrainGroup一次来配置数目可能会很多的Terrain了。(例如创建、删除、加载、卸载一个Terrain,把所有Terrain保存到硬盘上,总体配置等)


以上两个头文件就可以表示Ogre的地形了。但是LOD技术不知道听说过没有?离你(camera)远的地方细节没那么重要,你快速移动的时候,好多细节也可以忽略。按照这个思想可以对Terrain作出极大的优化。Ogre中支持这个思想的,就是实现LOD的就是Paged Component,分页的思想。这个组件是把要显示的东西分页,然后根据不同情况显示不同的页。例如远处有座山,实际上很精密的一座山,但是你离的远,本来用1w个顶点表示的,现在用100个顶点就可以满足你的视觉。这时那座山就不显示1w个顶点的page,而显示100个顶点的page。page思想还应用在texture中,mipmap应该听说过吧?不同距离选择不同大小的纹理。

Ogre中把page思想抽象成一个component,而Terrain是page思想的主要应用,在Terrain组建里有针对page接口的实例化。

首先介绍下paging component

OgrePage.h

定义了Page类,当然,这就是最基础的一个page了。整个系统都是在决定什么时候什么情况下在哪换下一个page,替上另一个细节程度不同的page.

OgrePageStrategy.h

定义了PageStrategy类。记得policy设计模式吗?一个PageStrategy对象就是一个policy,这个policy的作用是决定哪个page被换上去,什么时候。所以可以有很多policy,也就是很多PageStrategy的派生类。

OgrePagedWorldSection.h

定义了PagedWorldSection类,这个类是整个被分页的世界的一部分,具象讲,比如是Terrain(整个大地图)的东面的山区,或者西面的林区。因为不同地形应该是有不同的LOD策略,也就是可以有不同的PageStrategy。这个类就代表了地图中使用相同PageStrategy的那一部分,当然,策略有了,容器有了,这里面肯定存的就是Page类啦~~~

OgrePagedWorld.h

定义了类PagedWorld,终于到最上层了。这里面肯定就是一大堆PagedWorldSection组成的啦~~~~~所以逻辑上,整个Terrain(抽象成PagedWorld),包含好多块不同的区域,有西面的一片山地,东面的一片林地(抽象成PagedWorldSection),每一片区域根据你的距离和速度使用不同的LOD策略(抽象成PageStrategy),来选择不同细节程度的模型(抽象成Page)进行显示。


其实呢,上面只是说了个大概。还有Page的组成里,还有更细节的几个头文件在这里介绍。

OgrePageContent.h

有没有想过Page里是怎么存放东西的?你想啊,就算是一小片花丛也有各种花,各种石头,各种泥土,不同的区域块存在的。表达一个page里的最小组成但愿的就是这个头文件定义的PageContent类。

OgrePageContentCollection.h

其实啊,一个Page里有的不是一大堆乱放的PageContent,而是一些按照不同属性的PageContent分类的PageContentCollention。这个头文件定义的就是PageContentCollection。

还有两个与这个话题相关的头文件,是设计模式的abstractFactory的实现。

OgrePageContentFactory.h, OgrePageContentCollectionFactory.h

如果你知道设计模式的话,很容易就想到这个是用来创建不同PageContent和PageContentCollection的AbstractFactory接口。


以上几个类描述了分页的世界组成。接下来是管理。

OgrePageManager.h

PageManager类。这个很容易理解了,整个page世界是怎样组合的,管理不同的PageWorld(注意,可能你同时只需要显示一个PageWorld,但是整个游戏有不止一个PageWorld需要管理和注册、加载、删除),这个类就是整个PageWorld的最上层管理接口。


下面就回到Terrain啦~~最早说过,Terrain可以不同page直接实现。利用page可以增加LOD功能。以下俩头文件主要完成Terrain的page化操作

OgreTerrainPagedWorldSection.h

我们知道Page的世界要用PageManager来管理。在具化到Terrain时,也要有个PageManager来管理整个PagedWorld。而PageWorld的组成PageWorldSection则被继承特化成TerrainPagedWorldSection。这个TerrainPageWorldSection及就是在这个头文件定义的。

并且啊,这个类还给你固定选择了LOD采用的policy。现在这个PagedWorld就是由TerrainPagedWorldSection组成的,并且每个Section都采用了选定的LOD策略来挂载删除不同的Page。


OgreTerrainPaging.h

这个定义了TerrainPaging类,其实是重新实现了PageManager的创造函数。因为Terrain和TerrainGroup都没有继承PageContent或Page,所以把俩融合在一起得做好多配置,干这个活的就是TerrainPaging类。这个重新实现了createWorldSection函数,让PagedWorld里的元素都由Terrain元素填充。










你可能感兴趣的:(设计模式,游戏,优化)