ogre 开发范例大全(1)

1.加载一个mesh进场景中

  工程为ogre自带的skybox工程。在createScene函数中加入下面的代码:

  //房子
  Entity *house=mSceneMgr->createEntity("tudorhouse","tudorhouse.mesh");
  mSceneMgr->getRootSceneNode()->attachObject(house);

   Entity * Ogre::SceneManager::createEntity (const String &  entityName,      // 实体名称(同一场景中不能有相同的实体名称) 

                                                                       PrefabType  ptype                     // 预制类型(不需要读取模型,直接在程序中创建简单几何体,                                 

                                                                                                                         // 目前只有平面 PT_PLANE 一种预制类型))  [virtual]

  Entity * Ogre::SceneManager::createEntity (const String &  entityName,  // 实体名称(同一场景中不能有相同的实体名称) 

                                                                          const String &  meshName         // 模型名称(需要从硬盘上读取的模型的文件名))

 

2.加载自己的天空盒,也就是把ogre自带的天空换掉。在createScene函数中加入下面的代码:

   mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 50);//Examples/SpaceSkyBox在Example.material中定义了,标明了渲染天空盒的方式

   对于天空盒的其他认识

   http://blog.sina.com.cn/s/blog_45209f340100f5aa.html

  第一个代表是否启用天空盒。假如你什么时候想要取消天空盒你只须调用 mSceneMgr->setSkyBox( false, "" );

  第二个参数是天空盒使用的材质脚本。

  第三个和第四个参数并不是十分重要。

  第三个参数设定了天空盒与摄像机的距离。

  第四个参数决定了天空盒是在其他对象之前渲染还是其他对象之后。

 

  我们来试试将第三个参数从默认的5000改为一个很小的值然后看看有什么效果:

 mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox", 10 );

  什么都没改变!

  这是因为第四个参数的默认值是true,也就是说天空盒会最先渲染,其它的东西会渲染到天空盒之上,从而使天空盒看起来像是在背后。(注意你不应该让第三个参数小于摄像机的近剪切面距离,否则他会不可见!)

  其实天空盒并不应该最先渲染,因为你会渲染他的全部。假如你最后渲染他,OGRE只会渲染可见的部分,从而提高一定的运行速度。

  我们来试一下最后渲染天空盒:

 mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox", 5000, false );

  现在它看起来好像一样没有任何改变,但是天空盒的不可见的部分不会被渲染。有一点要注意,当你把天空盒设置得很近时,部分的几何会被裁剪掉

 mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox", 100, false );

  地面看上去穿过了天空。这肯定不是你想要的结果

   总的来说,将第二个参数之后的所有东西都设为默认是最安全的。

 

   天空面:

        Plane plane;
        plane.d = 5000;
        plane.normal = -Vector3::UNIT_Y;
        mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3)

  天空穹:

       mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);

 

3.开启雾效

        ColourValue fadeColour(1, 0, 0);
        mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.001, 500, 1000);

  

       void Ogre::SceneManager::setFog ( FogMode mode,                 //雾模式,Fog modes:
FOG_NONE  
FOG_EXP 雾效根据距离摄像机的距离根据公式 (fog = 1/e^(distance * density)). 增加
FOG_EXP2 雾效根据距离摄像机的距离根据公式 (fog = 1/e^(distance * density)^2)减少
FOG_LINEAR 线性,随着linearStartlinearEnd距离大小线性变换

 

    const ColourValue &

colour,     //颜色ColourValue和RGB不同,RGB颜色深度255,ColourValue为1.ColourValue(1,0,0)为红色

设置雾效颜色和视口的背景色都为这个颜色

    Real expDensity,  看上面公式
    Real linearStart,  看上面公式
    Real linearEnd   看上面公式  
  )

ogre 开发范例大全(1)_第1张图片

 

 

 4.加载地形

     在createScene函数中

     std::string terrain_cfg("terrain.cfg");
     mSceneMgr->setWorldGeometry(terrain_cfg);

    ChooseSceneManager()中重新创建一个场景管理

    m_pSceneMgr = m_pRoot->createSceneManager("TerrainSceneManager");

 

5.加载广告牌

     BillboardSet* bbs = mSceneMgr->createBillboardSet("lightbbs", 1);
     bbs->setMaterialName("Examples/Flare");
    Billboard* bb = bbs->createBillboard(0,0,0,mMinLightColour);
    mLightNode->attachObject(bbs);

   

Billboard* Ogre::BillboardSet::createBillboard ( Real x,
    Real y,
    Real z,                                                    //广告牌中心位置
    const ColourValue & colour = ColourValue::White //广告牌底色  
  )

 Example.material中 材质脚本

material Examples/Flare
{
 technique
 {
  pass
  {
   lighting off                    //关闭灯光
   scene_blend add         //渲染输出的颜色被叠加到场景中
   depth_write off            //关闭深度缓冲

   texture_unit                 //纹理单元
   {
    texture flare.png
   }
  }
 }
}

 

6.摄像机

    改变摄像机的移动速度,在构造函数中:

    mMoveSpeed = 1000;//1000摄像机的移动速度

    mRotateSpeed = 36;  // 镜头旋转速度

 

7.光源

   // 创建光源  

  Light* pLight = mSceneMgr->createLight( "MainLight" );

 // 设置光源的类型:  

    pLight->setType( Light::LightTypes::LT_DIRECTIONAL );  

    // 设置光源的位置:  

    pLight->setPosition( 60, 80, 100 ); 

 // 设置光源的方向: 

 pLight->setDirection( -60, -80, -100 );  

   // 设置散射光颜色:  

   pLight->setDiffuseColour( 1.0, 1.0, 0.0 );  

   // 设置反射光颜色: 

 pLight->setSpecularColour( 0.0, 0.0, 1.0 );

   

OGRE 具有三种基本光源类型:

  enum LightTypes
  {
  LT_POINT, // 点光源
  LT_DIRECTIONAL, // 方向光
  LT_SPOTLIGHT // 锥形光
  };

 

 8.修改窗口的背景颜色

    Viewport* vp = mWindow->addViewport(mCamera);        

    vp->setBackgroundColour(ColourValue(0.3f,0.4f,0.5f));    // 设置背景颜色

你可能感兴趣的:(ogre 开发范例大全(1))