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 类的一个对象对应于一个 ...
随机推荐
- Kendo MVVM 数据绑定(四) Disabled/Enabled
Kendo MVVM 数据绑定(四) Disabled/Enabled Disabled 和 Enabled 绑定可以根据 ViewModel 的某个属性值的 true,false 来设置 DOM 元 ...
- [20190618]日常学习记录(二)-flex属性及vue实战
早上在看flex属性,总结一下它的优缺点 为什么使用flex, 她和浮动相比,代码更少.浮动要考虑左浮动右浮动,有时还要去清除浮动.flex一行代码就搞定了. 她更灵活,实现平均分配,根据内容大小分配 ...
- UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)
大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层.跑完一层就会得到这层 ...
- [uva]AncientMessages象形文字识别 (dfs求连通块)
非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来 代码实现上参考了//http://blog.csdn.net/u012139398/article/details/3 ...
- MyBatis归纳
SqlSessionTemplate详解 SqlSessionTemplate类是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL ...
- groff - groff 文档排版系统前端
总览 (SYNOPSIS) groff [ -abehilpstvzCENRSUVXZ ] [ -wname ] [ -Wname ] [ -mname ] [ -Fdir ] [ -Idir ] [ ...
- Harvest of Apples
问题 B: Harvest of Apples 时间限制: 1 Sec 内存限制: 128 MB提交: 18 解决: 11[提交] [状态] [讨论版] [命题人:admin] 题目描述 Ther ...
- 2018.2.09 php学习(二)
1.用索引提高效率: 索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Upda ...
- 在axios中使用async await
最近在做树鱼的项目, 联想到 如果用 async await 怎么处理, export async function Test1() { return new Promise((resolve) =& ...
- Win10激活方法(企业版)
Win10激活 注意:以管理员身份运行,需要电脑有网(亲测激活企业版没问题) 然后一条一条复制执行 slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /sk ...