这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光。具体内容前面说过,这里就不解释了。

  继续在上一章的程序的基础上实现。

  1、创建摄像机(Camera)

  createCamera()函数是继承自ExampleApplication的虚函数,把它实现了。

 class Example1:public ExampleApplication
{
public:
//..........其他代码
virtual void createCamera()
{
mCamera = mSceneMgr->createCamera("PlayerCam");//创建摄像机
mCamera->setPosition(Vector3(,,));//位置
mCamera->lookAt(Vector3(,,));//方向
mCamera->setNearClipDistance();//近截面
}
//....其他代码
}

  2、创建视口(Viewport)

 virtual void createViewports()
{
Viewport* vp = mWindow->addViewport(mCamera);//将视口添加到摄像机
vp->setBackgroundColour(ColourValue(,,));
mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));//设置纵宽比
}

总结:摄像机与视口的区别与联系

  1、摄像机相当于现实世界中人的位置,视口相当于人的眼睛,就好象你要看电影一样,首先你要选好座位(摄像机),然后你才能看电影(视口)。所以必须在创建过摄像机口创建视口,并绑定到摄像机上。

  2、一个视口只能绑定到一个摄像机上,这个很好理解。一个人只有一双眼睛,也只能占一个位置。

  3、一个摄像机可以绑定多个视口。相当于一个电影可有多人观看。

  4、一个场景可以绑定那个多个摄像机。

  3、设置光源

 void createScene()
{
Entity *ent;
Light *light;
mSceneMgr->setAmbientLight( ColourValue( , , ) );//设置环境光全黑
mSceneMgr->setShadowTechnique( SHADOWTYPE_STENCIL_ADDITIVE );//阴影类型
ent = mSceneMgr->createEntity("robot", "robot.mesh");
ent->setCastShadows(true);//作为投射阴影体
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); Plane plane(Vector3::UNIT_Y, );//创建一个平面,法线为Y轴,与原点距离为0
MeshManager::getSingleton().createPlane("ground", //面板名称为“ground”
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
,,//平面尺寸
,,true,,,,Vector3::UNIT_Z);
ent = mSceneMgr->createEntity("GroundEntity", "ground");//创建实体面板
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//将面板添加到场景管理器
ent->setMaterialName("Examples/Rockwall");//给面板添加材质
ent->setCastShadows(false);//本身不作为投射阴影体
//点光源
light = mSceneMgr->createLight("Light1");
light->setType(Light::LT_POINT);
light->setPosition(Vector3(, , ));
light->setDiffuseColour(1.0, 0.0, 0.0);//漫射色
light->setSpecularColour(1.0, 0.0, 0.0);//镜面色
//有向光
light = mSceneMgr->createLight("Light3");
light->setType(Light::LT_DIRECTIONAL);
light->setDiffuseColour(ColourValue(., ., ));//漫射色
light->setSpecularColour(ColourValue(., ., ));//镜面色
light->setDirection(Vector3( , -, ));//方向,把这个理解为空间向量最好,指向为远点
//聚光源
light = mSceneMgr->createLight("Light2");
light->setType(Light::LT_SPOTLIGHT);
light->setDiffuseColour(, , 1.0);//漫射色
light->setSpecularColour(, , 1.0);//镜面色
light->setDirection(-, -, );//方向,指向为远点
light->setPosition(Vector3(, , ));//位置
light->setSpotlightRange(Degree(), Degree());//光线宽度
}

  效果如图:

 代码解释

  平面的设置,看源代码:

   Plane (const Vector3& rkNormal, Real fConstant);//构造函数如此而已,以法向量为基础创建一平面,Normal的意思是就法向量啊,你记得这个单词吗?

  看代码,关键是在UNIT_Y上,这是一个静态常成员变量,  如 static const Vector2 UNIT_Y;

  Plane plane(Vector3::UNIT_Y, );//Y轴作为平面的法线,第二个参数表示平面离原点距离

  是否接受投射的阴影

  virtual void setCastShadows(bool castShadows);//

  为true时,本身接收投射阴影,否则不接收。

  光源设置

  其中的LightTypes为light成员变量,代表三种光源类型

  enum LightTypes
{
/// Point light sources give off light equally in all directions, so require only position not direction
LT_POINT = ,//点光源
/// Directional lights simulate parallel light beams from a distant source, hence have direction but no position
LT_DIRECTIONAL = ,//有向光
/// Spotlights simulate a cone of light from a source so require position and direction, plus extra values for falloff
LT_SPOTLIGHT = //聚光源
};

   漫色光与镜面光

  void setSpecularColour(Real red, Real green, Real blue);//镜面色
void setDiffuseColour(Real red, Real green, Real blue);//漫射光

  参数的取值范围是从0到1的浮点数,全0为黑色,全1为白色。至于他们的具体定义与效果则需要3D图形学方面的知识了。

ogre3D学习基础9 -- 光源程序实例的更多相关文章

  1. ogre3D学习基础2 -- 顶点程序与片断程序

    三.顶点程序与片断程序 顶点或者片断程序定义可以被多个材质使用,唯一的前提条件是必须在引用它之前在材质的渲染通路部分中定义. 一个低级顶点程序示例如下: vertex_program myVertex ...

  2. ogre3D学习基础17 --- 如何手动创建ogre程序

    建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...

  3. ogre3D学习基础1 -- 核心对象与脚本技术

    一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...

  4. ogre3D学习基础5 -- 阴影与动画

    五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...

  5. ogre3D学习基础6---场景管理器的使用

    场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...

  6. ogre3D学习基础7---材质详解

    物体着色的基础 --- 四种不同光照作用 1.环境反射 近似的模拟了场景中的全局辐射,也就是用来近似模拟所有光在场景中不断散射的结果.材质中有相应的属性来代表这种环境反射颜色. 2.漫反射 这种颜色是 ...

  7. ogre3D学习基础18 -- 材质的使用与脚本的简单书写

    这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...

  8. ogre3D学习基础11 -- 交换两个场景管理器

    这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...

  9. ogre3D学习基础11 -- 日志文件的使用与异常处理

    用文件来记录 Ogre 系统初始化.运行.结束以及调试信息.使用日志便于我们调试程序.Ogre 日志系统由两个类组成:Log 类与 LogManager. 1.Log类 Log 类的一个对象对应于一个 ...

随机推荐

  1. 在IDEA中编辑struts国际化properties文件

    在IDEA中编辑struts国际化properties文件 如果手工创建的web工程,struts的i18n属性文件,可以使用native2ascii工具转换(记得命令行的第二个文件名是要保存的文件名 ...

  2. swift学习笔记3-4

    再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己. 三.运算符+表达式 swift允许重载运算符,比如 “+”你可以重载它 后续会详细介绍 赋值运算符 pass 算 ...

  3. AngularJS(四):控制器、事件

    本文也同步发表在我的公众号“我的天空” 控制器 控制器可以说是AngularJS中最重要的部分了!之前的一些示例,除了第一讲的示例以外,我们对于AngularJS的使用都集中在HTML部分,其实Ang ...

  4. PhpStorm 2017汉化补丁 2017.1 免费中文版

    PhpStorm 2017汉化补丁是一款可以让PhpStorm 2017.1版实现中文界面显示的汉化包工具,本站提供了PhpStorm 2017.1汉化补丁下载地址,有需要的朋友们欢迎前来下载使用. ...

  5. python之元组,列表和字典的区别

    Python语言包含6种内建的序列,其中,有两种主要的类型:列表和元组. 列表是可以修改的,而元组不可以,如果要添加或者删除某些元素,就只能用列表,为了限制某些元素,就会用到元组.一般来说,列表可以替 ...

  6. 一个.java文件内只能写一个class吗

    先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...

  7. 完整的.h宏定义

    ##封装中的要点 __declspec(dllexport) 表明函数为导出函数 * `extern "C"` 导出的函数名与声明一致,否则导出函数名无法正常使用 当然,也可以通过 ...

  8. 使用HTML5语义标签时要注意的问题

    header,nav,section,article,aside,figue,figcaption,footer以上这些标签(除figcaption标签外)都是块级标签,为了让这些标签及元素在所有的浏 ...

  9. 01_8_sql主键生成方式

    01_8_sql主键生成方式 1. 配置映射文件 <insert id="insertStudentBySequence" parameterClass="Stud ...

  10. 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree

    和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...