Ogre中级教程7翻译版(7)

2020-04-21 02:15

defaultimp.worldSize = 12000.0f; defaultimp.inputScale = 600; defaultimp.minBatchSize = 33; defaultimp.maxBatchSize = 65;

// 纹理信息

defaultimp.layerList.resize(3);

defaultimp.layerList[0].worldSize = 100;

defaultimp.layerList[0].textureNames.push_back(\lar.dds\

defaultimp.layerList[0].textureNames.push_back(\.dds\

defaultimp.layerList[1].worldSize = 30;

defaultimp.layerList[1].textureNames.push_back(\01_diffusespecular.dds\

defaultimp.layerList[1].textureNames.push_back(\01_normalheight.dds\

defaultimp.layerList[2].worldSize = 200;

defaultimp.layerList[2].textureNames.push_back(\03_diffusespecular.dds\

defaultimp.layerList[2].textureNames.push_back(\03_normalheight.dds\}

defineTerrain

本函数的代码如下:

[cpp] view plaincopy // 定义一个地形

void BasicTutorial4::defineTerrain(long x, long y) {

// 说明生成地图的名字

Ogre::String filename = mTerrainGroup->generateFilename(x, y); if

(Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), filename)) {

// 本名字的地形已经存在了,直接加入 mTerrainGroup->defineTerrain(x, y); } else {

// 本地形还不存在,需要载入进来 Ogre::Image img;

getTerrainImage(x % 2 != 0, y % 2 != 0, img); mTerrainGroup->defineTerrain(x, y, &img); mTerrainsImported = true; } }

本函数的工作比较简单也比较灵巧,具体见代码注释。他使用了函数:getTerrainImage。

getTerrainImage

本函数的代码如下:

[cpp] view plaincopy // 取得地形图片

void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img) {

// 载入图片并做适当的裁切

img.load(\

Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if (flipX)

img.flipAroundY(); if (flipY)

img.flipAroundX(); }

initBlendMaps

本函数的完整代码如下至于他如何工作暂时不讨论,:

[cpp] view plaincopy // 混合地形

void BasicTutorial4::initBlendMaps(Ogre::Terrain* terrain) {

Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1); Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2); Ogre::Real minHeight0 = 70; Ogre::Real fadeDist0 = 40; Ogre::Real minHeight1 = 70; Ogre::Real fadeDist1 = 15;

float* pBlend1 = blendMap1->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);

Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty); Ogre::Real val = (height - minHeight0) / fadeDist0; val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);

val = (height - minHeight1) / fadeDist1;

val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1); *pBlend1++ = val; } }

blendMap0->dirty(); blendMap1->dirty(); blendMap0->update(); blendMap1->update(); } 编译运行

尝试编译和运行下,看到一个渲染得挺好的地面了吧?不过呢,我们可以做3个改进:

1、地形生成进度指示

2、地形保存

3、自我清除

首先,我们在BasicTutorial4类声明中,加入如下变量:

[cpp] view plaincopy

OgreBites::Label* mInfoLabel;

然后,在本类中重载3个函数:

1、frameRenderingQueued - 用于显示地形载入进度


Ogre中级教程7翻译版(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:溶剂罐区作业指导书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: