目录
一、什么是 OGRE?
OGRE,全称 Object-Oriented Graphics Rendering Engine,即面向对象图形渲染引擎 ,也被称为 OGRE 3D。它是一款面向场景、实时、开源且跨平台的 3D 图形渲染引擎。自 2001 年诞生以来,OGRE 凭借其强大的功能和灵活的架构,在众多领域得到了广泛应用。从游戏开发到虚拟场景构建,从教育软件到科学可视化,OGRE 已成为开发者实现创意的得力助手。
在游戏开发领域,OGRE 更是展现出独特的优势。比如一些独立游戏开发者,利用 OGRE 打造出风格各异、充满创意的游戏作品,以相对较低的成本实现了高质量的 3D 游戏画面。在 VR(虚拟现实)和 AR(增强现实)应用中,OGRE 同样表现出色,为用户带来沉浸式的虚拟体验。
二、学习 OGRE 前的准备
在正式开启 OGRE 学习之旅前,我们需要做好一些准备工作,包括搭建合适的开发环境以及了解 OGRE 的基本概念。这些准备工作将为我们后续的学习和实践打下坚实的基础,让我们能够更加顺利地掌握 OGRE 的开发技巧。
(一)环境搭建
- 下载安装 OGRE SDK:首先,前往 OGRE 官方网站(http://www.ogre3d.org/download/sdk )下载适合你操作系统和开发工具的 OGRE SDK 安装包 。以 Windows 系统为例,下载完成后,双击安装包进行安装,按照安装向导的提示,选择安装路径等选项,完成 SDK 的安装。
- 配置开发环境(以 Windows + Visual Studio 为例):
-
- 设置环境变量:安装完成后,需要设置环境变量。右键点击 “此电脑”,选择 “属性”,在弹出的窗口中点击 “高级系统设置”,然后在 “系统属性” 窗口中点击 “环境变量”。在 “用户变量” 或 “系统变量” 中新建一个变量,变量名设为 “OGRE_HOME”,变量值为你安装 OGRE SDK 的路径,例如 “C:\OgreSDK” 。这样,系统就能够找到 OGRE 相关的文件和库。
-
- 添加依赖库路径:打开 Visual Studio,创建一个新的 C++ 项目。右键点击项目,选择 “属性”,在 “属性页” 中进行如下设置:
-
-
- C/C++ -> 常规 -> 附加包含目录:添加 OGRE SDK 的头文件目录,如 “\((OGRE_HOME)\include”、“\)(OGRE_HOME)\include\OIS”、“\((OGRE_HOME)\include\OGRE”以及“\)(OGRE_HOME)\boost_1_XX”(XX 为 Boost 库的版本号) 。这些目录包含了 OGRE 开发所需的各种头文件,让编译器能够找到相关的函数和类定义。
-
-
-
- 链接器 -> 常规 -> 附加库目录:添加 OGRE SDK 的库文件目录,如 “\((OGRE_HOME)\lib\\)(ConfigurationName)” 和 “\((OGRE_HOME)\boost_1_XX\lib” 。这里的“\)(ConfigurationName)” 会根据你选择的 Debug 或 Release 配置自动替换为相应的目录,确保链接器能够找到 OGRE 的库文件。
-
-
-
- 链接器 -> 输入 -> 附加依赖项:根据你的配置(Debug 或 Release),添加相应的 OGRE 库文件,如 Debug 配置下添加 “OgreMain_d.lib”、“OIS_d.lib” 等,Release 配置下添加 “OgreMain.lib”、“OIS.lib” 等 。这些库文件包含了 OGRE 的功能实现代码,链接器将它们链接到你的项目中,使你的程序能够使用 OGRE 的各种功能。
-
- 测试环境配置:完成上述配置后,可以编写一个简单的测试程序来验证环境是否搭建成功。例如,创建一个包含基本 OGRE 初始化和场景创建代码的程序:
#include <OgreRoot.h>
#include <OgreSceneManager.h>
#include <OgreCamera.h>
#include <OgreViewport.h>
#include <OgreEntity.h>
#include <OgreSceneNode.h>
int main()
{
// 创建OGRE根对象
Ogre::Root root("plugins.cfg");
// 加载渲染系统插件
root.loadPlugin("RenderSystem_Direct3D9");
// 设置资源路径
Ogre::ResourceGroupManager::getSingleton().addResourceLocation("media", "FileSystem", "General");
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
// 获取渲染系统并设置为窗口模式
Ogre::RenderSystem* rs = root.getAvailableRenderers()[0];
root.setRenderSystem(rs);
rs->setConfigOption("Full Screen", "No");
// 初始化根对象并创建渲染窗口
root.initialise(true, "My Ogre Window");
// 创建场景管理器
Ogre::SceneManager* sceneMgr = root.createSceneManager(Ogre::ST_GENERIC);
// 创建相机
Ogre::Camera* camera = sceneMgr->createCamera("MainCamera");
camera->setPosition(Ogre::Vector3(0, 0, 500));
camera->lookAt(Ogre::Vector3(0, 0, -300));
camera->setNearClipDistance(5);
// 创建视口
Ogre::RenderWindow* window = root.getRenderTarget("My Ogre Window");
Ogre::Viewport* viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth()) / Ogre::Real(viewport->getActualHeight()));
// 创建实体和场景节点
Ogre::Entity* entity = sceneMgr->createEntity("Robot", "robot.mesh");
Ogre::SceneNode* node = sceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(entity);
// 开始渲染循环
while (window->isActive())
{
root.renderOneFrame();
}
return 0;
}
编译并运行这个程序,如果能够成功显示出一个包含 3D 模型的窗口,说明你的 OGRE 开发环境已经搭建成功。
(二)了解基本概念
- 场景管理器(SceneManager):场景管理器是 OGRE 中非常重要的一个概念,它负责组织和管理整个场景中的所有元素 。可以把它想象成一个舞台的管理者,舞台上的演员(实体)、道具(场景节点)、灯光以及观众的视角(摄像机)等都由它来协调和管理。OGRE 提供了多种类型的场景管理器,如通用场景管理器(ST_GENERIC)适用于大多数通用场景;八叉树场景管理器(OctreeSceneManager)则更适合处理大规模的静态场景,通过八叉树的数据结构来优化场景的渲染和物体的查找等操作 。不同的场景管理器有不同的特点和适用场景,开发者可以根据项目的需求选择合适的场景管理器。
- 场景节点(SceneNode):场景节点是用来连接物体到场景中的载体 。它本身并不直接显示在场景中,但它包含了位置、方向、缩放等信息,这些信息决定了连接到它上面的物体在场景中的位置和姿态 。可以把场景节点看作是一个挂钩,我们可以把实体、灯光、其他场景节点等挂在这个挂钩上。例如,在一个游戏场景中,我们可以创建一个场景节点来代表角色的手,然后将武器实体连接到这个场景节点上,当角色的手移动或旋转时,武器也会跟着一起移动和旋转,因为它们共享同一个场景节点的变换信息。而且,场景节点可以相互连接形成父子关系,形成一个层次结构,方便对复杂场景进行管理和组织。
- 实体(Entity):实体是场景中真正能够被渲染的物体,它通常由三维网格(Mesh)和材质(Material)组成 。三维网格定义了物体的几何形状,比如一个立方体、一个球体或者一个复杂的人物模型等;材质则决定了物体的外观,包括颜色、纹理、光泽度等属性 。例如,在一个虚拟城市的场景中,建筑物、车辆、树木等都可以作为实体存在。每个实体都需要连接到一个场景节点上,才能在场景中被正确渲染。
- 摄像机(Camera):摄像机决定了我们观察场景的视角 。它就像是我们在现实世界中的眼睛,通过设置摄像机的位置、方向和视野范围等参数,可以控制看到的场景内容和效果 。在 OGRE 中,我们可以创建多个摄像机,以实现不同的观察视角,比如在游戏中,可以有第一人称视角的摄像机,让玩家以角色的视角进行游戏;也可以有第三人称视角的摄像机,方便玩家观察角色的整体动作和周围环境。摄像机的位置和方向可以根据游戏逻辑或用户操作实时改变,从而实现场景的动态观察。
- 灯光(Light):灯光用于照亮场景,为场景增添真实感和氛围 。OGRE 支持多种类型的灯光,如点光源(PointLight),它向四面八方发射光线,就像一个灯泡一样;聚光灯(SpotLight),它发射出锥形的光线