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

2020-04-21 02:15

天空穹的前两个参数和天空盒一样,第三个参数是天空穹的弯度。OGRE的API建议使用2到65之间的数值,降低第三个参数会有更好的距离感,增加第三个参数会降低扭曲度从而达到更平滑的效果。试着将它设为2然后再设为65来观察它们的区别。

第四个参数是贴图重复的次数,你需要根据你贴图的大小来设置它。但是注意这个参数是Real类型(浮点数)的而不是整形。第五第六个参数分别是距离和渲染顺序,与天空盒的相同。 天空面

天空面与前两种天空有相当大的区别。我们用一个平面来替代正方体。(注意下面所有的天空面的属性都是尽量靠地面中间)删掉createScene里所有天空穹的代码。我们要先创建一个平面,然后是他朝下。setSkyPlane与前两个函数不同的是他没有距离参数。相应的,我们在Plane的d变量里设置它的距离。

[cpp] view plaincopy // 定义一个平面 Ogre::Plane plane; plane.d = 1000;

plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;

现在我们定义了平面,接下来就可以创建天空面了。注意第四个参数是天空面的大小(在这里是1500x1500个单位)第五个参数是他重复的次数:

[cpp] view plaincopy

// 定义天空面,大小:1500*1500,重复75次

mSceneMgr->setSkyPlane(true, plane, \

编译运行你的程序。咱们创建的天空面有两个缺陷。第一个是由于贴图像素低,重复的时候不好看。你自己画一个高像素边缘处理好的贴图就行了。最主要的缺陷是当你注视水平线的时候,你能看到天空面的结尾。即使你有一个好的贴图,他看起来并不会很逼真,好像你能看到天空的结尾。天空面的这种用法只能用在盆地或者四周都是墙的场景。不过他对显卡的要求会比天空盒和天空穹要低。

幸运的是天空面的功能还不仅是这些。第六个参数跟天空盒和天空穹的渲染顺序很相似。第七个参数允许你设置天空面的弯曲度,这样一来平面就变成弧形的了。同时我们还需要设置x和y的线段数量(天空面是一个巨大的正方形,但是假如我们想让他弯曲那么它就要变成许多小正方形)。第八个和第九个参数就是x和y的线段数量了:

[cpp] view plaincopy

mSceneMgr->setSkyPlane(true, plane, \true, 1.5f, 150, 150);

编译运行看看,效果会好多了。你还可以用云彩的那个材质:

[cpp] view plaincopy

mSceneMgr->setSkyPlane(true, plane, \1.5f, 150, 150);

编译运行你的程序。云彩的移动以及他重复的方法比天空穹还差一点,尤其是当你接近地面的边缘往水平线的方向看去时。

还有一点,你可以通过 mSceneMgr->setSkyPlane( false, Plane(), \来取消天空面。

用哪个好?

究竟用哪种天空完全取决于你的程序。假如你需要看到周围所有的东西,包括负y的方向,那你可能只有天空盒这个选择了。假如你有一个地面或者类似地板的东西可以遮住负y方向,那么使用天空穹会有一个更真实的效果。假如你看不到海平线(比如一个峡谷,一个监狱,或者城堡中间的院子),天空面会有一个很好的效果同时只有很低的GPU使用量。我们会在下一节中来解释用天空面的最重要的一个原因,是因为它能和云雾很好地结合在一起。 雾化 介绍

你需要知道关于设置雾化效果的很重要的一点是他并不像你想象的那样在空的地方创建“雾”的实体。实际上雾只是当你观看物体时的一个滤镜。当你面前没有任何物体时,你是看不见雾的。事实上,你只会看到视口(viewport)的背景色。所以想要使雾逼真,我们必须将视口的背景色设成雾的颜色。

雾分两种:线性的和指数的。线性雾“线性的”增浓,而指数雾“指数的”增浓(每个距离单位雾的浓度都会比上一个单位增加得更多)。你自己看他们效果的差距比这样讲更容易理解,所以我们来看几个例子。 雾化类型

第一种类型是线性的雾,他是最容易理解的。在调用setWorldGeometry后首先要设置视口的背景颜色。我们可以用createViewport方法(象用在上一个指南)一样,但是有时我们并不需要调用视口。在上述基础上增加代码如下:

[cpp] view plaincopy

Ogre::ColourValue fadeColour(0.9, 0.9, 0.9);

mWindow->getViewport(0)->setBackgroundColour(fadeColour);

如果视口不唯一的话,你可以用getNumViewports元函数来得到视口的数量然后不断的操作她,但是通常这种情况是很少见的(目前为止我们知道我们仅用了一个视口),我们可以直接得到视口。设置完背景色以后我们就可以创建雾了

[cpp] view plaincopy

mSceneMgr->setFog(Ogre::FOG_LINEAR, fadeColour, 0.0, 50, 500);

第一个参数设置雾的类型(这里我们设的是线性的)。第二个参数是我们用到的雾的颜色。第三个参数在线性雾里面是不用设置的。第四个和第五个参数是设置雾慢慢变浓的范围。这里我们从50开始结束于500。这就意味着在摄像机的0到50个单位内是没有雾的。从50到500单位内雾慢慢线性变浓。在500单位以外全是雾了。编译运行这个应用程序。

另一种雾的类型是指数雾。和设置雾的起点和终点不一样的是,我们要设置雾的密度(第四个和第五个参数不需要设置)。代码如下:

[cpp] view plaincopy

mSceneMgr->setFog(Ogre::FOG_EXP2, fadeColour, 0.003);

编译运行这个应用程序。这里还有一种更厉害的指数雾函数(与前一种比较起来,离摄像机越远它的雾更浓)。注意,如果你使用FOG_EXP2会得到更加浓密的雾。将上面的代码替换成下面的:

[cpp] view plaincopy

mSceneMgr->setFog(Ogre::FOG_EXP2, fadeColour, 0.003);

再一次编译和运行这个程序。基本上Ogre提供的这三种雾函数是可以互换的。你应该都实验一下这些函数,来看看哪一种在你的应用程序里效果更好。 雾与天空

当你试图将雾与天空盒/天空穹一起使用时,会遇到些有趣的问题。因为天空盒/天空穹是方形的,而雾效是以球形的方式工作的。清空createScene方法里的天空和雾的内容,如果巧妙地调整天空穹和雾的参数,我们就能明显地发现这个问题。

编译运行程序。如果你转动摄像机,你会发现天空穹的某些部分会探出来(蓝色部分从边缘探出来,而不是中央)。这显然不是我们想要的。另一种选择就是使用天空面。在createScene里用以下代码替换:

[cpp] view plaincopy

Ogre::ColourValue fadeColour(0.9, 0.9, 0.9);

mSceneMgr->setFog(Ogre::FOG_LINEAR, fadeColour, 0.0, 10, 1200); mWindow->getViewport(0)->setBackgroundColour(fadeColour);

Ogre::Plane plane; plane.d = 100;

plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;


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

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

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

马上注册会员

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