2、createFrameListener - 创造信息标签
3、destroyScene - 自我销毁
下面我们继续??
frameRenderingQueued
[cpp] view plaincopy // 帧渲染队列
bool BasicTutorial4::frameRenderingQueued(const Ogre::FrameEvent& evt) {
bool ret = BaseApplication::frameRenderingQueued(evt);
if (mTerrainGroup->isDerivedDataUpdateInProgress()) {
// 如果还是在生产地形,则给予提示
mTrayMgr->moveWidgetToTray(mInfoLabel, OgreBites::TL_TOP, 0); mInfoLabel->show(); if (mTerrainsImported) {
mInfoLabel->setCaption(\ }
else {
mInfoLabel->setCaption(\ } } else {
mTrayMgr->removeWidgetFromTray(mInfoLabel); mInfoLabel->hide(); if (mTerrainsImported) {
// 如果已经全部载入,则保存所有的地形,这样下次启动就不用重复载入了
mTerrainGroup->saveAllTerrains(true); mTerrainsImported = false; } }
return ret; }
createFrameListener
之所以要重载此函数,唯一的目的就是为了加入个信息标签以显示载入进度,代码如下:
[cpp] view plaincopy // 帧监听
void BasicTutorial4::createFrameListener(void) {
BaseApplication::createFrameListener();
// 创建一条信息栏显示进度
mInfoLabel = mTrayMgr->createLabel(OgreBites::TL_TOP, \}
destroyScene
代码如下:
[cpp] view plaincopy // 析构场景
void BasicTutorial4::destroyScene(void) {
OGRE_DELETE mTerrainGroup; OGRE_DELETE mTerrainGlobals; } 编译运行
编译运行你就可以看到载入的信息栏了。当信息栏消失后,地形信息将被保存起来,去目录OGRE_HOME/media看下,是否有*.dat的文件? 天空
OGRE提供了3种天空:天空盒、天空穹和天空面,下面逐一介绍。 天空盒
天空盒是个巨大的立方体,他将场景中的所有物件全部包含在里面。直接用代码来体验下,将下列一行加入到函数createScene中:
[cpp] view plaincopy // 设置天空盒
// 第一个参数指明是否开启天空盒
// 第二个参数是一个材质脚本,此脚本描述了天空盒的信息 // 第三个参数指明天空盒离相机的距离
// 第四个参数说明天空盒绘制的顺序:是在场景其他对象绘制之后还是之前 // 你应该自行修改代码以确定这些参数多代表的意义和表现 // mSceneMgr->setSkyBox(true, \
// mSceneMgr->setSkyBox(true, \// mSceneMgr->setSkyBox(true, \
mSceneMgr->setSkyBox(true, \
编译运行,不怎么像个天空是吧?因为我们使用的天空贴图比较挫:)。当你使用如下代码时:
[cpp] view plaincopy
mSceneMgr->setSkyBox(true, \
什么都没有变,是吧?这是因为第四个参数的默认值是true,也就是说天空盒会最先渲染,其它的东西会渲染到天空盒之上,从而使天空盒看起来像是在背后。(注意你不应该让第三个参数小于摄像机的近剪切面距离,否则他会不可见!)其实天空盒并不应该最先渲染,因为你会渲染他的全部。假如你最后渲染他,OGRE只会渲染可见的部分,从而提高一定的运行速度。 天空穹
天空穹和天空盒非常像,他也是通过一个巨大的立方体围绕着场景中所有的实体,但最大的不同是:贴图被用球体的方法投影到立方体上。你看到的其实还是一个立方体,只不过它的贴图看上去像贴到了一个球体上一样。这种天空有一个很大的缺陷,就是立方体的下面没有任何贴图,所有你必须要有一个类似地面的东西来遮盖下面。
OGRE的示例贴图将让你很明显地看到这个缺陷。删掉setSkyBox然后在createScene中添加下面代码:
[cpp] view plaincopy
mSceneMgr->setSkyDome(true, \
当你运行时,将镜头移动到地面的中间,然后是镜头几乎和地面平行。按R键切换到网格状态,你会发现你看到的仍然是一个立方体(没有底的),但是那些云彩看起来却像覆盖在球体上一样。(注意云彩的变换是在\脚本里定义的,并不是所有的天空穹都有这样的效果。)