让子弹再飞一会
好的 ogre的page 本身比较复杂 层次比较多 OgreTerrain简化了其实现
如下图:
->pagedWord
->pagedWorldSection(TerrainGroup)->Terrains
pageManager->pagedWord->pagedWorldSection(TerrainGroup)->Terrains
->pagedWorldSection(TerrainGroup)->Terrains
.....
当然 pagedWorldSection含有page 其本身内部采用TerrainGroup的实现
好 继续
看看ogre自带的terrain例子是个好的开始
我开始摇滚了
我们要paging 于是在terrain.h中打开#define paging(去掉注释就可以了)
编译 运行 我假设你的ogre是启用了boost thread的
好 出错了吗 没有? 靠 反正我是出错了 FileNotFound 仔细看 是没找到类似terrain0000000.dat的文件 靠靠靠
在其media下看看 是没有这个文件嘛
好的 先关掉paging 注释#define paging 编译 运行 一切OK 地形能出来 如果你保存了该地形 那么在media在会有一个类似terrain0000000000.dat的文件
好 让我们来分析下
通过查看TerrainPagedWorldSection.cpp的代码
找到函数loadPage()
我们可以看到defineTerrain(x,y)的代码 好 这个函数会默认根据x,y产生一个文件名 然后 该terrain将会从该文件中载入地形高度等信息 如果没有这个文件 当然就报错了
解决思想是先看看有没有该文件 如果没有 就使用defineTerrain(x,y,0) 即默认高度为0的一个地形
1 void TerrainPagedWorldSection::loadPage(PageID pageID, bool forceSynchronous)
2 {
3 if (!mParent->getManager()->getPagingOperationsEnabled())
4 return;
5
6 PageMap::iterator i = mPages.find(pageID);
7 if (i == mPages.end())
8 {
9 // trigger terrain load
10 long x, y;
11 // pageID is the same as a packed index
12 mTerrainGroup->unpackIndex(pageID, &x, &y);
13
14 Ogre::String geneFileName = mTerrainGroup->generateFilename(x,y);
15 if(Ogre::ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(geneFileName))
16 {
17 mTerrainGroup->defineTerrain(x, y);
18 }
19 else
20 {
21 mTerrainGroup->defineTerrain(x,y,0.0f);
22 }
23 mTerrainGroup->loadTerrain(x, y, forceSynchronous);
24 }
25
26 PagedWorldSection::loadPage(pageID, forceSynchronous);
27 }
28 再次打开#define paging
OK OVER
posted on 2012-11-19 16:52
野猪红 阅读(433)
评论(0) 编辑 收藏 引用 所属分类:
Ogre