博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ogre: 天空
阅读量:4324 次
发布时间:2019-06-06

本文共 2796 字,大约阅读时间需要 9 分钟。

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

天空

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.cpp2  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_NAME12 );

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

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_NAME12 );

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

1 //DemoManager.cpp2  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.cpp2  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 。

转载于:https://www.cnblogs.com/fks143/p/4338051.html

你可能感兴趣的文章
阶段3 2.Spring_08.面向切面编程 AOP_10 总结和作业安排
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_6 JdbcDaoSupport的使用以及Dao的两种编写方式...
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
查看>>
阶段3 2.Spring_10.Spring中事务控制_1 基于XML的AOP实现事务控制
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_1 今日课程内容介绍
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_3 JdbcTemplate在Dao中的使用
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上...
查看>>
阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备
查看>>
阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API
查看>>
阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制
查看>>
阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤
查看>>
阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解
查看>>
阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
查看>>
阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_07.入门案例中使用的组件介绍
查看>>
阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门
查看>>
阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_2 请求参数绑定实体类型
查看>>
阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_4 请求参数绑定集合类型
查看>>