BasicTutorial4::createScene函数中:
[cpp] view plaincopy // 创建场景
void BasicTutorial4::createScene(void) {
// 设置相机的位置,因为地形一般都比较大,所以设置得远一点 mCamera->setPosition(Ogre::Vector3(1683, 50, 2116)); mCamera->lookAt(Ogre::Vector3(1963, 50, 1660)); mCamera->setNearClipDistance(0.1); mCamera->setFarClipDistance(50000);
if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE)) {
// 如果显卡系统(即渲染系统)支持无穷远的剪切,那么设置可以看到无穷远的地方
mCamera->setFarClipDistance(0); } }
至于他干了些啥,请参看注释 设置光线
地形组件使用有向光来反衬其纹理,首先往场景中放入一个有向光BasicTutorial4::createScene:
[cpp] view plaincopy // 创建一个有向光
Ogre::Vector3 lightdir(0.55, -0.3, 0.75); lightdir.normalise();
Ogre::Light* light = mSceneMgr->createLight(\light->setType(Ogre::Light::LT_DIRECTIONAL); light->setDirection(lightdir);
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));
// 设置环境光
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2)); 配置地形
首先,创建一组全局的地形配置信息:
[cpp] view plaincopy
mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();
然后,创建一个TerrainGroup对象,使用该对象我们可以管理后续创建出来的地形:
[cpp] view plaincopy
// 创建TerrainGroup对象,以管理地形
// 第一参数为场景管理器,第二个参数为地形的的排布,第三个参数为地形的大小,
第四个参数为整个地块的大小
mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
// 如果要保存改地形(序列化),那么使用BasicTutorial3Terrain文件名来保存,后缀为dat
mTerrainGroup->setFilenameConvention(Ogre::String(\Ogre::String(\
// 设置其位置
mTerrainGroup->setOrigin(Ogre::Vector3::ZERO); 到了配置地形的时候了:
[cpp] view plaincopy // 配置地形
configureTerrainDefaults(light);
此函数后续再讲解,注意下我们将有向光的对象作为其参数了。然后我们定义我们的地形并加入到TerrainGroup中去:
[cpp] view plaincopy // 定义地形
for (long x = 0; x <= 0; ++x) for (long y = 0; y <= 0; ++y) defineTerrain(x, y);
// 同步载入所有的地形,这样我们一启动就可以得到所有的一切了 mTerrainGroup->loadAllTerrains(true);
这样我们得到一个地形(因为只循环了一次),后续我们再来讲解defineTerrain函数。
使用下面的代码处理只载入已存在地形的信息:
[cpp] view plaincopy
// 如果只是单纯的载入地形,将所有已存在的地形调用initBlendMaps if (mTerrainsImported) {
Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
while(ti.hasMoreElements()) {
Ogre::Terrain* t = ti.getNext()->instance; initBlendMaps(t); } }
上面代码使用迭代器遍历了TerrainGroup的所有已存在的地形,并使用函数initBlendMaps作用之,至于本函数的用法后续说明。
最后一件事情:清除初始化地形中的临时资源:
[cpp] view plaincopy // 清理临时资源
mTerrainGroup->freeTemporaryResources();
以下列出到目前为止的代码清单,先别忙着编译执行哦:
[cpp] view plaincopy // 创建场景
void BasicTutorial4::createScene(void) {
// 设置相机的位置,因为地形一般都比较大,所以设置得远一点 mCamera->setPosition(Ogre::Vector3(1683, 50, 2116)); mCamera->lookAt(Ogre::Vector3(1963, 50, 1660)); mCamera->setNearClipDistance(0.1); mCamera->setFarClipDistance(50000);
if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE)) {
// 如果显卡系统(即渲染系统)支持无穷远的剪切,那么设置可以看到无穷远的地方
mCamera->setFarClipDistance(0); }
// 创建一个有向光
Ogre::Vector3 lightdir(0.55, -0.3, 0.75); lightdir.normalise();
Ogre::Light* light = mSceneMgr->createLight(\ light->setType(Ogre::Light::LT_DIRECTIONAL); light->setDirection(lightdir);
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));