先决条件:

1.本范例假设你能够设置和编译一个OGRE应用程序,具体方法见设置方法,并且具备一定的

C++语言编程基础。

2.本范例是基于OGRE WIKI 框架程序的。

开始工作:

创建一个工程,命名为Tutorial,这里采用 Visual Studio 2010,加入下列文件
BaseApplication.h
BaseApplication.cpp
TutorialApplication.h
TutorialApplication.cpp

我们只对于 TutorialApplication.cpp中的createScene()成员函数进行操作

如下所示:
#include "TutorialApplication.h"TutorialApplication::TutorialApplication(void)
{}TutorialApplication::~TutorialApplication(void)
{}//-------------------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{// Set the scene's ambient lightmSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f));// Create an EntityOgre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");// Create a SceneNode and attach the Entity to itOgre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");headNode->attachObject(ogreHead);// Create a Light and set its positionOgre::Light* light = mSceneMgr->createLight("MainLight");light->setPosition(20.0f, 80.0f, 50.0f);
}#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif#ifdef __cplusplus
extern "C" {#endif#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#elseint main(int argc, char *argv[])
#endif{// Create application objectTutorialApplication app;try {app.go();} catch( Ogre::Exception& e ) {#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR| MB_TASKMODAL);
#elsestd::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl;
#endif}return 0;}#ifdef __cplusplus
}
#endif
编译运行之后效果如下:
这是一个简单的场景,里面有一个物体,可以通过WSAD按键进行简单的漫游,按Esacpe键可以退出
关于工程配置的一些说明:
当我们运行一个OGRE工程的时候,我们需要把DLL文件,以及.cfg配置文件,移动到与生成的exe文件同一
目录下,比如在Visual Studio 2010下,[ProjectFolder]\bin\release或者[ProjectFolder]\bin\debug
注意:
.cfg文件可能需要修改,使得它们的配置指向的资源文件的路径是正确的,非常重要!
在exe文件目录下至少需要包含 resources.cfg 和 Plugins.cfg。
前者告诉OGRE采用何种渲染引擎(比如D3D或者OpenGL),后者注明使用到的资源(材质textures, 实体meshes, 脚本scripts)等等
它们都是文本文件,可以直接编辑修改。
如果配置不正确,可能出现找不到动态链接看,或者找不到资源的错误!
比如

Description: ../../Media/packs/OgreCore.zip - error whilst opening archive: Unable to read zip file
这就说明找不到资源文件的所在,需要配置resources.h文件

OGRE的基本工作方式:

这是一个非常宽泛的话题,我们通过“场景管理器SceneManagers ”,引入实体Entities 和场景结点SceneNodes的概念,它们是一切的基础
场景管理器 SceneManager
 所有屏幕上看到的东东都被它所管理,它会记录所有出现的东西的位置locations,当你创建相机camerers来观看场景
的时候呢,场景管理器会追踪这些物体。当你创建平面,光照等的时候,场景管理器也会跟踪它们
有许多种类的场景管理器,有的负责渲染地形,有的负责渲染BSP地图,随着逐步深入会一步步介绍
实体 Entity 
代表一个被渲染在屏幕上的东西,光照,粒子,相机,等都是实体
实体不能单独存在,必须与场景结点结合attach,才能拥有位置和方向信息
场景结点 SceneNode 
场景结点跟踪所有的与其关联的物体,当你创建一个实体Entity的时候,只有与场景结点关联以后,方能被
渲染到屏幕上,一个场景结点可以被任意数量的实体关联。
创建一个场景结点 -> 创建一个实体并与场景结点关联 ->创建一个光线并与场景结点关联 -> 
场景结点可以与其它的场景结点关联,形成一个整体的层次结构
一个非常重要的事情是:场景结点的位置永远都是针对它的父场景结点的!
OGRE里面的"Hello World"
我们来回顾一下上面的第一个应用程序
在createScene()函数里面
首先我们加入一个环境光线
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f));
mScenMgr就是我们的场景管理器,调用设置环境光函数

然后我们创建一个实体

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");

第一个参数是实体的名称,每个东西必须有一个独一无二的名称,后一个参数是实体的文件来源

重复一遍目前我们使用的是OGRE范例里的资源
每一个场景管理器都包含一个root场景结点,我们创建一个子结点并“贴上去”
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");

同样的,结点也需要一个名称

好了,把实体跟结点关联起来
headNode->attachObject(ogreHead);
我们加入一个光源light
Ogre::Light* light = mSceneMgr->createLight( "MainLight" );
设置光源的位置
light->setPosition(20, 80, 50);
好了我们可以看到实际情况了
一个重要的问题,坐标系和向量
x轴从左往右,y轴从下往上,z轴从进入显示器到出显示器
我们刚才创建的物体就在(0, 0, 0)这个位置上
创建一个新的物体:
在有了坐标系基础之后,我们继续添加新的物体,在原有的程序上继续进行修改
Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );
是不是和之前看到的程序很像呢?就不在赘述了,不同之处在于,初始位置变化了
Entity类具有很好的扩展性,我们可以设置 Entity::setVisible  and  Entity::isVisible来 使其可见或者不可见
你不需要销毁什么,getName函数可以返回实体的名称,getParentSceneNode可以返回它所关联的结点
SceneNode类就非常复杂了,可以通过 getPosition and setPosition来设置场景结点的位置
通过translate函数对其进行移动。除了管理位置本身以外,它还管理着放大缩小与旋转,你可以通过 pitch, yaw, 和roll
函数来以三个坐标轴进行旋转操作,你可以使用 resetOrientation函数来使所有的旋转失效。 setOrientation ,getOrientation和 rotate
函数可以帮助我们进行更为复杂的变换操作。
  numAttachedObjects ,  getAttachedObject,   detachObject和   detachAllObjects ,可以对结点上的物体进行操作
如果我们把刚才的代码做一些修改
把这几句
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );

改为

Ogre::SceneNode* headNode2 = headNode->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );

那么第二个结点就成为了第一个结点的子结点,如果执行

headNode2->translate( Ogre::Vector3( 10, 0, 10 ) );
移动的只有第二个结点,but
如果执行
headNode->translate( Ogre::Vector3( 25, 0, 0 ) );
两个结点都会一起移动
解释一下:
场景根结点的位置永远都是(0, 0, 0)世界坐标系
headNode 起始位置是(0, 0, 0),移动(25, 0, 0),那么现在的位置是(25, 0, 0)
headNode2 是它的子结点那么它的位置是(0, 0, 0) + (25, 0, 0) + (100, 0, 0)
这就是OGRE的一个非常重要的核心,结点的层次结构性,这对于开发来说是一个非常重要的概念!
缩放的范例
mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");
headNode->attachObject(ogreHead);headNode->scale( .5, 1, 2 ); Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );headNode2->scale( 1, 2, 1 );
旋转的范例
mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");
headNode->attachObject(ogreHead);headNode->yaw( Ogre::Degree( -90 ) );Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );headNode2->pitch( Ogre::Degree( -90 ) );Ogre::Entity* ogreHead3 = mSceneMgr->createEntity( "Head3", "ogrehead.mesh" );
Ogre::SceneNode* headNode3 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode3", Ogre::Vector3( 200, 0, 0 ) );
headNode3->attachObject( ogreHead3 );headNode3->roll( Ogre::Degree( -90 ) );

注意VS2010下 degree可能没有声明,使用名空间Ogre::Degree
OGRE环境的信息MORE
大部分的 (.DLL and .CFG) 可以在ogre sdk的bin目录下找到

DLLs and Plugins 关于库文件和插件的介绍

OGRE主要包括三个部分main library, plugins 和 third-party libraries.

Main library

必须被包含的库 OgreMain.dll和其它的比如 cg.dll

Plugins

你可以在需要或者不想使用的时候打开或者关闭第三方插件,Ogre中文件名以 "Plugin_" 开头的就是插件文件

Ogre同样的采用插件进行渲染,比如D3D或者OpenGL,它们以RenderSystem_开头。例如,当你需要写
一些shaders相关的OpenGL东西,但是你需要在运行D3D的环境下跑程序时,就可以关闭这些渲染特性

Third party libraries and helper libraries

Ogre本身并不包含比如GUI,I/O,物理引擎等东西,它只是一个绘图引擎,你可以使用其它第三方库来进行操作
ogre的demos里面包含了如下的第三方库:
1.键盘和鼠标采用 OIS库,OIS.dll
2. CgProgramManager使用了Cg.dll
可以再Ogre官方Wiki或者论坛上看一看其它的插件或者是库文件
关于配置文件
Ogre使用了若干配置文件,它们控制着插件的加载,资源的加载以及其它。我们简单地来看一下这些配置文件都
做了些什么
plugins.cfg: 这个文件包含了你的程序所需要的插件,如果你想添加或者去掉插件,需要通过修改这个文件来完成
删除插件,只需要将相应的行删除,或者通过在前面加一个"#"来注释掉。添加插件,你需要重写一行,"Plugin=[PluginName]"
类似这样的形式,注意不要添加dll后缀。可以通过改变"PluginFolder"变量来改变Ogre寻找插件的位置,可以使用绝对和相对
路径,但不可以使用环境变量。
resources.cfg:这个文件包含了Ogre寻找资源的目录的列表,主要资源包含脚本scripts,meshes,textures等等。可以使用
绝对或者相对路径,不可以使用环境变量。注意Ogre是不会扫描子目录的,必须手动进行添加。比如,你需要同时添加 "res\meshes" 
和 "res\meshes\small"。
media.cfg:这个文件告诉Ogre一些细节性的关于资源的东西,现在暂时不讨论关于它的问题。
ogre.cfg:这个文件由Ogre的配置屏幕生成,这个文件不是通用的,只针对你个人的机器环境而言
quake3settings.cfg:这个文件被BSPSceneManager所使用,当使用这种SceneManager的时候才有用
以上是配置文件的一些介绍,Ogre至少需要找到"plugins.cfg", "resources.cfg", 和"media.cfg"才能够正常运行
在以后的教程中我们会继续介绍关于它的信息
总结
我们在本教程中接触到了场景管理器SceneManager,场景结点SceneNode,实体Entity 类。通过以后的教程我们会进一步熟悉它们的使用

OGRE 引擎官方基础教程 (一)相关推荐

  1. 计算机一级幻灯片版式,ppt2010官方基础教程:添加不同版式幻灯片-powerpoint技巧-电脑技巧收藏家...

    ppt2010官方基础教程:添加不同版式幻灯片 输入一些文本 启动 PowerPoint 时,将会显示要作为演示文稿封面的幻灯片. 将作为封面的幻灯片称为"标题幻灯片". 让我们在 ...

  2. 【Graph】NetworkX官方基础教程:图的生成与相关操作

    NetworkX官方基础教程:图的生成与相关操作 1. Graph生成和graph操作 2. 分析图 3. 画图 参考资料 本文作为对图结构和复杂网络的快速上手,内容包括基于NetworkX进行图的生 ...

  3. 阮一峰:jQuery官方基础教程笔记

    原文地址:http://www.jobbole.com/entry.php/1151 jQuery是目前使用最广泛的javascript函数库. 据统计,全世界排名前100万的网站,有46%使用jQu ...

  4. php单独使用blade模板引擎,laravel 基础教程 —— Blade 模板引擎

    Blade 模板引擎 简介 Blade 是 laravel 提供的一个简单强大的模板引擎.它不像其他流行的 PHP 模板引擎那样限制你在视图中使用原生的 PHP 代码,事实上它就是把 Blade 视图 ...

  5. v8引擎处理html,JavaScript V8引擎基础教程

    本篇教程介绍了JavaScript V8引擎基础教程,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构 ...

  6. PyQt5随笔:PyQt5 官方网站文档、一些基础教程网站和书籍推荐

    PyQt5随笔:PyQt5 官方网站文档.一些基础教程网站和书籍推荐 文章目录 PyQt5随笔:PyQt5 官方网站文档.一些基础教程网站和书籍推荐 1. 官方网站文档 2.基础教程网站(点击标题即可 ...

  7. Atmega2560基础教程(2)——Atmega常用官方库及常用语句

    Atmega2560基础教程(2)--Atmega常用官方库及常用语句 在开始正式开始编写Atmega2560代码之前,我们先来了解一下Atmega系列芯片比较独特的寄存器配置方式,以及会常用到的官方 ...

  8. Ogre基础教程3:地形,天空,烟雾

    本教程将专注于在一个场景中渲染地形. 我们将涉及到需要被完成的基本设置,并且将介绍地形光照的使用. 我们也会给出对使用天空盒(Skyboxes).天空穹顶(Skydomes)以及天空面(Skyplan ...

  9. 虚幻引擎VR游戏开发基础教程

    虚幻引擎VR游戏开发基础教程 了解如何使用 Oculus Quest 2 的蓝图在虚幻引擎 4 中从头开始构建基本的 VR 机制 课程英文名:Unreal Engine VR Development ...

最新文章

  1. Python培训分享:python爬虫可以用来做什么?
  2. ASP.NET编程中常用到的27个函数集
  3. 1. CMake 系列 - 从零构建动态库和静态库
  4. ionic助手 v1.9.0 一键式开发环境工具(告别命令行,超强功能)
  5. xyz坐标图_“色觉地图”的建立(二):辐照度与亮度、rgb空间、“颜色图”的混色方式...
  6. Bifrost微前端框架及其在美团闪购中的实践
  7. 信息学奥赛一本通(1248:Dungeon Master)
  8. Exp-00009错误解決
  9. 2017.8.8 loli测试
  10. Linux查看分区文件系统类型总结
  11. 第三周学习《对象与类》心得
  12. C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客
  13. 对称密码(共享秘钥密码)
  14. curl上传文件到服务器命令,linux curl上传文件到服务器
  15. Android 开机Logo、铃声、震动修改方案
  16. Shopee数据获取逻辑
  17. mysql是网状_三种数据模型---层次模型、网状模型以及关系模型
  18. 母亲的牛奶(dfs)
  19. 万字拿下leetcode线性数据结构
  20. 点击a标签,返回上一页

热门文章

  1. java继承关键字extends
  2. IDEA 利用MySQL驱动连接数据库
  3. 什么降风噪最好的蓝牙耳机?2021主动降噪耳机推荐
  4. 【IP技术】ipv4和ipv6是什么?
  5. 有一分数序列,2/1, 3/2, 5/3, 8/5, 13/8, 21/13,……,请编程求出这个数列的前20项之和。
  6. 5.Serializer,ModelSerializer区别
  7. EXCEL 数据分析基础知识
  8. 如何更改linux下的Apache端口号
  9. 宝哥面试题分享(07): Java中间件面试题
  10. GMM / MoG 聚类 Matlab 可视化 实现