第一章 安装Ogre 3D引擎
想要学习并且使用 Ogre,就要先下载并安装它。
在这章,我们将会学习到:
1. 下载并安装 Ogre 3D 引擎
2. 配置好 Ogre 3D 引擎的开发环境
3. 用 Ogre 3D 引擎构建第一个场景
那我们就开始了。
1、下载并安装 Ogre 3D 引擎
我们要干的第一步就是安装并配置Ogre 3D引擎
1.1 实践时刻——下载并安装Ogre 3D引擎
为了后面的使用,现在我们就要下载安装Ogre 3D SDK了
1.打开http://www.ogre3d.org/download/sdk的链接
2.下载合适的安装包。如果你对要下载哪个正确的安装包而需要帮助时,那就看看后面的“刚刚发生了什么”这一部分
3.把 SDK 的安装程序复制到你希望把OgreSDK放置的文件夹里
4.双击安装程序,这会启动一个自解压缩程序
5.现在你应该得到一个名字类似于OgreSDK_vc10_v1-8-1的文件夹
6.打开该文件夹。文件夹的内容应该像下面的截图
1.2 刚刚发生了什么?
我们刚刚只是下载了一个适合我们操作系统的 Ogre 3D SDK。Ogre 3D 引擎是一个跨平台的渲染引擎,所以对于不同的操作系统就有不同的开发包。下载完 Ogre3D SDK 我们解压了它。
2、不同版本的Ogre 3D SDK
Ogre支持多种平台,正因为如此,有很多种不同的开发包供我们下载。Ogre 3D 在Windows 有好几个版本,有一个支持 MacOSX 的版本还有一个支持 Ubuntu 的版本。而且还提供了支持 MinGW 和 iPhone 的开发包。如果你愿意的话,你还可以下载 Ogre的源码然后自己手动编译 Ogre。这一章我们主要关注于预先编译好的 Windows 的 SDK 和如何配置你的开发环境。如果需要关于其他的操作系统的,你可以参考 Ogre 3D Wiki,网址为:http://www.ogre3d.org/wiki。Wiki 包含了对很多不同的平台下的Ogre开发环境的配置的教程。这本书的剩余部分和使用的平台是完全独立的,所以如果你想使用其他的开发平台,随你便啦。它不会影响到本书的内容和对编译系统的配置与约定。
2.1 探索 SDK
在我们编译 SDK 里面的示例之前,让我们先来看看 SDK。我们来看看 Windows操作系统上的 SDK 结构。在 Linux 和 MacOS 上可能会有所不同。首先,我们打开 bin 这个文件夹。这里面会有两个文件夹,即 debug 和 release文件夹。对于 lib 文件夹里面也是如此。这里面的原因是在于 Ogre3D SDK 对其库文件和动态链接库文件有debug和 release两种编译方式。这就使得我们可以在开发过程中使用 debug 模式来调试我们的项目。完成项目后,可以使用release模式来编译得到完整的 Ogre3D 程序。
不论打开 debug 或者 release文件夹,我们都可以看到有很多的 dll 文件,一些 cfg 文件还有两个可执行文件(exe)。可执行文件是为了把 Ogre 升级到一个新的版本,所以在此对我们来说没有啥用处。
OgreMain.dll 是最重要的 DLL 文件。后面编译的 Ogre3D 程序都会用到它。所有名字以Plugin_开头的 DLL 文件是 Ogre3D 程序可以使用的插件。Ogre 3D 插件是使用 Ogre 3D 提供的接口来给 Ogre 3D 添加新功能的动态链接库文件。插件可以提供任何东东,但是它常常是用来添加一些特性例如更好的粒子系统或者新的场景管理器。这些东西后面会谈到的。Ogre 3D 社区提供了很多的插件,大部分可以在 wiki 中找到。SDK 中只是包含了最近常用的插件。在本书后面,我们会学习如何去使用它们。名字以 RenderSystem_开头的 DLL 文件,不要惊讶啊,是为了封装起来针对于 Ogre 3D 所支持不同的渲染系统。在这里所指的是Direct3D9 和 OpenGL。除了这两个系统,Ogre 3D 还支持 Direct3D10、Direct3D11 和 OpenGLES(支持嵌入式系统的 OpenGL)渲染系统。
除了可执行文件和 DLL 文件,还有一些 cfg 文件。所谓的 cfg 文件就是 Ogre 3D 程序可以加载的配置文件。Plugins.cfg 列出了 Ogre 3D 程序启动时所要加载的全部的插件。这些通常是 Direct3D 和 OpenGL 渲染系统还有一些附加的场景管理系统插件。当加载 Quake3 格式的地图时需要 quakemap.cfg 这个配置文件。我们用不上这个文件,但是有个例子用得上。
resources.cfg 包含了所有的资源的列表,例如一个 3D 网格、纹理或者动画,这些都是 Ogre 3D 启动时需要加载的。Ogre 3D 程序可以从文件系统或者一个 ZIP 压缩文件中加载资源。我们如果看看这个 resources.cfg 文件内容就可以得到以下几行:
Zip=../../media/packs/SdkTrays.zip
FileSystem=../../media/thumbnails
ZIP=意味着那些资源文件是存在 ZIP 压缩包里的,FileSystem=意味着要加载一个文件夹里的内容。resources.cfg 使得加载新的资源和改变资源的路径非常容易,所以它常常被用来加载资源,特别是被 Ogre 的例子程序所使用。来说一下示例程序,文件夹中的最后一个 cfg文件是 sample.cfg。我们自己用不上这个文件。其实它包含着一个 SampleBrowser(示例浏览器)程序所需加载的所有 Ogre 示例列表。但是我们还没搞到 SampleBrowser,所以就要搞一个出来。
3、Ogre3D 示例程序
Ogre 3D SDK 附带了很多的示例,这些示例展示了 Ogre3D 所拥有的不同种类的渲染效果和手法。在我们开始编写我们自己的程序之前,为了加深 Ogre 程序的功能我们先来看看这些示例。
3.1 实践时刻——构建 Ogre 3D 示例程序
为了先看看 Ogre 3D 到底能干嘛,我们会构建示例程序并且看看它们。
1.找到 Ogre3D 的文件夹
2.打开 Ogre3d.sln 解决问题方案文件
3.在解决问题方案上右键选择“构建解决问题方案”
4.Visual Studio 会构建示例程序,这会消耗掉一些时间,所以在编没有完成之前最好是泡上杯茶喝喝
5.若一切顺利,找到 Ogre3D/bin 文件夹
6.运行 SampleBrowser.exe.
7.然后你应该看到如下给力的结果:
8.试试运行不同的示例程序来看看 Ogre3D带来的精彩的特效。
3.2 刚刚发生了什么?
我们使用自己的 Ogre3D SDK 构建出 Ogre3D 示例。在此之后,我们会有一个 Ogre3D开发的副本
3.3 突击测验——示例程序里展示了哪些后期效果
1.列举至少 5 种在示例程序中展示了的不同后期效果
a.模糊,玻璃特效,旧电视感觉,黑白效果和倒置
b.模糊,玻璃特效,旧显示器感觉,黑白效果和倒置
c.模糊,玻璃特效,旧电视感觉,颜色和倒置
答案:a
4、第一个 Ogre 3D 程序
在这一部分,我们会创建一个只有一个 3D 模型的 Ogre3D 程序。
4.1 实践时刻——创建项目并配置 IDE(集成开发环境)
由于用到了其他的一些库,在使用 Ogre 3D SDK 之前我们需要配置 IDE
1.新建一个空工程
2.在工程里新建一个文件,命名为main.cpp
3.添加一个 main 方法:
int main (void)
{
return 0;
}
4.在该文件开头部分包含上 ExampleApplication.h文件:
#include"Ogre\ExampleApplication.h"
5.添加“你的 Ogre SDK 路径\include\”,“你的 Ogre SDK 路径\include\OGRE”,“你的 Ogre SDK 路径\include\OIS”,到你的项目include path(头文件路径)
6.添加“你的 Ogre SDK 路径\boost\”到你的项目include path(头文件路径)
7.添加“你的 Ogre SDK 路径\boost\lib\”到你的项目 libpath(库文件路径)
8.向 main.cpp 里添加一个类:
class Example1 : public ExampleApplication
{
public:
void createScene()
{
}
};
9.把下面的代码添加到你的 main 函数里:
Example1 app;
app.go();
10. 添加“你的 Ogre SDK 路径\lib\debug\”到你的项目 lib path(库文件路径)
11. 添加 OgreMain_d.lib 到需要的链接库(工程属性的Linker->Input)里
12. 添加 OIS_d.lib 到需要的链接库(工程属性的Linker->Input)里
13. 编译此项目
14. 设置项目程序的工作空间(workingdirectory)为“你的 Ogre SDK 路径\bin\debug”
15. 运行该程序,你应该能够看到 Ogre 3Dsetup 对话框
16. 按下 OK 按钮启动应用程序。你会看到一个黑色的窗口。按下 Esc键退出程序。
4.2 刚刚发生了什么?
我们创建了第一个 Ogre3D 程序。为了编译它,我们需要设置好不同的头文件路径和库文件路径以便于编译器能够找到它们。
在第 5 和第 6 步,我们在构建环境中添加了两个头文件的路径。第一个路径是 Ogre 3D SDK 的头文件文件夹,它包含着所有 Ogre 3D 和 OIS(OIS 是 Object Oriented Input System的简称,意为“面向对象的输入系统”,ExampleApplication使用 OIS 监视用户的输入)的头文件。OIS 不是 Ogre3D 中的一部分;它是一个独立的项目并且有一个不同的开发团队在开发。它出现在 Ogre 3D 是因为 ExampleApplication 使用了它,所以用户不需要去下载它的依赖文件。 ExampleApplication.h 也在那个文件夹中。由于 Ogre3D 提供线程支持,所以我们需要把 boost 文件夹添加入头文件路径。否则的话,我们用 Ogre3D 引擎什么程序也编译不了。如果需要的话,Ogre 3D 可以直接从源码编译,那样的话可以取消线程支持也就取消掉了 boost 文件夹的需求。当使用 boost 的时候,编译器需要链接到 boost 的库文件。所以我们添加了 boost 的库文件文件夹到 lib path(见第 7 步)。
在第 10 步中,我们把“你的 Ogre SDK 路径\ lib\debug\”添加到了库文件路径之中,像前面所说的那样,Ogre3D 有 debug 库和 release 库。在这里我们使用 debug 库,因为如果出现错误,debug 库提供调试支持。当想使用 release 库的时候,要把“lib\debug”改为“\lib\release”。对于第 11 步和第 12 步也是如此。在那两步中我们添加了 OgreMain_d.lib 和OIS_d.lib 作为需要链接的库文件。当想使用 release 版本的时候,要改成 OgreMain.lib 和OIS.lib。OgreMain.lib 和 OgreMain_d.lib 文件包含着 Ogre3D 程序的接口信息和怎么样加载OgreMain.dll 或 OgreMain_d.dll。注意 OIS.lib 或OIS_d.lib 对于输入系统也是如此——他们加载 OIS_d.dll 或 OIS.dll。所以我们动态的链接 Ogre3D 和 OIS,这样使得我们可以切换 DLL而不需要重新编译程序,只要接口和库没有变化而且 DLL 使用相同的运行库版本。这也就要求程序时刻需要加载 DLL,所以要确保程序能够找到那些 DLL。这也就是我们为啥要在第 14 步设置工作空间。还有一个原因会在后面的部分澄清。
5、ExampleApplication (OgreSDK 中的一个类)
我们创建了一个新的类,Example1,它继承于 ExampleApplication。ExampleApplication是 Ogre3D SDK 提供的一个类,它是为了使学习Ogre 3D 简单一些而在 Ogre 3D 上附加了一个抽象层。ExampleApplication 为我们开始学习 Ogre 提供了帮助,它可以加载不同的模型,而且声明了一个可以在场景中四处游览的简单 camera(摄像机)。使用 ExampleApplication需要继承于它并且重载虚函数 createScene()。我们会使用 ExampleApplication 类,这样的话可以省下不少的时间。等到对 Ogre3D 有了很好的了解之后,我们会用自己的代码一点点的替换掉 ExampleApplication。
在 main 函数里,我们实例化了一个新的类并且调用了 go()函数来启动应用程序并加载Ogre 3D。在启动时,Ogre 3D 加载 3 个配置文件——Ogre.cfg、plugins.cfg 和 resources.cfg。如果使用的是 debug 模式,所以要每个文件名字后面要加上“_d”。这个非常有用因为对 debug和 release 有不同的配置文件。Ogre.cfg 包含着在 setup 对话框中选择的设置,所以每次程序启动它加载相同的配置。plugins.cfg 包含 Ogre需要加载的插件列表。最重要的插件是渲染系统插件。它是 Ogre 和 OpenGL 或 DirectX 渲染场景的接口。resources.cfg 包含着 Ogre 启动时需要加载的资源列表。Ogre 3D SDK 附带了很多的模型和材质,本书会用到这些,resources.cfg 指出了他们的路径。如果你深入了解 resources.cfg,你会发现这个文件中的路径都是相对路径。这也是我们需要设定工作空间的另一个原因。
5.1 突击测验——要链接哪个库
1.当使用 Ogre3D 的 release 模式的时候,你认为要链接哪些库?
a.OgreD3DRenderSystem.lib
b.OgreMain.lib
c.OIS.lib
答案:b & c
2.当想使用 Ogre3D 的 debug 模式的时候,你认为该做哪些改变?
a.在库文件名后面加上“_debug”
b.在文件扩展名后面加上“_d”
c.在库文件名后面加上“_d”
答案:c
6、加载第一个 3D 模型
加载一个模型很容易。只需要加上下面两行代码
1.把下面两行代码加入到空的createScene()方法中:
Ogre::Entity* ent = mSceneMgr->createEntity( "MyEntity", "Sinbad.mesh" );
mSceneMgr->getRootSceneNode()->attachObject( ent );
2.再次编译你的程序
3.启动程序。你会看到一个小的绿色的东东。
4.使用鼠标四处浏览场景,使用“WASD”移动视角直到看着感觉绿色的东东在视角中比较合适
5.关闭程序
6.1 刚刚发生了什么?
使用mSceneMgr->createEntity("MyEntity","Sinbad.mesh");,我们告诉了 Ogre 我们想创建一个Sinbad.mesh 模型的实例。mSceneMgr 是 Ogre3D 中指向SceneManager(场景管理器)的指针,这个指针由 ExampleApplication 为我们创建。为了创建一个新的 entity(实体),Ogre需要知道使用哪个模型文件,而且我们可以给新的实例起一个名字。这个名字是独一无二的非常重要,它不可以被用两次。如果发现了使用两次,Ogre 3D 会抛出一个异常。如果没有起一个名字,Ogre3D 会自动生成一个。后面我们会详细的讲到。
现在我们有了一个模型的实例,为了使它显示出来,我们需要把它附加在场景之中。添加场景很容易——只要加上下面一句话:
mSceneMgr->getRootSceneNode()->attachObject( ent );
这样的话,附加实体到场景中以便我们能够看到它。我们所看到的是个水手,是 Ogre3D 模型的吉祥物。贯穿这本书我们将看到很多次这个模型。
6.2 突击测验——ExampleApplication和怎样显示出一个模型
用自己的话说说怎样加载一个模型并且使其可见。
7、总结
我们学习了 Ogre3D SDK 是如何组织的,哪些库是需要链接的,还有哪些文件夹是需要加入头文件路径。而且,我们瞄了一眼 ExampleApplication 这个类并且学习了如何去使用它。我们加载了一个模型并且显示了出来。明确一下,这一章包含了:
1.哪些文件对于 Ogre 3D 开发是重要的,它们怎么相互影响,还有它们的作用是啥
2.ExampleApplication 是干嘛的:它是怎样节省工作量的,Ogre 3D 程序启动时干了什么
3.模型加载:我们学会了使用 createEntity 来创建一个新的模型实例,学会了一种把新实例附加到场景中的办法在这些关于 Ogre3D 的介绍之后,我们将在下一章学习 Ogre3D 怎样管理场景并熟练地操纵场景。