9 ogre场景
2020-03-01 140浏览
- 1.第 9 课 Ogre 场景创建 光源 在 Ogre 中创建一个光源需要调用场景管理器中的 createLight 方法然后提供光源的名称,就跟我们创 建实体和摄像机一样,光源仅仅有两个方法 setPosition 和 setDirection (而且并不是像旋转, 偏移,滚动一样有全套的移动函数)。如果你需要移 动光源(例如创建一个光源跟随角色),你需要把光 源绑定到场景节点上。
- 2.第 9 课 Ogre 场景创建 点光源 首先我们要创建光源设置她的类型和她的位置 : light = mSceneMgr>createLight("Light1"); light>setType(Light::LT_POINT);light>setPosition(Vector3(0, 150, 250)); 现在 我们已经创建好了光源,我们可以设置她的漫射 色和镜 镜 面色了。让我 镜 镜镜 镜镜镜 镜镜 置镜 镜 镜 色: 镜 light->setDiffuseColour(1.0, 0.0, 0.0); light->setSpecularColour(1.0, 0.0, 0.0);
- 3.第 9 课 Ogre 场景创建 有向光 light = mSceneMgr->createLight("Light3"); light->setType(Light::LT_DIRECTIONAL);light>setDiffuseColour(ColourValue(.25, .25, 0)); light->setSpecularColour(ColourValue(.25, . 25, 0)); 因为有向光是从无穷远的距离射来的,因此我们不需 要设置她的位置,仅仅是设置她的方向。我们设置光 的方向是 z 正半轴和 y 负半轴(类似从 ninja 的 45 度角正前方射过来): light->setDirection(Vector3( 0, -1, 1 ));
- 4.第 9 课 Ogre 场景创建 聚光灯 light = mSceneMgr->createLight("Light2"); light- >setType(Light::LT_SPOTLIGHT);light>setDiffuseColour(0, 0, 1.0); light>setSpecularColour(0, 0, 1.0); 我们仍然需要设置位置 和方向来确定聚光源。我们将创建一个聚光源盘旋在 Ninja 的右侧,然后直射下来: light->setDirection(-1, -1, 0); light>setPosition(Vector3(300, 300, 0)); 聚光源还允许我们指定光束的宽度。考虑一下手电筒的光 束。中心的内光束比周围光束明亮一些。我们可以设置这 两种宽度通过调用 setSpotlightRange 方法。 light->setSpotlightRange(Degree(35), Degree(50));
- 5.第 9 课 Ogre 场景创建 地形 在场景中添加地面 现在我们已经搞清楚了根对象和场景管理器,是时间来真 正创建一个地面了(当然是在 OGRE 里)。场景管理器 的基类定义了一个叫做 setWorldGeometry 的方法,使 派生类便于创建场景。当使用地面场景管理器 (TerrainSceneManager) 时,它需要一个文件名来加载 地面属性。在 createScene 函数中添加这行代码: mSceneMgr->setWorldGeometry( “terrain.cfg” ); 编译运行你的程序,稍微移动一下镜头就可以看到 OGRE 生成的地面了
- 6.第 9 课 Ogre 场景创建 "terrain.cfg" 文件 terrain.cfg 文件包含了许多生成地面的选项。需要注 意的是,地面场景管理器设计的时候包含了分页的功 能,只不过还没有被实现。不过 OGRE 有一个插件目 前可以实现这个功能: Paging Scene Manager 。 地面场景管理器使用高度图 (Heightmap) 来生成地面 。你可以通过更改 Heightmap.image 的参数来改变 高度图。你可以通过更改 WorldTexture 来更改地面的 帖图。你还可以通过更改 DetailTexture 来使地面看 得更逼真。你可以在 /Media/materials/textures 里 找到 terrain.cfg 默认的几个图片。
- 7.第 9 课 Ogre 场景创建 天空 OGRE 提供三种天空:天空盒,天空穹和天空面。我 镜 会 逐个学 镜镜镜 他镜 镜 ,镜 镜 在你必 镜镜镜 在 chooseSceneManager 函数中添加以下代码 : ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
- 8.第 9 课 Ogre 场景创建 天空盒 天空盒实际上是一个包含了场景里所有对象的巨型立 方体。 mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox" ); 参数第一个代表是否启用天空盒。第二个参数是天空 盒使用的材质脚本。第三个参数设定了天空盒与摄像 机的距离,第四个参数决定了天空盒是在其他对象之 前渲染镜 是其他 镜镜镜镜镜 象之后。 镜镜镜
- 9.第 9 课 Ogre 场景创建 天空盒 试试将第三个参数从默认的 5000 改为一个很小的值然 后看看有什么效果: mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox", 10 ); 什么都没改变!这是因为第四个参数的默认值是 true ,也就是说天空盒会最先渲染,其它的东西会渲染到天 空盒之上,从而使天空盒看起来像是在背后。(注意你 不应该让第三个参数小于摄像机的近剪切面距离,否则 他会不可见!)其实天空盒并不应该最先渲染,因为你 会渲染他的全部。假如你最后渲染他, OGRE 只会渲 染可见的部分,从而提高一定的运行速度。
- 10.第 9 课 Ogre 场景创建 天空盒 试一下最后渲染天空盒: mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox", 5000, false ); 现在它看起来 好像一样没有任何改变,但是天空盒的不可见的部分不会被 渲染。有一点要注意,当你把天空盒设置得很近时,部分的 几何会被裁剪掉,试一下这个: mSceneMgr->setSkyBox( true, “Examples/SpaceSkyBox”, 100, false ); 看到了么?地 面看上去穿过了天空。这肯定不是你想要的结果(假如你还 正常的话)。假如你要在你的程序中使用天空盒你必须决定 如何使用它。当你最后渲染天空盒是,程序的运行速度会提 高一些,但是你必须小心它不要遮住你的几何。总的来说, 将第二个参数之后的所有东西都设为默认是最安全的。
- 11.天空穹 第 9 课 Ogre 场景创建 使用 setSkyDome 来创建天空穹。他会创建一个包含了场景 中所有对象的巨型立方体,最大的区别是贴图被用球体的方法 投影到立方体上。你看到的其实还是一个立方体,只不过它的 贴图看上去像贴到了一个球体上一样。这种天空有一个很大的 缺陷,就是立方体的下面没有任何贴图,所有你必须要有一个 类似地面的东西来遮盖下面。 天空穹的前两个参数和天空盒一样,第三个参数是天空穹的弯 度。 OGRE 的 API 建议使用 2 到 65 之间的数值,降低第三个 参数会有更好的距离感,增加第三个参数会降低扭曲度从而达 到更平滑的效果。试着将它设为 2 然后再设为 65 来观察它们 的区别。 第四个参数是贴图重复的次数,你需要根据你贴图的大小来设 置它。但是注意这个参数是 Real 类型 ( 浮点数 ) 的而不是整形。 第五第六个参数分别是距离和渲染顺序,与天空盒的相同。
- 12.第 9 课 Ogre 场景创建 第三个参数为 2 时的效果 的效果 第三个参数为 64 时
- 13.第 9 课 Ogre 场景创建 天空面 我们用一个平面来替代正方体。我们要先创建一个平 面,然后是他朝下。 Plane plane; plane.d = 1000; plane.normal =Vector3::NEGATIVE_UNIT_Y;现在我们定义了平面,接下来就可以创建天空面了。 注意第四个参数是天空面的大小(在这里是 1500x1500 个单位)第五个参数是他重复的次数: mSceneMgr->setSkyPlane( true, plane, "Examples/SpaceSkyPlane", 1500, 75 );
- 14.第 9 课 Ogre 场景创建 天空面 创建的天空面有两个缺陷。第一个是由于贴图像素低,重 复的时候不好看。你自己画一个高像素边缘处理好的贴图 就行了。最主要的缺陷是当你注视水平线的时候,你能看 到天空面的结尾。即使你有一个好的贴图,他看起来并不 会很逼真假如你能看到天空的结尾。天空面的这种用法只 能用在盆地或者四周都是墙的场景。不过他对显卡的要求 会比天空盒和天空穹要低。 幸运的是天空面的功能还不仅是这些。第六个参数跟天空 盒和天空穹的渲染顺序很相似。第七个参数允许你设置天 空面的弯曲度,这样一来平面就变成弧形的了。同时我们 还需要设置 x 和 y 的线段数量(天空面是一个巨大的正方 形,但是假如我们想让他弯曲那么它就要变成许多小正方 形)。第八个和第九个参数就是 x 和 y 的线段数量。
- 15.第 9 课 Ogre 场景创建 天空面 mSceneMgr->setSkyPlane( true, plane, "Examples/SpaceSkyPlane", 1500, 50, true, 1.5f, 150, 150 ); 编译运行你的程序。现在这个天空 面好看多了,你还可以用云彩的那个材质: mSceneMgr->setSkyPlane( true, plane, "Examples/CloudySky", 1500, 40, true, 1.5f, 150, 150 ); 编译运行你的程序。云彩的移动以及他重 复的方法比天空穹还差一点,尤其是当你接近地面的边 缘往水平线的方向看去时。 还有一点,你可以通过 mSceneMgr->setSkyPlane( false, Plane(), “” ); 来取消天空面。
- 16.第 9 课 Ogre 场景创建 用哪种天空? 究竟用哪种天空完全取决于你的程序。假如你需要看 到周围所有的东西,包括负 y 的方向,那你可能只有 天空盒这个选择了。假如你有一个地面或者类似地板 的东西可以遮住负 y 方向,那么使用天空穹会有一个 更真实的效果。假如你看不到海平线(比如一个峡谷 ,一个监狱,或者城堡中间的院子),天空面会有一 个很好的效果同时只有很低的 GPU 使用量。我们会 在下一节中来解释用天空面的最重要的一个原因,是 因为它能和云雾很好地结合在一起。
- 17.第 9 课 Ogre 场景创建 雾化 当你使用地面管理器 (TerrainSceneManager) 的时候, 一定要在镜 用 镜 setWorldGeometry 函数之前镜镜 用setFog 函数。 ( 别的场景管理器里没关系的 ) 。根据你镜 用 镜 镜 两 镜 个函数的顺序,不同的顶点程序会被调用。 在我们开始之前,清除掉 createScene 函数里除了 setWorldGeometry 之外的所有内容。 你需要知道关于设置雾化效果的很重要的一点是他并不像 你想象的那样在空的地方创建“雾”的实体。实际上雾只是 当你观看物体时的一个滤镜。当你面前没有任何物体 时, 你是看不见雾的。事实上,你只会看到视口 (viewport) 的背景色。所以想要使雾逼真,我们必须将视口的背景色 设成雾的颜色。
- 18.第 9 课 Ogre 场景创建 雾化类型 我们将看到的第一种雾的类型是线性的。首先要设置视口的背 景颜色。我们可以用 createViewport 方法一样,但是有时我 们并不需要调用视口。代码如下: ColourValue fadeColour(0.9, 0.9, 0.9); mWindow>getViewport(0)->setBackgroundColour(fadeColour); 设置完背景色以后我们就可以创建雾了。记住,这段代码必须 出现在 setWorldGeometry 被调用之前。 mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.0, 50, 500); 第一个参数设置雾的类型(这里我们设的是线性的)。 第二个参数是我们用到的雾的颜色。第三个参数在线性雾里面 是不用设置的。第四个和第五个参数是设置雾慢慢变浓的范围 。这里我们从 50 开始结束于 500 。这就意味着在摄像机的 0 到 50 个单位内是没有雾的。从 50 到 500 单位内雾慢慢线性 变浓。在 500 单位以外全是雾了。编译运行这个应用程序。
- 19.第 9 课 Ogre 场景创建 雾化类型 另一种雾的类型是指数雾。和设置雾的起点和终点不一样的 是,我们要设置雾的密度(第四个和第五个参数不需要设置 )。代码如下: mSceneMgr->setFog(FOG_EXP, fadeColour, 0.005); 编译运行这个应用程序。如果你用的是 DirectX 渲染器你会 发现完全在雾的外面,在 setWorldGeometry 之前调用 setFog 来修正它。 OpenGL 渲染器会按照文档里说的那样 做,这能产生另一种生成雾的效果。这里还有一种更厉害的 指数雾函数(与前一种比较起来,离摄像机越远它的雾更浓 )。 如果你使用 FOG_EXP2 会得到更加浓密的雾。将上面的代码 替换成下面的: mSceneMgr->setFog(FOG_EXP2, fadeColour, 0.003);
- 20.第 9 课 Ogre 场景创建 雾与天空面 将雾与天空盒 / 天空穹一起使用时,会遇到些问题。 另一种选择就是使用天空面。在 createScene 里用以下 代码替换: ColourValue fadeColour(0.9, 0.9, 0.9); mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.0, 0, 130); mWindow->getViewport(0)>setBackgroundColour(fadeColour); Plane plane; plane.d = 100; plane.normal =Vector3::NEGATIVE_UNIT_Y;mSceneMgr>setWorldGeometry("terrain.cfg"); mSceneMgr>setSkyPlane(true, plane, "Examples/CloudySky", 500, 20, true, 0.5, 150, 150);
- 21.第 9 课 Ogre 场景创建 黑暗中的雾 当你设置雾的时候,可能不想使用天空,因为雾已经浓到你无 法看见天空了。不把雾设置成明亮的颜色,而是设成非常暗。 (注意,在设置雾之前,我们把天空面设置成离摄像机只有 10 个单位距离): ColourValue fadeColour(0.1, 0.1, 0.1); mWindow>getViewport(0)->setBackgroundColour(fadeColour); mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.0, 10, 150); mSceneMgr>setWorldGeometry("terrain.cfg"); Plane plane; plane.d = 10; plane.normal =Vector3::NEGATIVE_UNIT_Y;mSceneMgr>setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 100, 45, true, 0.5, 150, 150);