OGRE::Cameras, Lights, and Shadows
1.摄像机(Camera),是我们创建用来展示场景的对象。它是一个类似于节点的一个特殊的物体(我们不能称之为实体)。
和节点一样它可以调用setPosition, yaw, roll和pitch 等函数来调整摄像机的位置,也可以把它关联到一个节点上。摄像头的位置的改变是相对于它的父体的。
综上所述,在移动和旋转的空间变换上,我们可以把摄像看作一个节点。
2.和节点不同的是,我们同时只能使用一个摄像机的对象。
所以我们不能对应不同的位置创建多个摄像机然后在需要的时候去激活它们。
取而代之的是,我们可以对应场景中不同的位置创建多个节点。当摄像机要展示这个区域的时候,可以把自己关联到合适的节点上去。
3.创建摄像机
由于摄像机是和场景中的SceneManager的对象绑定在一起的,我们可以利用SceneManager的对象去创建它。
Camara* Ogre::SceneManager::createCamera(const String& name)
和创建实体和节点一样,创建摄像机时要指定一个唯一的名字。
如果不希望在程序中维持一个Camera的指针,可以通过这个作为标识的名字来得到指定Camera的指针
创建好摄像机,我们接下来要做的事情是设置摄像机的位置和在三维空间中它指向的方向。
void Ogre::Camera::setPosition(const Vector3& vec)
void Ogre::Camera::lookAt(const Vector3& targetPoint) l
ookAt函数可以用来代替节点中的旋转的函数,来指定摄像头的指向。
也可以用到对实体(Entity)位置的调整
最后我们要根据物体实际的效果设定最小剪辑距离和最大剪辑距离。
最小剪辑距离就是当物体移动到一定距离的时候,就只能看见它的局部了。最大剪辑距离是当物体移动到一定距离时,引擎就不会再去绘制它,因为它已经超出了人眼的可视范围。
void Ogre::Frustum:: setNearClipDistance(Real nearDist)
void Ogre::Frustum::setFarClipDistance(Real farDist)
4.当我们需要使用多个摄像机的时候(注意,不是在同一个场景中使用),视窗(Viewport)的概念就必须被提出来了。
OGRE中可以同时使用多个SceneManager,也可以把屏幕分割成几个不同的区域,然后用独立的摄像机去展示这些独立的区域。
在了解摄像机展示场景的原理的时候,我们必须要了解OGRE的Camera,SceneManager和RenderWindow三者之间的关系。
RenderWindow是所有物体展示的基本窗口;
SceneManager创建可以用来创建和管理Camera。
我们必须告知RenderWindow哪些Camera正在展示它们的场景,这些场景将要画在窗口的哪个部分。
这个我们要告诉RenderWindow的,某个Camera将要用来展示其场景的区域就是视窗(Viewport)。
一般情况下,我们只需要创建一个摄像机,并把这个唯一的摄像机注册到RenderWindow,因此,也只有一个Viewport被维持。
我们可以通过简单的函数来创建一个新的视窗,在此之前,一个RenderWindow类的对象必须被创建,因为是视窗是由它来创建的。
Viewport* Ogre::RenderTarget::addViewport(Camera * cam,int Zorder = 0,float left = 0.0f,float top = 0.0f,float width = 0.0f,float height = 1.0f )
当一个视窗被创建好后,我们需要指定它的背景色
void Ogre::Viewport::setBackgroundColour(const ColourValue& colour)
最后,最重要的事情是设置摄象机的相对比例。如果视窗不是在全屏模式下被显示的时候,如果相对比例没有被设置,显示的效果会很奇怪。
void Ogre::Frustrum::setAspectRatio(Real ratio)
其中参数可以由Ogre::Viewport::getActualWidth(void) / Ogre::Viewport::getActualWidth(void) 取得
5.阴影(Shadow)
OGRE支持三种类型的阴影:
Modulative Texture Shadows (SHADOWTYPE_TEXTURE_MODULATIVE)
——三种类型中,阴影效果相对较差的一种。 只提供黑白材质的阴影。
Modulative Stencil Shadows (SHADOWTYPE_STENCIL_MODULATIVE)
——当所有不透明的物体已经被画到场景中后,阴影作为一个整体的模块被绘制。
Additive Stencil Shadows (SHADOWTYPE_STENCIL_ADDITIVE)
——合成所有独立光线产生的阴影效果。效果好,对显卡的要求较高。因为每一个光线效果的叠加,都需要一次新的场景的绘制。
OGRE不支持软阴影。如果要实现软阴影,必须自己实现我们自己对于阴影处理的代码。
我们可以通过SceneManager来设置阴影的类型
void Ogre::SceneManager::setShadowTechnique(ShadowTechnique technique)
然后当一个实体被创建时,调用 setCastShadow 函数来确定该物体是否需要产生阴影。
如果要使用阴影效果,我们要往project name->build options->linker options 中添加 "-Wl,--enable-runtime-pseudo-reloc" 否则将产生错误 "variable 'vtable for Ogre::MeshPtr' can't be auto-imported.
Please read the documentation for ld's --enable-auto-import for details."
1.光线(Light)
OGRE支持三种类型的阴影:
——Point (LT_POINT) 点光源,光向各个方向发散。
——Spotlight (LT_SPOTLIGHT) 聚光就像手电筒一样,它有光开始发射的位置(光源的位置)和光直射的方向。我们也可以指定光发散的内径和外径的夹角,来决定光束的直径。我们知道,光束传播的中心是比外圈的光要亮一些,我们可以设置这个光束中心的宽度。
void Ogre::Light::setSpotlightRange( const Radian& innerAngle, const Radian& outerAngle, Real falloff = 1.0f)
参数falloff指定光发散的强度,1.0f表示线形的发散。
——Directional (LT_DIRECTIONAL) 这种光模拟那种在很远的地方发射过来的光线。我么无法得到光源的位置,但是得它发射的方向。
光线有很多性质来描述指定的光看起来是什么样子的。两个最重要的性质是发散色(diffuse colour)和镜像色(specular colour)每种材质都定义了这两种属性的影响效果。
void Ogre::Light:: setDiffuseColour(const ColourValue& colour)
void Ogre::Light:: setSpecularColour (const ColourValue& colour)
创建光的过程和创建实体和摄像机的过程是相当类似的. 我们可以利用SceneManager的对象去创建它
Camara* Ogre::SceneManager::createLight(const String& name)
当光创建完后,我们需要对其设置属性,包括前面讲过的发散色(diffuse colour)和镜像色(specular colour)。
我们可以通过 setPosition 和 setDirection 函数来设定它的位置和指向。
不像Camera,Light没有像translate, pitch, yaw, roll, etc那样的控制移动的函数。所以如果要创建一个可以移动的光线,需要把它关联到一个节点,然后通过控制节点来实现对光线移动的控制。
注意:
——我们只能看见光源发出来的光线,但是却看不见光源本身。如果我们要做到如此,我们需要创建一个实体去显示光是从哪里发射出来的。
对于聚光 Spotlight (LT_SPOTLIGHT) 我们要设置它的光源位置和发散方向,而对于 Directional (LT_DIRECTIONAL) 只要设置方向,因为它的光源在无限远处。
摘自:
http://trytotry.blog.sohu.com/145331865.html
平平:我认为这篇有错误。逐步查证后,逐渐改。