ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光。具体内容前面说过,这里就不解释了。
继续在上一章的程序的基础上实现。
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 -- 光源程序实例的更多相关文章
- ogre3D学习基础2 -- 顶点程序与片断程序
三.顶点程序与片断程序 顶点或者片断程序定义可以被多个材质使用,唯一的前提条件是必须在引用它之前在材质的渲染通路部分中定义. 一个低级顶点程序示例如下: vertex_program myVertex ...
- ogre3D学习基础17 --- 如何手动创建ogre程序
建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础5 -- 阴影与动画
五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...
- ogre3D学习基础6---场景管理器的使用
场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...
- ogre3D学习基础7---材质详解
物体着色的基础 --- 四种不同光照作用 1.环境反射 近似的模拟了场景中的全局辐射,也就是用来近似模拟所有光在场景中不断散射的结果.材质中有相应的属性来代表这种环境反射颜色. 2.漫反射 这种颜色是 ...
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...
- ogre3D学习基础11 -- 日志文件的使用与异常处理
用文件来记录 Ogre 系统初始化.运行.结束以及调试信息.使用日志便于我们调试程序.Ogre 日志系统由两个类组成:Log 类与 LogManager. 1.Log类 Log 类的一个对象对应于一个 ...
随机推荐
- 如何在CSS中解决长英文单词的页面显示问题?CSS3
简言 在页面排版中,经常遇到长英文单词溢出段落容器的情况,如何解决该问题?现编制如下对比演示程序: 演示程序 42du.cn-在线演示程序 部分html代码 <div class="b ...
- UIButton 图片文字位置
在实际开发过程中经常在按钮上添加文字和图片,位置和图片的位置根据需求放置也是不一样的.下面实现了各种显示方式,如下图: UIButton+LSAdditions.h // // UIButton+LS ...
- WinForm form属性
一.布局 Autostroll 控件内容大于可见区域是否自动显示滚动条 Maximumsize 窗体可调到最大尺寸 minimumsize 窗体可调到最小尺寸 size 窗体看到的尺寸 Sta ...
- windows 10 无法使用内置管理员账户打开应用的解决方案
步骤 运行regedit.msc: 依次找到:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ ...
- 使用工具Source Monitor测量您Java代码的环复杂度
代码的环复杂度(Cyclomatic complexity,有时也翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 来看看计算公式. 代码环 ...
- HTML5新增的音频标签、视频标签
我们所说的H5就是我们所说的HTML5中新增的语言标准 一.音频标签 在HTML5当中有一个叫做audio的标签,可以直接引入一段音频资源放到我们的网页当中 格式: <audio autopla ...
- JavaScript onkeydown事件入门实例(键盘某个按键被按下)
JavaScript onkeydown 事件 用户按下一个键盘按键时会触发 onkeydown 事件.与 onkeypress事件不同的是,onkeydown 事件是响应任意键按下的处理(包括功能键 ...
- Java Marker Interface
先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法. 在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口. ...
- 【转】JavaScript 节点操作 以及DOMDocument属性和方法
最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: 1Attributes 存储节点的属性列表(只读) 2childNodes 存储节点的子节点列表 ...
- Bootstrap滚动监听(Scrollspy)插件
Bootstrap滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标