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

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

  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. ubuntu下irobot串口通讯

    在window下以前就`有一个现成的串口代码.想移植到ubuntu下,发现都不一样了.要重新找个. 折腾了一上午之后,发现自己写这个串口通讯还是有一点难度. 于是,用了github上 Erick Co ...

  2. HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)

    题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区 ...

  3. 人脸识别 python调用face++ 功能测试

    使用python调用face++的API,调用detect功能,识别人脸 首先进入face++官网注册,获得API Key和API Secret.使用官网提供的免费python api调用功能,提供了 ...

  4. 禁止MySQL开机自动启动的方法

    这几天发现电脑卡机变慢了,还有一些卡,发现每次开机MySQL都会自动启动(明明我安装的时候选择了不开机自启,任务管理器启动列表中也没有,但就是自启了...) 1.打开服务列表 有两种方法,一是快捷键 ...

  5. C++ Stack 与String

    // ConsoleApplication1.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h" ...

  6. Newtonsoft.Json初探

    1.序列化 VehicleModelSearchingModel model = new VehicleModelSearchingModel() { brandId = , modelIds=&qu ...

  7. 创建自定义 Estimator

    ref 本文档介绍了自定义 Estimator.具体而言,本文档介绍了如何创建自定义 Estimator 来模拟预创建的 Estimator DNNClassifier 在解决鸢尾花问题时的行为.要详 ...

  8. 一些恶搞人的c++程序

    top1: 不停打开的cmd(磁盘操作系统) 代码如下: #include<windows.h> using namespace std; int main() { system(&quo ...

  9. postman测试传入json

  10. crond定时操作 crontab

    * * * * *  分别表示 分钟  小时  日  月  星期(0-6) 30 17,28,19 * * *  或 30 17-19 * * *  在每天的17-19小时半点时刻执行 30 8-18 ...