• ogre3D学习基础9 -- 光源程序实例


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

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

      1、创建摄像机(Camera)

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

     1 class Example1:public ExampleApplication
     2 {
     3 public:
     4         //..........其他代码
     5 virtual void createCamera()
     6     {
     7         mCamera = mSceneMgr->createCamera("PlayerCam");//创建摄像机
     8         mCamera->setPosition(Vector3(0,10,500));//位置
     9         mCamera->lookAt(Vector3(0,0,0));//方向
    10         mCamera->setNearClipDistance(5);//近截面
    11     }
    12       //....其他代码                     
    13 }

      2、创建视口(Viewport)

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

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

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

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

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

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

      3、设置光源

     1 void createScene()
     2     {
     3         Entity *ent;
     4         Light *light;
     5         mSceneMgr->setAmbientLight( ColourValue( 0, 0, 0 ) );//设置环境光全黑
     6         mSceneMgr->setShadowTechnique( SHADOWTYPE_STENCIL_ADDITIVE );//阴影类型
     7         ent = mSceneMgr->createEntity("robot", "robot.mesh");
     8         ent->setCastShadows(true);//作为投射阴影体
     9         mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
    10 
    11         Plane plane(Vector3::UNIT_Y, 0);//创建一个平面,法线为Y轴,与原点距离为0
    12         MeshManager::getSingleton().createPlane("ground",    //面板名称为“ground”
    13             ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
    14             1500,1500,//平面尺寸
    15             20,20,true,1,5,5,Vector3::UNIT_Z);
    16         ent = mSceneMgr->createEntity("GroundEntity", "ground");//创建实体面板
    17         mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//将面板添加到场景管理器
    18         ent->setMaterialName("Examples/Rockwall");//给面板添加材质
    19         ent->setCastShadows(false);//本身不作为投射阴影体
    20         //点光源
    21         light = mSceneMgr->createLight("Light1");
    22         light->setType(Light::LT_POINT);
    23         light->setPosition(Vector3(0, 150, 250));
    24         light->setDiffuseColour(1.0, 0.0, 0.0);//漫射色
    25         light->setSpecularColour(1.0, 0.0, 0.0);//镜面色
    26         //有向光
    27         light = mSceneMgr->createLight("Light3");
    28         light->setType(Light::LT_DIRECTIONAL);
    29         light->setDiffuseColour(ColourValue(.25, .25, 0));//漫射色
    30         light->setSpecularColour(ColourValue(.25, .25, 0));//镜面色
    31         light->setDirection(Vector3( 0, -1, 1 ));//方向,把这个理解为空间向量最好,指向为远点
    32         //聚光源
    33         light = mSceneMgr->createLight("Light2");
    34         light->setType(Light::LT_SPOTLIGHT);
    35         light->setDiffuseColour(0, 0, 1.0);//漫射色
    36         light->setSpecularColour(0, 0, 1.0);//镜面色
    37         light->setDirection(-1, -1, 0);//方向,指向为远点
    38         light->setPosition(Vector3(300, 300, 0));//位置
    39         light->setSpotlightRange(Degree(35), Degree(50));//光线宽度
    40     }

      效果如图:

     代码解释

      平面的设置,看源代码:

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

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

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

      是否接受投射的阴影

    1  virtual void setCastShadows(bool castShadows);//

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

      光源设置

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

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

       漫色光与镜面光

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

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

  • 相关阅读:
    Maven学习笔记:Maven简介
    Maven学习笔记:POM标签大全详解
    Java中引用类型、对象的创建与销毁
    【网络与系统安全】WANNACRY病毒中的加解密技术的应用 20199321
    vim编辑器学习 20199321
    Docker 导出和导入容器
    快速排序
    [3]遍历进程链表找到游戏进程
    AutoCompleteTextView使用demo
    validating & update ctabfolder css
  • 原文地址:https://www.cnblogs.com/songliquan/p/3299238.html
Copyright © 2020-2023  润新知