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:
|
||||||||||
const ColourValue & | colour, //颜色ColourValue和RGB不同,RGB颜色深度255,ColourValue为1.ColourValue(1,0,0)为红色 设置雾效颜色和视口的背景色都为这个颜色 |
||||||||||||
Real | expDensity, 看上面公式 | ||||||||||||
Real | linearStart, 看上面公式 | ||||||||||||
Real | linearEnd 看上面公式 | ||||||||||||
) |
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)); // 设置背景颜色