您的位置:首页 > 其它

OGRE地形的创建与解释

2012-01-20 08:38 393 查看

关于ogre的地形学习笔记

OGRE地形听说是很好弄,弄好了也不是很好用,其他的我也不是很懂,冒然前行碰了一鼻子灰,碰了两天,在前辈们的基础之上明白了一点,写给初级的!

ogre地形的建设主要几步搞定就行。

当然,如果你看不见是因为摄像机忘记放置了,那么这篇不适合你。

其他不说,咱们单说地形。(唉,公司都年会去了,我还这地形呢)()))

擦干眼泪开始,谁叫咱连个实习生都不算呢。

第一步,说一个类 TerrainGlobalOptions 字面意思:地形全局属性

让我来说说我对ogre地形的组建方法:其实就是一个小方块*一个小方块,所以一个大的地形有n*n个小的地形组成。那么在建立时我们就关心小的就行了,但是,有很多属性小方块们是一样的,所以,如果还要在建立他们时加上,就有点浪费资源了,所以,用一个TerrainGlobalOptions类来管理,地形的统一属性不失为一个好方法。所以,这就是TerrainGlobalOptions 的作用。

mTerrainGlobals=OGRE_NEW TerrainGlobalOptions();


关于对象的属性设置,稍后再说。

第二步,再说一个类 TerrainGroup 地形分块属性 顾名思义,用来设置分块的属性的

mTerrainGroup=OGRE_NEW       TerrainGroup(mSceneMgr,Terrain::ALIGN_X_Z,513,12000); //第三个属性是用来设置模糊变化的最小块的

mTerrainGroup->setFilenameConvention(Ogre::String("MyTerrain"),Ogre::String("dat"));

mTerrainGroup->setOrigin(Vector3::ZERO);

//OGRE_NEW ====new


第二句:设置这块地形的名字 叫“MyTerrain.dat”他是给保存并且后面函数用的。

第三句:设置原点,以后的分组都以这个点为相对点。

第三步:配置地形块属性

configTerrainDefaults(light);


这里我们新建了一个函数 并将我们的方向光作为参数传进去。在这个函数里面完成对地形的配置,包括全局的,和分组的。

mTerrainGlobals->setMaxPixelError(8);

mTerrainGlobals->setCompositeMapDistance(3000);

mTerrainGlobals->setLightMapDirection(light->getDirection());

mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());

mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());


全局函数配置 英文解释:MaxPixelError decides how precise(精确) our terrain is going to be. A lower number will mean a more accurate(精确) terrain, at the cost of performance (because of more vertices(顶点))

指定当决定哪个细节层次被使用时的最大允许误差。设置过高会导致地形撕裂,过低则会影响性能。.

第二行 :到底多远才用composite map,不是靠LOD决定的,而是靠这个参数mTerrainGlobals->setCompositeMapDistance(3000);

三四五行:分别是指地形环境光,方向光之类的属性(用到了传进来的环境光)

Terrain::ImportData &defaultimp=mTerrainGroup->getDefaultImportSettings();

defaultimp.terrainSize=513;

defaultimp.worldSize=12000;

defaultimp.inputScale=300;

defaultimp.minBatchSize=33;

defaultimp.maxBatchSize=65;


设置属性第二条,分组属性设置 分块的属性 例如inputScale 的大小 就是设置对于灰度图的拉伸比例。(注:这里讲一下我对这的理解,因为地形的高低是由生成它的灰度图的样子决定的,但是,灰度图的是8位的,所以只能表示相对值 2^8=256 表示的高度范围太小,如果采用十六位的话那就是 2^16=64k 珠穆朗玛峰高度8848m 已经足够了,但是为啥不用一个字节的要用一个字的呢,占用内存少啊!!!所以八位居多啊,这样,就需要伸缩比例了(inputScale)!知道了吧)

defaultimp.layerList.resize(3); // //重新塑造list大小申请空间来放置要贴图

defaultimp.layerList[0].worldSize=100;

defaultimp.layerList[0].textureNames.push_back("xiaost_DIFFUSE.jpg");

defaultimp.layerList[0].textureNames.push_back("xiaost_NORMAL.jpg");

defaultimp.layerList[1].worldSize=30;

defaultimp.layerList[1].textureNames.push_back("xiaost_DIFFUSE.jpg");

defaultimp.layerList[1].textureNames.push_back("xiaost_NORMAL.jpg");

defaultimp.layerList[2].worldSize=200;

defaultimp.layerList[2].textureNames.push_back("shitou_DIFFUSE.jpg");

defaultimp.layerList[2].textureNames.push_back("shitou_NORMAL.jpg");


以上添加了三层纹理用来构建地形的地表。其中worldSize是用来表示,你想用多大的一张图来贴花!!呵呵

第四步:创建地形分块

下面就开始了defineTerrain(0,0,false);

第五步:混合纹理

实现的效果(别人做的图片):

所以,为了实现混合区域的效果,做以下几个步骤;

Ogre::TerrainLayerBlendMap * blendMap0=terrain->getLayerBlendMap(1);

//以下四个常量是用来计算出随着地形的高低混合的因子的大小的

Real minHeight0=100;

Real fadeDist0=40;

Real minHeight1=100;

Real fadeDist1=20;

float * pBlend1=blendMap0->getBlendPointer();//这个是获取纹理地图的起始位置

for (Ogre::uint16 y=0;y<terrain->getLayerBlendMapSize();++y)

{

for (Ogre::uint16 x=0;x<terrain->getLayerBlendMapSize();++x)

{

Ogre::Real tx,ty;

blendMap0->convertImageToTerrainSpace(x,y,&tx,&ty); //将纹理坐标转化为地形坐标blendMap1->convertImageToTerrainSpace(x, y, &tx, &ty)来得到混合图像空间上(x,y)的那个像素对应的地形实例空间上的坐标。

Ogre::Real height=terrain->getHeightAtTerrainPosition(tx,ty);//取得在想(x,y)坐标的地形高度

Ogre::Real val=(height-minHeight0)/fadeDist0;

val=Ogre::Math::Clamp(val,(Ogre::Real)0,(Ogre::Real)1);

*pBlend1++=val;//设置混合因/***

/************************************************************************/

/* 经常会遇到内存读取错误在这总结一下:

原因一:内存过界

原因二:对象未初始化

解决办法调试,加断点看看对象是否有值*/

/************************************************************************/

//val=(height-minHeight1)/fadeDist1;

//val=Ogre::Math::Clamp(val,(Ogre::Real)0,(Ogre::Real)1);

}

}

blendMap0->dirty();

blendMap0->update();


注释写的挺清楚了。主要就是获得图层,设置混合系数,刷新图层之类的工作。

我实现的效果如图:(自己画一个灰度图,找了两个鹅卵石,我觉得加上水更好看,下次加上水效果)

混合效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: