Ogre: 天空

[转载请保证内容的完整性和正确性]

天空

Ogre中天空的实现很简单,在它的SceneManager中已经实现了添加天空的方法(作者目前的功力还不足以写出效率更高的天空渲染方法),这里只是说一下具体该如何使用。

Ogre的天空有三种实现方式:

SkyBOX

天空盒,六个面把摄像机包起来(这样就永远走不出去了)。这是它的函数定义:

1 virtual void setSkyBox(
2     bool enable,//是否启用
3     const String& materialName,//材质名称
4     Real distance = 5000,//世界坐标系下每个面到摄像机的距离
5     bool drawFirst = true,//渲染队列
6     const Quaternion& orientation = Quaternion::IDENTITY,//盒子的旋转角度
7     const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME//资源组的名称
8 );

这里有些概念可能不清楚,比如资源组,这些深入的东西会在以后说明,现在我们先学会如何使用这些功能。添加skyBox到游戏中只需要一行代码:

1 //DemoManager.cpp
2  sm->setSkyBox(true, "Examples/SpaceSkyBox");

没有写的参数都存在默认值,现阶段一般不需要修改。Ogre中提供了多种天空材质,可以在 (OGRE_PATH)\media\materials\scripts\Examples.material 中找到。也可以自己定义一些材质。

贴两张效果图:

skyDome

注意,是Dome,不是Demo。(我写到这之前一直以为是Demo)

天空穹,也是一个盒子,但是图片的映射方式为球形映射,看上去和一个半球一样。它的函数定义:

 1 virtual void setSkyDome(
 2     bool enable, const String& materialName,
 3     Real curvature = 10,
 4     Real tiling = 8,
 5     Real distance = 4000,
 6     bool drawFirst = true,
 7     const Quaternion& orientation = Quaternion::IDENTITY,
 8     int xsegments = 16,
 9     int ysegments = 16,
10     int ysegments_keep = -1,
11     const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME
12 );

字略多,就不写到注释里了。

curvature:曲率。值越高,效果越平滑;值越低,距离感越好。

tiling:贴图重复次数。

xsegments,ysegments:顶点缓冲区和索引缓冲区大小(vertexBufferUsage和indexBufferUsage)。

ysegments_keep:是否保留缓冲区。

添加方式和skyBox类似。效果图:

skyPlane

天空面,摄像机之上的一个平面。它的函数定义:

 1 virtual void setSkyPlane(
 2     bool enable,
 3     const Plane& plane,//这里要先定义一个plane
 4     const String& materialName,
 5     Real scale = 1000,
 6     Real tiling = 10,
 7     bool drawFirst = true,
 8     Real bow = 0,//曲率。0的话就是一个水平面,数值越大曲率越高。
 9     int xsegments = 1,
10     int ysegments = 1,
11     const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME
12 );

它的添加方式就有区别了。

1 //DemoManager.cpp
2  Plane plane;
3  plane.d = 1000;
4  plane.normal = Vector3::NEGATIVE_UNIT_Y;
5  sm->_setSkyPlane(true, plane, "Examples/CloudySky", 500, 20, false, 0.5f, 150, 150);

如果没有后6个参数的话效果也还好,不过最大的问题就是它是一个水平面了。这些参数的选择需要根据实际情况改动,多次尝试才能得到最好的效果。

效果图:


Fog

天空经常要配合Fog来使用,使其效果更真实。

函数定义:

1 void setFog(
2     FogMode mode = FOG_NONE, const ColourValue& colour = ColourValue::White,
3     Real expDensity = 0.001, Real linearStart = 0.0, Real linearEnd = 1.0);

FogMode是雾的生成方式,有四种:FOG_NONE(无),FOG_LINEAR(线性生成),FOG_EXP(指数生成),FOG_EXP2(二次指数生成)。一般采用线性生成就够了。

添加雾:

1 //DemoManager.cpp
2  ColourValue FadeColour(0.9, 0.9, 0.9);
3  sm->setFog(FOG_LINEAR, FadeColour, 0.0f, 15000.0f, 28000.0f);

效果图:


Tips

有些材质的天空会动,我想让它静止怎么办?

在 (OGRE_PATH)\media\materials\scripts\Examples.material 中可以找到其相应的材质信息,把 scroll_anim 之类的动画去掉就行。

有些类找不到,比如Vector3?

在类前面加上 Ogre:: 或者加上 using namespace Ogre 。

自动退出且没报错?

看看 Ogre.log 。

时间: 2024-08-21 11:53:30

Ogre: 天空的相关文章

转:Ogre内部渲染流程

以下是 Ogre 的代码中的详细说明: Renderable是OGRE中所有可渲染对象的抽象接口 这个接口抽象出了在渲染管线中的被分组的离散的可渲染对象基本的方法. 此接口的实现类必须是基于单一的材质.单一的世界矩阵(或者是一组通过权重混合的世界矩阵),以及单一的渲染操作. 通过这个说明,应该能明确的是,Renderable 封装了3D世界中被渲染对象的基本属性和数据,这包括:渲染操作,材质属性,光照信息.变换矩阵(四元组).LOD信息.渲染方式等信息.这些信息在渲染循环中被取出,并应用在图形渲

转:OGRE场景管理器介绍

一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可能由山,树木,微微摇动的草地,飘着云彩的天空组成.Ogre提供了一套不同的场景管理器,每一种特别支持某种场景,本文档将列出Ogre提供的场景管理器和它们的优缺点. 1 选择一个场景管理器 2 八叉树场景管理器(Octree Scene Manager) 3 地形场景管理器(Terrain Scene

转:Ogre的SceneManager分析

SceneManager分析 场景管理主要工作包括以下几点: 1.可移动.不可移动和可渲染物体的创建删除. 2.场景查询. 3.渲染队列. 4.动态阴影. 一. 场景对象创建 场景中的所有对象,包括可移动与不可移动的:Camera.Light.SceneNode.Entity.ManualObject.BillboardChain.RibbonTrail.ParticleSystem.BillboardSet.Animation.AnimationState.StaticGeometry.Mov

OGRE初级教程总结 【转载】

一下内容是对OGRE基础教程的总结,大家可以先阅读中级教程1---9的内容,然后再回过头来浏览这片文章,否则可能会有很多看不懂的地方. OGRE基础教程1 主要讲了几个OGRE中的基本概念: 1.  SceneManager:所有屏幕上可见的东西都由SceneManager来管理:有多种类型的SceneManager,分别用来渲染Terrain.BSP等等. 2.  Entity:初步的理解一个Entity代表一个Mesh(可以含有动画),Light,Camera,Particle,Billbo

OGRE启动过程详解(OGRE HelloWorld程序原理解析)

本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行.会涉及的OGRE类包括: Root RenderSystem RenderWindow ResourceGroupManager LogManager Viewport SceneManager Camera SceneNode Entity Light 建议在阅读本文时参考OGRE API Reference,OGRE官方给的API Reference没有类的协作图,可以自己用Do

转:关于 OGRE 与 OSG 的简单比较

1   前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<OpenSceneGraph  Quick  Guide>,同时在网络上查阅了大量的 OGRE 架构源码分析的文章.简单使用过 OSG,对 OSG 的场景管理器设计和编程风格有所了解,而在近期的项目中大量使用 OGRE,相对于 OSG,对 OGRE 的认识比较深刻一些.目前 OGRE 的最新版本是 1.7,O

关于OGRE与OSG的简单比较【转】

关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<OpenSceneGraph Quick Guide>,同时在网络上查阅了大量的OGRE架构源码分析的文章.简单使用过OSG,对OSG的场景管理器设计和编程风格有所了解,而在近期的

自制的基Ogre的场景编辑器—OgreSE

http://blog.csdn.net/rainofei/article/details/5629587 OgreSE是一款基于Ogre 3D渲染引擎的场景编辑器,界面友好,所见即所得. 主要功能: l  建立地表.地表变形与着色(LOD地形,每个地形块可用5张纹理). l  地物(包括静态实体,动态实体,粒子,灯光)的添加与编辑(位置.方向.大小.灯光属性等信息). l  地表流体(水面.岩浆等)的自动创建. l  天空,雾,环境光的设置. 程序与示例场景下载: http://www.dba

建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞

作者:腾讯WeTest手游安全测试团队商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest导读 <九州天空城3D>上线至今,长期稳定在APP Store畅销排行的前五,本文将介绍腾讯WeTest手游安全团队在游戏上线前为<九州天空城3D>挖掘安全漏洞的全过程. <九州天空城3D>(下文简称<九州>)是祖龙娱乐的一款正版授权次世代3D飞行手游,在8月,正式向全平台开放.作为一个前身是端游研发工作室的研发商,祖龙娱乐在<九州>