创建模型实体
Entity* entObject = mSceneMgr->createEntity(“object”, “ogrehead.mesh”);
createEntity() (创建实体) 在当前场景中创建一个实体实例并返回它的对象指针,作为 SceneManager 类的一个成员函数,它有两个重载:
Entity * Ogre::SceneManager::createEntity (
const String & entityName, // 实体名称(同一场景中不能有相同的实体名称)
PrefabType ptype // 预制类型(不需要读取模型,直接在程序中创建简单几何体,
// 目前只有平面 PT_PLANE 一种预制类型)
) [virtual]
Entity * Ogre::SceneManager::createEntity (
const String & entityName, // 实体名称(同一场景中不能有相同的实体名称)
const String & meshName // 模型名称(需要从硬盘上读取的模型的文件名)
) [virtual]
这里用的是第二个重载,也就是从硬盘上读取模型,模型文件名 “ogrehead.mesh” ,这个文件在 OGRE\Samples\Media\models 目录下。查看一下这个目录,里面有一些 *.mesh 文件,还有一些 *.skeleton 文件 。
* .mesh 文件包含了静态模型和材质的信息,*.skeleton 文件对应一个同名的 *.mesh 文件,保存这个模型的骨骼和动画信息(如果有)。使用 createEntity() 方法,不管是不是带骨骼带动画的 *.mesh ,都一样读取,但是要想播放模型的动画,还需要做一些别的工作,如果现在你直接读取 ninja.mesh 这个带骨骼动画的模型,它不会动。
到了这里,还有一个问题,就是 OGRE 是怎么找到的这个 *.mesh 文件?它怎么知道这个 *.mesh 文件是放在 OGRE\Samples\Media\models 目录下的?还有我们在示例中看到的模型是带纹理贴图的,那么纹理贴图都在哪里呢? OGRE 又是怎么找到这个模型需要的纹理贴图的呢?
在 E:\Desktop\Learning\OGRE\Samples\Common\bin 目录、还有这个目录的 Debug 和 Release 两个子目录下,存在着一系列的 *.cfg 文件,它们都是些配置文件, OGRE 程序在打开以后,第一件事情就是检查并读取这些配置文件,从中了解一些关键信息。其中的 resources.cfg 就是用来指定所有的游戏资源所在的目录路径, OGRE 要读取一些资源,就会从这些路径中搜索。
resources.cfg 文件的内容:
FileSystem=../../../Media
FileSystem=../../../Media/fonts // 字体
FileSystem=../../../Media/materials/programs // 材质程序 (CG、HLSH、GLSL 等)
FileSystem=../../../Media/materials/scripts // 材质定义脚本
FileSystem=../../../Media/materials/textures // 纹理贴图
FileSystem=../../../Media/models // 模型
FileSystem=../../../Media/overlays // 盖层(界面)定义脚本
FileSystem=../../../Media/particle // 粒子定义脚本
Zip=../../../Media/packs/cubemap.zip
Zip=../../../Media/packs/cubemapsJS.zip
Zip=../../../Media/packs/dragon.zip
Zip=../../../Media/packs/fresneldemo.zip
Zip=../../../Media/packs/OgreCore.zip
Zip=../../../Media/packs/ogretestmap.zip
Zip=../../../Media/packs/skybox.zip
你可能会留意到每一条语句前面有 FileSystem 和 Zip 的区别,查看一下 OGRE\Samples\Media\packs 里面的那些 *.zip 文件,用 WinRAR 把它们打开来看,比方说打开 dragon.zip ,可以看到里面有这样几个文件:
dragon.mesh
body.jpg
head4.jpg
legs.jpg
一个模型,带三张贴图,就是这么简单。 这个意味着,OGRE 在搜索所需资源的时候,不但能搜索系统目录 (FileSystem) ,还能在压缩文件 (Zip) 中搜索。
最后是模型的纹理贴图,这个在 *.mesh 文件自身中定义,我们在使用 3dsmax 、 Maya 等输出 *.mesh 模型的同时,纹理贴图的相对路径也会被同时包含输出。
// 创建模型实体
Entity* entObject = mSceneMgr->createEntity(“object”, “ogrehead.mesh”);
现在你可以试着让它读取不同的模型,就把这个示例当作一个模型浏览器来用吧 ,几个 *.zip 文件里的资源也试试,比方说,读取 “dragon.mesh” 。