第一章获取OGRE
OGRE 官方网站:
https://www.wendangku.net/doc/ae18172301.html,/
国内可能存在不能访问的情况,可以到这里寻找代理服务器,使用代理服务器来登录:
https://www.wendangku.net/doc/ae18172301.html,/plr.html
这是代理速度排行榜,其中除了灰色之外的代理都是匿名的。
首先,要使用 WinCVS 来下载和更新 OGRE 的 CVS 源代码。
WinCVS 是现今最流行的代码版本控制系统,可以使参与到同一个软件工程中的所有用户的代码保持同步更新。使用 CVS ,可以随时获取该工程的最新代码。如果你还没有安装 WinCVS ,先到这里下载:
https://www.wendangku.net/doc/ae18172301.html,/
WinCvs 1.3.20.2安装程序本地下载安装以后,先设置 WinCVS 的文件下载的根目录:
(1) 打开 WinCVS ;
(2) 从主菜单选择 [Admin]-[Preferences...] ,弹
出 "WinCVS Preferences" 面板,切换到 "CVS" 选项卡,在 "HOME" 里设
置 WinCVS 的下载文件夹,例如 "F:\cvshome" ,然后确定。如下图:
下面就可以开始下载 OGRE 的 CVS 源代码了:
(1) 在 WinCVS 主界面左栏选中 "cvshome" ;
(2) 从主菜单选择 [Admin]-[Command Line...] ,弹
出 "Command line settings" 面板,在 "Settings" 选项卡的上部输入框里,输入如下指令:
cvs -d:pserver:anonymous@https://www.wendangku.net/doc/ae18172301.html,:/cvsroot/ogre login
这是登陆 OGRE CVS 服务器的指令,输入以后按 [确定] 来运行就会开始登陆,成功连接到服务器以后还会弹出一个如下的对话框,问询你密码:
直接按回车就行了。OGRE 这种开源引擎的 CVS 都可以匿名访问,不需要密码,就是简单按一下回车。
(3) 成功登陆以后, WinCVS 主界面的下部信息栏会显示这样一条信息:
***** CVS exited normally with code 0 *****
code 0 就表示登陆成功,如果不成功,显示为 code 1 。
(4) 登陆成功以后,再次打开 "Command line settings" 面板,输入并运行如下指令:
cvs -z3 -d:pserver:anonymous@https://www.wendangku.net/doc/ae18172301.html,:/cvsroot/ogre co ogr enew
CVS 源代码就开始下载了。耐心等它下载完毕。
(5) 这时候在 WinCVS 主界面左栏的“cvshome”下边,多了一
个 "ogrenew" 的文件夹。你可以到硬盘的 F:\cvshome\ogrenew\看一下,所有的源代码都在那里了。
OK.
最后讲讲 CVS 的更新。很方便。经常通过 CVS 更新文件可以使你的代码保持最新版本。 OGRE 是一个很活跃的开源项目, CVS 的更新很频繁。
(1) 最快捷的办法是,在 WinCVS 主界面左栏的“cvshome”下边
的 "ogrenew" 文件夹上右击,在弹出的右键关联菜单上选
择 [Query Update] ,就会自动登陆并检查文件,如果服务器上的文件比本地文件新,就会从服务器下载最新文件覆盖本地旧的同名文件。
(2) 有时候 WinCVS 可能会失去你的登陆信息,这时候 [Query Update] 指令变灰无法使用,就需要重新登陆,然后再使用 (1) 的办法来更新文件。
第二章编译OGRE
下载以后就要开始编译。
编译之前,先确认你做好了以下准备工作:
(1) 确认你安装了 Microsoft Visual Studio .NET 或 Microsoft Visual Studio .NET 2003;
Microsoft Visual Studio 6.0 也可以,但是我用的是 .NET 2003 ,VC6 有一些差异。
(2) 确认你安装了 DirectX 9.0 SDK Update (Summer 2004) ;
你可以去 MSDN 下载:
https://www.wendangku.net/doc/ae18172301.html,/directx
下载后安装。假设你安装到 D:\DXSDK9\。
使用这个 SDK 版本,编译的 Demo 需要 DirectX 9.0c Runtime 来运行。
(3) 还需要下载编译 OGRE 必须的一些依赖项,包括头文件和库;
来这里下载:
https://www.wendangku.net/doc/ae18172301.html,/projects/ogre
下载 "OgreWin32Dependencies-0.13.0.zip"
下载以后解压缩,可以看到里面有个 ogrenew 目录,把这个目录覆盖到 F:\cvshome\ogrenew\。
OK.
下一步,打开 https://www.wendangku.net/doc/ae18172301.html, 或 https://www.wendangku.net/doc/ae18172301.html, 2003 ,设置工作环境。
(1) 在主菜单中选择 [工具]-[选项...] ,打开 "选项" 面板,在左边目录选择[项目]-[VC++ 目录] ;
(2) 在右栏设置 Include 和 Lib 目录:
包含文件:
D:\DXSDK9\Include
F:\cvshome\ogrenew\Dependencies\include
库文件:
D:\DXSDK9\Lib
F:\cvshome\ogrenew\Dependencies\lib\Release
注意把这几条目录放在目录列表的最上面:
(3) OK. 现在打开 F:\cvshome\ogrenew\Ogre.sln ,从主菜单中选择 [生成]-[批生成...] ,打开 "批生成" 面板,点击右边的 [全选] 按钮,然后点击[重新生成] 按钮开始生成:
等半个小时左右,等待编译完成。
编译后的 dll 和 exe 示例文件在 F:\cvshome\ogrenew\Samples\Common
\bin 的 Release 和 Debug 文件夹,可以运行一下示例看看。
===========补充说明================
OgreWin32Dependencies-0.13.0.zip 解压缩后,它的顶层目录结构如下:
ogrenew
|--Dependencies // lib 和 h
|--Samples // dll
一定要把这个 Dependencies 和 Samples 放到 CVS 的 ogrenew 目录下,不要放别处,因为除了那些 dll 需要调用,部分项目的 lib 设置使用的是相对路径,所以不要放别处。
使用 VC6 编译 OGRE 所需要的附加依赖项:
包含 STLPort 的 *.h 、已编译的 *.lib 、 *.dll for VC 6 ,以及 cg.dll 点击下载此文件
使用方法:解压缩后将其中的 ogrenew 目录覆盖到 CVS 的 ogrenew 目录。
第三章异地编译示例Demo
OGRE 编译成功以后,它本身附带的所有示例也同时编译完毕, exe 文件都在 F:\cvshome\ogrenew\Samples\Common\bin 的 Release 和 Debug 文件夹里。看过这些示例以后,我们可以试着修改这些示例的源代码,这是学习 OGRE 的第一步。
这些示例的源代码都在 F:\cvshome\ogrenew\Samples\文件夹下,每个示例的目录下大都有 include 和 scr 两个子文件夹,分别盛装这个示例的 h 和cpp 源文件。
但是我们最好不要动这里的源文件,我们把整个 F:\cvshome\ogrenew\Samples\文件夹复制出来,复制到别的地方,重新创建解决方案、创建和设置项目,重新编译,这样可以使我们熟悉 OGRE 项目的创建和设置办法。
我们把整个 F:\cvshome\ogrenew\Samples\文件夹复制到一个新地方,我的是 E:\Desktop\Learning\OGRE\Samples\;
然后,在这个目录下,只保留 Common 和 Media 两个目录,其它目录尽数删除;Common 目录是生成的 exe 文件的执行目录,里面的 dll 、 cfg 文件都是运行exe 文件所必需的,后面我们要设置一下项目的生成目录,让 exe 文件都生成在 E:\Desktop\Learning\OGRE\Samples\Common\bin 目录下;
Media 目录是所有图片、模型、材质、声音、脚本等等资源的储存文件夹;
OK. 现在打开 https://www.wendangku.net/doc/ae18172301.html, ,首先设置全局选项:
(1) 在主菜单中选择 [工具]-[选项...] ,打开 "选项" 面板,在左边目录选择
[项目]-[VC++ 目录] ;
(2) 在右栏设置 Include 和 Lib 目录:
包含文件:
D:\DXSDK9\Include
F:\cvshome\ogrenew\OgreMain\include
F:\cvshome\ogrenew\Dependencies\include
库文件:
D:\DXSDK9\Lib
F:\cvshome\ogrenew\OgreMain\lib\Release
F:\cvshome\ogrenew\OgreMain\lib\Debug
F:\cvshome\ogrenew\Dependencies\lib\Release
注意把这几条目录放在目录列表的最上面。
OK.现在我们在 E:\Desktop\Learning\OGRE\Samples\建立一个新的空白解决方案:
(1) 在主菜单中选择 [文件]-[新建]-[空白解决方案...] ,打开 "新建项目" 面板;
(2) 在左边 "项目类型" 栏选择 "Visual Studio 解决方案" ,在右边“模板" 栏选择 "空白解决方案" ;
(3) 在下面的 "位置" 一栏,输入或浏览到 "E:\Desktop\Learning\OGRE" ,在 "名称" 一栏输入解决方案名称 "Samples" ,然后确定:
(4) 保存一下,这时候我们打开 E:\Desktop\Learning\OGRE\Samples\,就能看到我们新建的同名解决方案文件 Samples.sln 。
OK.现在我们建立我们的第一个 OGRE 项目。在 F:\cvshome\ogrenew\Samples\的一系列示例里面,最简单、最入门的是 SkyPlane ,我们就使用它的现成代码来新建一个项目:
(1) 在 https://www.wendangku.net/doc/ae18172301.html, 边栏点击,弹出 "解决方案资源管理器" ,可以看到我们新建的"Samples" 空白解决方案;
(2) 在解决方案 "Samples" 上右击,在弹出的关联菜单中选择 [添加]-[新建项目...] ,打开 "新建项目" 面板;
(3) 在左边 "项目类型" 栏选择 "Visual C++ 项目" - "Win32 " ,在右边“模板" 栏选择 "Win32 项目" ;
(4) 在下边 "名称" 栏输入我们的第一个项目的名称:"SkyPlane_01" ,然后确定;
(5) 这时候又弹出 "Win32 应用程序向导" 面板,点击左栏的 [应用程序设置] 按钮切换选项卡,勾选 "空项目" 复选框,然后完成:
OK.下面向新项目 SkyPlane_01 添加代码:
(1) 把下列文件复制到 E:\Desktop\Learning\OGRE\Samples\
SkyPlane_01 目录下:
E:\Desktop\Learning\OGRE\Samples\Common\include\ExampleApplication.h
E:\Desktop\Learning\OGRE\Samples\Common\include\ExampleFrameListener.h
F:\cvshome\ogrenew\Samples\SkyPlane\include\ SkyPlane.h
F:\cvshome\ogrenew\Samples\SkyPlane\src\ SkyPlane.cpp
(2) 在 https://www.wendangku.net/doc/ae18172301.html, 边栏点击,弹出 "解决方案资源管理器" ,在我们新建的"SkyPlane_01" 项目上右击,在弹出的关联菜单中选择 [添加]-[添加现有项...] ,选中上边已复制到E:\Desktop\Learning\OGRE\Samples\SkyPlane_01 目录下的四个文件,打开,OK。
在上面的四个文件中, ExampleApplication.h 和 ExampleFrameListener.h 这两个文件是公用的示例框架文件,这两个文件看起来不短,它们的作用是为我们预先搭好了一个简单的应用程序框架,里面包括了选项设置、画面渲染、消息显示、输入控制等简单模块,在一开始我们可以不用深究这两个文件到底写了些什么,只需要调用它们、只需要修改 SkyPlane.cpp 的核心代码。
现在代码还不能顺利编译,我们还需要设置项目属性:
(1) 在 https://www.wendangku.net/doc/ae18172301.html, 边栏点击,弹出 "解决方案资源管理器" ,在我们新建的"SkyPlane_01" 项目上右击,在弹出的关联菜单中选择 [属性] ,弹出项目属性页,设置下列选项:
Debug
常规:输出目录:..\Common\bin\Debug
调试:工作目录:..\Common\bin\Debug
C/C++
代码生成:运行时库:多线程调试 DLL (/MDd)
链接器
输入:附加依赖项:OgreMain_D.lib
Release
常规:输出目录:..\Common\bin\Release
调试:工作目录:..\Common\bin\Release
C/C++
代码生成:运行时库:多线程 DLL (/MD)
链接器
输入:附加依赖项:OgreMain.lib
OK. 现在可以编译 SkyPlane_01 了,马上就可以亲身体会 OGRE 强大无穷的魅力了!
生成的 exe 文件在 E:\Desktop\Learning\OGRE\Samples\Common\bin 的 Release 和 Debug 文件夹里,为什么非要生成在这个文件夹,因为里面的cfg 和 dll 是运行程序所必需的,所以路径不能错。
另外, OGRE 有个 APPWizard 可以很方便地用 https://www.wendangku.net/doc/ae18172301.html, 直接创建 OGRE 项目,可惜在我的 https://www.wendangku.net/doc/ae18172301.html,2003 上不能用。
第四章 OGRE API 参考 (chm 格式)
这个会随时更新,但是每个人学会用 DoxyGen 来生成 API 文档比较好。
OGRE API Reference (12.8 MB)
第五章 OGRE引擎分析
作者:盛崇山
https://www.wendangku.net/doc/ae18172301.html,
AntsamCGD@https://www.wendangku.net/doc/ae18172301.html,
3D 大牛盛崇山大师从高屋建瓴的角度编撰的六章 OGRE 引擎分析,有助于我们从整体上了解 OGRE 的工作机制。
OGRE 引擎分析
PDF 格式,需要安装 Adobe Reader 来阅读。
第六章最简单的游戏窗口代码
示例代码:
点击下载本节示例代码
文件目录:
OGRE\Samples\OGRE_YC_001_Simplest
main.cpp
Simplest.h
OGRE_YC_001_Simplest.vcproj
使用方法:
(1) 打开 https://www.wendangku.net/doc/ae18172301.html, ,在主菜单中选择 [工具]-[选项...] ,打开 "选项" 面板,在 [项目]-[VC++ 目录] 的“包含文件” 目录下添加下面这个路径:
E:\Desktop\Learning\OGRE\Samples\Common\include
如图:
这样设置的意图是使本节和以后的所有示例都能方便地直接包含进 OGRE\Samples\Common\include 目录下的 ExampleApplication.h 和ExampleFrameListener.h 两个头文件,这两个头文件定义了一个简单通用的应用程序框架,在这个通用框架里集成了应用程序的设置、运行环境的创建、画面更新、消息界面、输入检测、镜头控制等等的一系列现成方法,这两个头文件放在 OGRE\Samples\Common\include 目录下,被所有的示例文件所引用,因为这两个文件已经帮我们做好了一些最基本的工作,所以可以有助于我们在一开始就直接切入到 OGRE 的实用层面,省略一些初期的繁琐步骤。
这两个头文件,如果不感兴趣,在开始的时候都不用看。如果比较感兴趣,可以试着改一些参数,比方说,我的就修改了窗口的背景颜色和镜头的移动速度:
(2) 使用 https://www.wendangku.net/doc/ae18172301.html, 打开 OGRE\Samples\Samples.sln ;
(3) 调出解决方案资源管理器,在解决方案"Samples"上右击,在弹出的右键关联菜单中选择 [添加]-[现有项目...] ,选择 OGRE_YC_001_Simplest.vcproj 并确定;
(4) 因为 OGRE_YC_001_Simplest.vcproj 里面没有包含工作目录的信息,所以还需要再设置一下工作目录,这样我们可以直接在 https://www.wendangku.net/doc/ae18172301.html, 中运行和调试生成的OGRE 程序。
在解决方案资源管理器的 OGRE_YC_001_Simplest 项目上右击,在弹出的关联菜单中选择 [属性] ,弹出项目属性页,添加下列选项:
Debug
调试:工作目录:..\Common\bin\Debug
Release
调试:工作目录:..\Common\bin\Release
(5) 从主菜单中选择 [生成]-[批生成...] ,弹出 "批生成" 面板,仅仅勾选OGRE_YC_001_Simplest 项目的 Debug 和 Release 配置,然后点击右边的 [生成] 或 [重新生成] 按钮,如下图,然后静待项目生成 Debug 和 Release 两个版本;
(6) 生成的 exe 文件在 OGRE\Samples\Common\bin 的 Release 和 Debug 文件夹里,可以运行看看,效果如图:
本章以后的示例代码编译办法与此相同,以后不再敷叙。
解说正文:
这个是最简单的 OGRE 应用程序代码。
在 Simplest.h 中,它定义了公用的示例应用程序基类 ExampleApplication 的派生类 SimplestApplication ,并重新定义了 createScene 方法(这一步不能省略,因为 createScene 是个纯虚函数)。
然后在 main.cpp 中,简单创建一个 SimplestApplication 实例并启动它:
就这么简单。而且在以后章节的示例中, main.cpp 基本上还是这么几行短短的代码。
第七章场景节点和实体
示例代码:
点击下载本节示例代码
运行截图:
这个示例很简单,读取并显示一个模型。
预备知识:
OGRE 的场景组织方式,就像一棵树,树有根、有枝干、有叶子和果实。最基本的两个概念,是场景节点 (SceneNode) 和实体 (Entity) 。场景节点就像树枝,实体就像枝头的果实。我们可以画个概念图:
场景节点就像根、树干和树枝,它可以再分枝,或者挂上果实(实体);
实体就像果实,它总是被绑定 (Attach) 在一个场景节点上并且总是处于分枝的末端;
场景节点控制实体的位置、方向、缩放等空间属性;
实体具有自己所使用的模型、材质、阴影、骨骼、动画、渲染状态等各种个体属性;
整个场景节点拥有唯一的一个根场景节点(RootSceneNode),如果一个实体不是根场景节点的“后代”,也就是所谓的“游离”实体或被绑定在一个"游离"节点上的实体,它不会被显示。
场景节点类 Ogre:: SceneNode 在头文件 OgreSceneNode.h 中定义,下面是它的关联图表:
点击看大图
实体类 Ogre:: Entity 在头文件 OgreEntity.h 中定义,下面是它的关联图表:
点击看大图
示例解说:
这个示例的核心代码,在源文件 SceneNodeAndEntity.cpp 的
void SceneNodeAndEntityApplication::createScene( void ) 方法定义中。
(1)
// 设置环境光
mSceneMgr->setAmbientLight(ColourValue(1.0f, 1.0f, 1.0f)); mSceneMgr 是在公用示例基类 OGRE::ExampleApplication 中已经定义好的一
个保护成员,作为场景管理器 (SceneManager) 的一个实例来使用。
场景管理器类 Ogre:: SceneManager 在头文件 OgreSceneManager.h 中定义,场景管理器,顾名思义,它是整个 OGRE 场景的总管,管理整个场景中的所有场景节点 (SceneNode) 、实体 (Entity) 、光源 (Light) 、镜头 (Camera) 、材质 (Material) 、阴影 (Shadow) 、公告板 (Billboard) 、动画 (Animation) 、天空 (Sky) 、雾 (Fog) 、盖层 (Overlay) 等等大量元素。下面是它的关联图表:
点击看大图
setAmbientLight() (设置环境光) 的作用是给整个场景设置一个统一的散射光,散射光没有光源,没有方向性,不会在物体表面留下阴影,仅仅是照亮场景。默认的环境光颜色是黑色,所以我们要设置一个较亮的颜色,要不模型看上去漆
黑一团。
setAmbientLight() 方法的原型在头文件 OgreSceneManager.h 中定义:
void Ogre::SceneManager:: setAmbientLight ( const ColourValue & colour )
其中的 ColourValue (颜色值)是 OGRE 颜色类,在头文件 OgreColourValue.h 中定义:
ColourValue (Real red=1.0f, Real green=1.0f, Real blue=1.0f, Real alpha=1.0f)
除了直接用 RGBA 值来表示颜色, ColourValue 还具有几个预先设定好的颜色值:
(2)
(3)
这里用的是第二个重载,也就是从硬盘上读取模型,模型文件名
"ogrehead.mesh" ,这个文件在 OGRE\Samples\Media\models 目录下。查看一下这个目录,里面有一些 *.mesh 文件,还有一些 *.skeleton 文件。
*.mesh 文件包含了静态模型和材质的信息,*.skeleton 文件对应一个同名的*.mesh 文件,保存这个模型的骨骼和动画信息(如果有)。使用 createEntity() 方法,不管是不是带骨骼带动画的 *.mesh ,都一样读取,但是要想播放模型的动画,还需要做一些别的工作,如果现在你直接读取 ninja.mesh 这个带骨骼动画的模型,它不会动。
到了这里,还有一个问题,就是 OGRE 是怎么找到的这个 *.mesh 文件?它怎