初学Ogre:通过sample实现自己的作品

tip:(如果最高版本只支持到vs2010的ogre安装包,最好安装在32位系统上,个人觉得32 位win 7为宜。64位可能出现很多问题 ,也可以去官网下载64位版本)

Ogre功能很强大,然而初学者往往只用得着其中的一小部分来学习。我这里假设各位已经对最基本的知识有所了解了。比如创建场景的代码应该写在哪里,材质有什么作用等。这里为大家提供一个手册下载: ogre手册(Windows直接双击打开)

具备了这些基本,我们直入正题,比如要实现环境纹理映射效果,通过运行示例程序得到如下图界面:



,可以看出与之对应的文件在sample中的

里面,打开它,即可查看到里面的代码。其中创建场景的代码写在函数void setupContent()里面。第一句

mSceneMgr->setSkyDome(true, "Examples/CloudySky");是我们需要的场景,材质可以在 \OgreSDK_vc10_v1-8-1\media\materials\scripts 目录下查看已有材质文件(后缀名为 .material)。用记事本打开即可,一般材质会被系统自动加载,如果不能载入材质,最简单的方法是把项目建立在\OgreSDK_vc10_v1-8-1\media\materials\scripts 里面。当然可以跟踪代码找到加载资源的位置,如图:



可以修改加载资源的代码来加载自带的材质代码,找到resources_d.cfg,打开如下:


可以编辑里面的代码来修改很多资源,系统自动加载,继续跟踪代码可以看到加载资源的地方在 setupResource 函数中:


但是为了简单,我就不讲这一部分了,初学者可以把工程建立在script目录下同样可以使用自带的材质等资源。



首先分析sample。它是通过setSkyDome 来设置天空场景,然后通过createEntity创建了一个实体,再为它添加材质属性,最后附加到场景结点中,思路就是这样了。要如何实现呢?

我们可以模仿示例代码来写,

首先我们创建自己的项目:



点Finish即可


此时编译器自动为我们把框架建立好了,如图:



Ogre创建场景的函数都写在 createScene(void) 函数里面,至于为什么要写在这里面,你可以跟踪程序一步一步看到

即在声明的时候已经声明为虚拟函数,然后自动被注释为 //Override me! ,官方这么做就是告诉我们,要重写这个函数,里面用来写自己想要实现的场景代码。

在CreateScene中创建一个实体,使用它自带的代码: 

mHead = mSceneMgr->createEntity("CubeMappedHead", "ogrehead.mesh");  // 创建一个怪物头
mHead->setMaterialName("Examples/DynamicCubeMap");  // 给怪物头添加名为 “Examples/DynamicCubeMap” 的材质
mSceneMgr->getRootSceneNode()->attachObject(mHead);   //将该怪物头附加到根场景结点中

由于它在类里面声明了 mHead 为 Entity* 类型,所以我们也要声明,不过可以像自己创建的工程里面写的那样,在函数 createScene里面声明, 如下是自己创建的工程里createScene自带的代码:  

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
headNode->attachObject(ogreHead);

我们可以给它添加材质属性,只需要在 

headNode->attachObject(ogreHead);

之前给Entity 添加材质属性,代码如下:

ogreHead->setMaterialName("Examples/DynamicCubeMap");

 这样,我们自己的怪物头也具有了 Examples/DynamicCubeMap 的材质属性,可是当我们运行的时候,效果却是这样的: 

这并不是我们想要的效果,我们需要的是能反映周围场景的一个立方体,要做成立方体很好说,只需要在创建实体的时候,选择的网格为立方体的网格(cube.mesh,而自动创建的是怪物头,所采用的是ogrehead.mesh)即可。(关于自带的 .mesh 文件,我们可以在目录 \OGRE\OgreSDK_vc10_v1-8-1\media\models 下面查看)。

貌似哪里出了问题,个人最先想到的是查看一下所引用的 material 文件来探个究竟,于是我们去 \OGRE\OgreSDK_vc10_v1-8-1\media\materials\scripts  下找到名为 Examples.material 的材质文件,用记事本打开,找到我们所引用的材质,如图:

 ,

关于材质具体的参数介绍,可以在ogre手册中找到,我们需要注意到的是那句注释  // will be filled in at runtime   ,它告诉我们这个材质将会在运行时被填充,那看来问题不在这里,我们回到sample中,再自己看一下setupContent() 里面的代码,在创建实体之前,使用了一个函数,createCubeMap(); 然而根据其他代码的注释,并没有发现和材质有什么关系。于是我们执着的跟进了 createCubeMap() 里面查看,可以看到

。根据注释可以看到这里创建了我们需要的材质 。但是这里面还是用了其他两个变量,类型为Camera*的 mCubeCamera 和 类型为 RenderTarget** 的 mTargets ;他们都被声明为类的 protected 成员。我们把它也声明在自己的类里面。然后copy 示例中的 createCubeMap() 函数到自己的类里面,此时编译器提示一个错误,

,我们完全是根据示例代码来一步步做的,为什么会出现这样的情况呢。其实这是由于名字空间引起的,我们没有声明使用Ogre的名字空间。此时只需要在文件该文件里面声明使用名字空间Ogre即可。添加代码:

using namespace Ogre;
OK,这个问题解决了。接下来又出现一个问题,如图:

提示类型不兼容,也就是说这两个类型并不相同。但是示例代码是这样做的,再倒回去看看sample里面的代码,它的类继承了 RenderTargetListener 类,原来如此,使用基类指针来作为参数(C++继承与多态里面的知识),我们也需要这样来继承一下,在自己的类声明的时候后面添加上 ,public RenderTargetListener 表示公有继承自RenderTargetListener 类,如图:

此时,我们在自己的 CreateScene 函数中调用createCubeMap() ,此时我们CreateScene 中的代码为:

void CubeMappingDemo::createScene(void)
{
    mSceneMgr->setSkyDome(true, "Examples/CloudySky");
    createCubeMap();
    Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "cube.mesh");
    ogreHead->setMaterialName("Examples/DynamicCubeMap");
    Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    headNode->attachObject(ogreHead);

    // Set ambient light
    mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

    // Create a light
    Ogre::Light* l = mSceneMgr->createLight("MainLight");
    l->setPosition(20,80,50);
}

F5运行,效果很好:


如果是和sample里面一样创建的一个怪物头,效果更明显:



做到这里,我们应该大概知道怎么去 sample 里面 “抠” 人家的代码出来供自己学习和使用了。关于 sample 里面的代码,还有很多我们都可以使用,可以添加一些更炫的烟花,火焰等粒子系统里面的效果到自己的代码中。

得到一些烟花效果代码效果很好:



关于更多的知识,我就不在这里一一细说了。祝各位朋友在Ogre路上一路顺风~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OGRE(O-O Graphics Rendering Engine) 使用指南________________________________________________________________1 作者_________________________________________________________________________ 6 序____________________________________________________________________________7 教程的目的_________________________________________________________________ 7 读者要求___________________________________________________________________ 7 教程的由来_________________________________________________________________ 7 OGRE简介___________________________________________________________________ 8 OGRE特点_________________________________________________________________ 8 效率特性__________________________________________________________________8 平台和3D API 支持________________________________________________________ 8 网格Meshes_______________________________________________________________ 8 场景特性__________________________________________________________________9 特效______________________________________________________________________9 其它特性__________________________________________________________________9 OGRE中的模块_____________________________________________________________ 9 OgreMain 模块____________________________________________________________ 10 SDL 平台管理模块________________________________________________________ 11 Win32 平台管理模块_______________________________________________________11 BSP 场景管理_____________________________________________________________11 文件系统插件_____________________________________________________________11 GuiElement 插件__________________________________________________________ 11 OctreeSceneManager 插件___________________________________________________ 11 ParticleFX 插件___________________________________________________________ 12 Direct3D7 渲染系统插件____________________________________________________12 Direct3D8 渲染系统插件____________________________________________________12 SDL 渲染系统插件________________________________________________________ 12 3ds2oof 工具______________________________________________________________12 3Dstudio Max 导出器_______________________________________________________12 位图字体创建工具_________________________________________________________12 Milkshape3D 导出器_______________________________________________________ 12 Python 接口______________________________________________________________ 13 XML 转换器______________________________________________________________13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值