单击此处添加标题

Similar documents
untitled

untitled

无类继承.key

FY.DOC

OGRE简介


Microsoft Word - CX1000-HMI_程序开发_PLC通讯

untitled


SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

Microsoft PowerPoint - 第一讲 概论.ppt

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

RAGE来咯!关于 ID TECH 5 MEGATEXTURE 的一些技术信息更新

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

Ogre 3D 1.7 入门指南


Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

中華民國九十三年 月 日

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Microsoft Word - 11.doc

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

手册 doc

第 5 期 吴 拥 民 : 三 维 引 擎 软 件 体 系 结 构 模 型 101 3D 引 擎 分 为 实 时 3D 引 擎 和 离 线 3D 引 擎 实 时 3D 引 擎 能 用 PC 机 及 游 戏 机 即 时 计 算 出 实 时 3D 画 面, 用 多 边 形 表 示 3D 模 型, 任 何

用户大会 论文集2.2.doc

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

藍牙網路在資訊家電的應用

Microsoft Word - ch04三校.doc

Microsoft Word - 01.DOC

Converting image (bmp/jpg) file into binary format

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

6 2 2 MMO 1 Arcade 2 iphone 4 1 Blog [Monkey Potion] 02

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

untitled

上海市教育考试院关于印发新修订的

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

新版 明解C++入門編

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

绘制OpenCascade中的曲线

概述

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

CGAL的安装编译

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

7 2 2 MMO 1 Arcade 2 iphone 4 2 [Monkey Potion]

提问袁小兵:

投影片 1

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

epub83-1

. Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像

ebook

Microsoft Word zw


目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1

入 指 令 如 : 鍵 盤 鼠 標 多 點 觸 控 重 力 感 應 陀 螺 儀 等 4. 圖 形 用 戶 接 口 掌 握 引 擎 API 中 GUI 與 GUILayout 類 中 方 法 和 變 量 的 使 用, 能 夠 通 過 GUI Skin 為 應 用 的 界 面 定 制 不 同 風 格 主

嵌入式系统实验报告之一

0 配置 Host MIB 设备 V ( 简体版 ) 0 Update: 2016/1/30

册子0906

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Guava学习之Resources

Microsoft Word - 新1-12.doc

(Microsoft Word - \272\364\263q\245|\244A_ _\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

<4D F736F F D20C9CFBAA3CAD0BCC6CBE3BBFAB5C8BCB6BFBCCAD4C8FDBCB6BFBCCAD4B4F3B8D95FBDA8D2E9B8E55F5F E646F63>

EK-STM32F

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

软件工程文档编制

untitled

拦截器(Interceptor)的学习

1.5招募说明书(草案)

Microsoft Word - 第1章 Android基本概念.docx

Microsoft Word - 放榜用-105無口試放榜電子榜單_NEW_.doc

untitled

文档 3

主動學習快樂玩,韻文詩歌我在行

文 学 蓝 皮 书 迅 冯 俐 崔 涛 等 任 副 主 席, 徐 迅 任 秘 书 长 中 国 煤 矿 作 协 成 立 已 30 年, 1983 年 成 立 之 初 为 中 国 煤 矿 文 学 研 究 会, 1995 年 更 名 为 中 国 煤 矿 作 协 煤 炭 系 统 的 作 家 和 广 大 文

(Microsoft Word - 03\300\243\244p.doc)

「強化學生升學與就業競爭力輔導方案」成果報告表

教育部高等学校教学

RunPC2_.doc

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

《大话设计模式》第一章

标题

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

FileMaker 16 ODBC 和 JDBC 指南

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

成都理工大学地球科学学院测绘工程系


可 Web 编程的NativeUI 设计与实现

bingdian001.com

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s

专注于做最好的嵌入式计算机系统供应商

1-1 database columnrow record field 不 DBMS Access Paradox SQL Server Linux MySQL Oracle IBM Informix IBM DB2 Sybase 1-2

Transcription:

OGRE 浅析

网上资源 http://sourceforge.net/projects/ogre/ http://www.ogre3d.org/( 官方网站 )

OGRE LOGO

OGRE 简介 本次课程的主要内容 OGRE 的安装 如何用 OGRE 来进行应用程序的开发

OGRE 简介 OGRE: Object-Oriented Graphics Rendering Engine ( 面向对象的图形渲染引擎 ) C++ 开发面向对象且使用灵活的 3D 引擎 目的 : 让开发者方便和直接开发基于 3D 硬件设备的应用程序或游戏 引擎中的类库对更底层的系统库 ( 如 : Direct3D 和 OpenGL) 的细节进行了抽象, 并提供了基于现实世界对象的接口和其它类

OGRE 简介 这部分主要介绍 : OGRE 特点 OGRE 中的模块

OGRE 特点 效率特性 简单 易用的面向对象接口设计能更容易渲染 3D 场景, 并使实现产品独立于渲染 API( 如 Direct3D/OpenGL/Glide 等 ) 可扩展的程序框架 (framework) 自动处理常见的需求, 如渲染状态管理, hierarchical culling, 半透物体排序等 清晰 整洁的设计加上全面的文档支持

OGRE 特点 平台和 3D API 支持 支持 Direct3D 和 OpenGL 支持 Windows 平台, 用 Visual C++ 6( 或 Visual C++.Net) 和 STLport 来编译 支持 Linux 平台, 用 gcc 3+( 或 gcc 2.9x) 和 STLport 来编译 材质 /Shader 支持 支持从 PNG JPEG 或 TGA 这几种文件中加载纹理 ; 自动产生 MipMap; 自动调整纹理大小以满足硬件需求 支持可程序控制的纹理坐标生成 ( 如环境帖图 ) 和转换 ( 平移 扭曲 旋转 ) 材质可以拥有足够多的纹理层, 每层纹理支持各种渲染特效, 支持动画纹理 自动应用多通道渲染和多纹理, 从而大幅度提高渲染质量 支持透明物体和其它场景级别的渲染特效 通过脚本语言可以不用重新编译就设置和更改高级的材质属性

OGRE 特点 网格 Meshes 高效的网格数据格式 提供插件支持从 Milkshape3D 导出 OGRE 本身的.mesh 和.skeleton 文件格式 支持骨骼动画 ( 可渲染多个动画的组合 ) 支持用 Bezier 样条实现的曲面

OGRE 特点 场景特性 拥有高效率和高度可配置性的资源管理器, 并支持多种场景类型 使用系统默认的场景组织方法, 或通过亲自编写插件使用自己的场景组织方法 通过包围体 ( 如包围盒 ) 实现视域裁剪 提供的二叉树场景管理器插件可加速室内场景的渲染, 支持加载 Quake3 关卡和 shader 脚本分析 优秀的场景组织体系 ; 场景结点支持物体的附属 ( attach), 并带动附属物体一起运动, 实现了类似于关节的运动继承体系

OGRE 特点 特效 粒子系统包括可以通过编写插件来扩展的粒子发射器 (emitter) 和粒子特效影响器 (affector) 通过脚本语言可以不用重新编译就设置和更改粒子属性 支持并自动管理粒子池, 从而提升粒子系统的性能 支持天空盒 天空面和天空圆顶, 使用非常简单 支持 Billboard, 以实现特效 自动管理透明物体 ( 系统自动帮你设置渲染顺序和深度缓冲 )

OGRE 特点 其它特性 资源管理和文档加载 (ZIP PK3) 支持高效的插件体系结构, 它允许你不重新编译就扩展引擎的功能 运用 'Controllers' 你可以方便地改变一个数值 例如动态改变一个带防护罩的飞船的颜色值 调试用的内存管理器负责检查内存溢出

OGRE 中的模块 OGRE 中由很多模块组成, 每个模块互相配合, 共同实现 OGRE 的强大功能和优秀特性 OGRE 的模块大致可表现为如下结构, 这也基本上是 OGRE 工程文件的结构 : OgreMain PlatformManagers Plugins RenderSystems Tools

OgreMain 模块 场景组织体系 Material 管理 插件动态加载系统 数学支持库 渲染器和几何管道 网格 / 几何实体管理 资源管理 天空 / 背景渲染 公告板系统和粒子系统 日志和异常处理 事件监听器 编解码器和图像加载器 自定义内存管理器 基本动画 骨骼动画 字体渲染 / 字体加载 覆盖 (Overlay) 表面, 二维元素

Win32 平台管理模块 实现了 Windows 平台的基本平台服务 特性 输入管理 配置系统

BSP 场景管理 该插件用 BSP 树和 clusters 提供了室内场景的管理 它可以导入 Quake3 的关卡 特性 BSP 树 关卡导入 Shader 支持

其它模块 文件系统插件 提供在文件系统的文件夹中定位资源的能力 GuiElement 插件 提供标准的二维表面元素, 如文本输入区和边框 OctreeSceneManager 插件 用八叉树管理标准场景 可用它渲染地形

其它模块 ParticleFX 插件 此插件提供了标准的粒子发射器和粒子特效影响器 Direct3D7 渲染系统插件 此插件提供了基于 Direct3D7 的渲染系统 Direct3D9 渲染系统插件 此插件提供了基于 Direct3D9 的渲染系统

其它模块 SDL 渲染系统插件 此插件提供了基于 OpenGL 和 SDL 的渲染系统 3ds2oof 工具 这个工具可以将 3D Studio 的网络文件 (.3ds) 转换成.oof 格式 (OGRE 以前的网络文件格式 ) 这个工具已经被抛弃了 3Dstudio Max 导出器 这是一个 3D Studio MAX( 版本 4 或 5) 的插件, 可以将 3D Studio 的模型数据转换成 OGRE 的.mesh 或.skeleton 格式

其它模块 位图字体创建工具 能过此工具你可以把二进制字体文件转换成 OGRE 的.fontdef 文件 Milkshape3D 导出器 这个工具是 Milkshape3D( 一个建模工具 ) 的插件, 它允许你将模式导出成 OGRE 支持的.mesh 和.skeleton 文件格式 Python 接口 设计这个子工程的目的是以 dll 的形式提供一个接口, 使 Python( 一种脚本语言 ) 可以直接驱动 OGRE, 并且允许 OGRE 直接调用 Python 脚本以实现游戏相关的脚本语言

安装 OGRE 这部分主要介绍 获取 OGRE 支撑环境 编译 OGRE 运行 DEMO OGRE 运行期结构

获取 OGRE OGRE 是一个开放源码项目, 该项目的网址是 ogre.sourceforge.net 在这里可以获取到 OGRE 的最新版本和文档, 此外还可以在论坛上与其它开发者交流

支撑环境 OGRE 是一个比较大的项目, 不可能每个功能都独立完成 OGRE 的编译和使用需要一些其它库作为支撑环境 在 Windows 环境下编译和安装 OGRE 需要如下支撑环境 : STLport4.5.3 DirectX 9 SDK 其它第三方库

编译 OGRE 在 VC6 环境里打开 OGREOGRE 的最新版本的 ogrenew 文件夹下的 Ogre.dsw 工作区文件, 执行 Batch Build 指令, 该指令会自动处理 OGRE 中各个工程的依赖关系, 正确完成全部的编译构建 在 VC7 环境里打开 OGREOGRE 的最新版本的 ogrenews 文件夹下的 Ogre.sln 工作区文件, 执行 Batch Build 指令, 该指令会自动处理 OGRE 中各个工程的依赖关系, 正确完成全部的编译构建

运行 DEMO 在 ogrenew\samples\common\bin\ Debug 下可以看到 Debug 方式编译的全部 DEMO

OGRE 运行期结构 运行完 DEMO 之后, 注意查看 ogrenew\samples\common\bin\debug 文件夹中的内容, 从这里可以看到 OGRE 程序的运行环境 除了 DEMO 的可执行文件外, 该文件夹中还包括如下的动态链接库 :

OGRE 运行期结构 OgreMain.dll OgrePlatform.dll RenderSystem_Direct3D7.dll RenderSystem_Direct3D9.dll RenderSystem_SDL.dll Plugin_GuiElements.dll Plugin_BspSceneManager.dll Plugin_OctreeSceneManager.dll Plugin_FileSystem.dll Plugin_ParticleFX.dll Devil.dll SDL.dll 其它 : 机器上还必须包括 DirectX 8.1 和 STLport 的动态链接库, 一般系统会将它们自动安装到 Windows 系统文件夹下

OGRE 运行期结构 OGRE 的运行还需要如下的配置文件 : ogre.cfg:ogre 的显示模式配置文件 Plugins.cfg: 插件配置文件, 在这里指定插件的路径和插件文件名 上一个表中以 Plugin_ 开头的 dll 文件都是插件, 它们可以放在其它文件夹里, 但必须在本文件里指定路径 resources.cfg: 资源配置文件, 设置资源搜索路径,Zip 文件也作为搜索路径对待 quake3settings.cfg:quake3 地图配置文件 terrain.cfg: 室外地形场景配置文件

OGRE 运行期结构 OGRE 程序的资源路径在 resources.cfg 里指定 OGRE DEMO 的资源都放在 \ogrenew\samples\media 及其下的 Zip 文件里 资源文件包括以下内容 :.skeleton 骨骼动画的骨骼定义文件.particle 粒子模板定义文件.overlay 二维及三维界面定义文件.mesh 模型文件.material 材质定义文件.fontdef 字体定义文件.jpg 图片文件.png 图片文件

准备用 OGRE 开发 从 FrameWork 开始 FrameWork 与实际应用程序的关系 ExampleApplication 类 ExampleFrameListener 类 第一个 3D 程序

FrameWork 假设以 Demo_EnvMapping 工程为例, 观察一下 OGRE 的 Demo 程序的代码结构, 可以发现在本工程中其实只有两个文件 :EnvMapping.h 和 EnvMapping.cpp 查看本工程的 Settings, 在 C/C++ 选项卡中打开 PreProcessor 分类, 可以看到有三个附加包含路径, 其中..\include 是本工程的头文件路径,..\..\Common\include 是 Demo 程序公共的头文件路径,..\..\..\OgreMain\include 是 OGRE 引擎的头文件路径 在..\..\Common\include 中可以发现两个头文件 :ExampleApplication.h 和 ExampleFrameListener.h 这两个文件定义了简单 OGRE 程序的应用框架, 它们封装了简单 OGRE 程序的基本要素和运行过程

FrameWork 与实际应用程序的关系 在创建我们自己的 OGRE 程序时, 只需要继承 OGRE FrameWork 中的类并做少量改动就可以了 OGRE FrameWork 与实际应用的关系如下图所示 : ExampleApplication mframelistener 1 1 ExampleFrameListener myapplication myframelistener

ExampleApplication 类 该类定义了如下数据成员 : // 指向 Root 对象的指针 Root *mroot; // 指向程序中摄像机的指针 Camera* mcamera; // 指向场景管理器的指针 SceneManager* mscenemgr; // 指向 帧监听器 的指针 FrameListener* mframelistener; // 指向渲染窗口的指针 RenderWindow* mwindow;

Root:OGRE 系统的入口点 Root 对象在程序中必须最先创建和最后释放 OGRE 引擎是通过 Root 将其它部分 串 起来的, 通过 Root 对象可以调出配置对话框以配置渲染系统 (RenderSystem); 通过 Root 对象可以获取到引擎其它部分的指针, 如 SceneManager RenderSystem Resource managers 等 ; Root 对象还提供一个 startrendering 方法来开始一个连续渲染过程, 对该方法的调用在 ExampleApplication 类中就可以见到

Camera: 摄象机 渲染结果实际上就是摄象机最后 看 到的结果

SceneManager: 场景管理器 普通场景 室外封闭场景 室外无限场景和室内场景 : enum SceneType { ST_GENERIC, ST_EXTERIOR_CLOSE, ST_EXTERIOR_FAR, ST_INTERIOR }; 室内场景采用 BSP 场景管理方式, 室外场景采用八叉树场景管理方式 初学者使用 ST_GENERIC 普通场景类型 对于复杂室内和室外场景,OGRE 分两部分 : 基本上固定不变的 世界, 对于这部分采用 BSP 或 Octree 等特殊算法提高渲染效率 ; 场景中的可移动物体, 它们的创建和控制需要开发人员自己来完成

FrameListener: 帧监听器 监听最终用户的控制信息 ( 鼠标 键盘 遥控杆等 ), 对摄象机 场景物体等进行控制.

RenderWindow: 渲染窗口 渲染结果所在的窗口, 其中包括渲染真正的目的地 : 视口 Viewport

启动 OGRE // 继承自 ExampleApplication 类 EnvMapApplication app; try { app.go(); } catch( Exception& e ) { }

启动 OGRE // 启动引擎 virtual void go(void) { if (!setup()) return; mroot->startrendering(); }

go 函数 virtual void go(void): 该函数是 ExampleApplication 类除构造和析构函数以外唯一的 public 函数, 它一调用, 程序就正式开始运行了 代码如下 : virtual void go(void) { if (!setup()) return; mroot->startrendering(); } 从代码可以看出, 先调用 setup( ) 函数完成渲染前的准备, 如果 setup 成功, 就由 mroot 调用 startrendering() 开始渲染, 如果不成功则退出

setup 函数 Setup 函数完成一个 OGRE 应用程序的开始渲染前的准备工作 实际步骤如下 : 首先创建 Root 类的对象 加载资源路径 setupresources(void ) 弹出 config 对话框, 配置 RenderSystem 选择场景管理器类型 创建并初始化摄像机 创建窗口中的视口 创建场景 创建帧监听器

setup 函数代码 步骤的代码如下 : virtual bool setup(void) { mroot = new Root(); // 首先创建 Root 类的对象 setupresources(); // 加载资源路径 bool carryon = configure(); // 弹出 config 对话框, 配置 RenderSystem if (!carryon) return false; choosescenemanager(); // 选择场景管理器类型 createcamera(); // 创建并初始化摄像机 createviewports(); // 创建窗口中的视口 // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipMaps(5); createscene(); // 创建场景 createframelistener(); // 创建帧监听器 return true; }

setup 函数 至此,setup() 函数结束, 它已完成渲染之前的全部准备工作, 接下来就由 Root 对象调用 startrendering() 函数指挥渲染系统开始连续的渲染过程

OGRE 消息处理机制 消息机制的设计一般总要设计到三个部分 : 消息的产生 消息的传递和消息的处理 OGRE 中的消息处理者的抽象类主要是 listener 类, 而 listener 必须是对应特定的 target 的, 所以可以认为是由 listener 和 target 两个抽象类组成 而消息传递由 Dispatcher 和 Processor 组成

FrameListener FrameListener 类中有两个很重要的虚函数 framestarted 和 frameended class _OgreExport FrameListener { public: // 帧渲染之前的事件处理方法 virtual bool framestarted(const FrameEvent& evt) { return true; } // 帧渲染之后的事件处理方法 virtual bool frameended(const FrameEvent& evt) { return true; } virtual ~FrameListener() {} }

ExampleFrameListener ExampleFrameListener 继承自 FrameListener 它包装实现了一个帧监听器常用的功能 OGRE 对事件的处理方法有两种模式, 立即模式和缓冲模式 ExampleFrameListener 中有一个 meventprocessor 变量, 它是用来处理缓冲模式的事件的 而在默认的非缓冲模式中, ExampleFrameListener 实现了基本输入操作 如 : 键盘 WASD 控制视点前后左右移动, 鼠标控制视点的旋转等等

EventProcessor EventProcessor 类继承了 FrameListener 类, OGRE 引擎自动在每帧前调用 EventProcessor 的 framestarted 函数 EventProcessor 类还继承了 KeyTarget, MouseTarget,MouseMotionTarget 作为消息传送目标的 EventProcessor, 因此才有可能处理这些消息

键盘消息处理机制 InputEvent EventTarget Event Listener EventTarget* msource virtual processkeyevent()=0 ismulticaster KeyEvent KeyTarget KeyListener int mkey processkeyevent() add/remove KeyListener KeyXX(KeyEvent)=0 Event Target Listener

EventProcessor 的设置 // 创建一个 EventProcessor meventprocessor = new EventProcessor(); // 初始化 meventprocessor->initialise(win); // 开始处理消息 meventprocessor->startprocessingevents(); // 将 ExampleFrameListener 作为按键消息的监听者注册 meventprocessor->addkeylistener(this);

EventProcessor 的运行 bool EventProcessor::frameStarted(const FrameEvent& evt) { minputdevice->capture(); while (meventqueue->getsize() > 0) { InputEvent* e = meventqueue->pop(); processevent(e); delete e; } return true; }

第一个 3D 程序 OGRE 的应用框架中定义好了 ExampleApplication 与 ExampleFrameListener 类, 已封装了 3D 应用程序的全部要素, 应用开发者所要做的工作主要有 2 点 : 派生出自己的应用程序类, 重新实现 createscene 函数以创建场景 派生出自己的监听器类, 如果需要的话, 重新实现 framestarted 函数以进行特殊的输入控制和动画控制

第一个 3D 程序 打开 Demo_EnvMapping 工程, 这是一个非常简单易懂的程序实例 这个程序只有两个文件 EnvMapping.h 和 EnvMapping.cpp EnvMapping.h 文件定义了 ExampleApplication 类的派生类 EnvMapApplication, 并重新实现了 createscene 函数创建出一个亮闪闪的具有环境帖图的食人魔头像

class EnvMapApplication : public ExampleApplication { public: EnvMapApplication() {} protected: // 重新实现 createscene 函数, 创建实际场景 void createscene(void) { // 设置环境光 mscenemgr->setambientlight(colourvalue(0.5, 0.5, 0.5)); // 创建点光源 l Light* l = mscenemgr->createlight("mainlight"); // 设置点光源 l 的位置, 缺省颜色为白色 l->setposition(20,80,50); // 读入 ogrehead.mesh 模型文件, 创建为一个 Entity Entity *ent = mscenemgr->createentity("head", "ogrehead.mesh"); // 设置食人魔 Entity 的材质为指定材质 ( 环境贴图 ) ent->setmaterialname("examples/envmappedrustysteel"); // 将食人魔 Entity 连接到场景根节点上 mscenemgr->getrootscenenode()->createchild()->attachobject(ent); } };

第一个 3D 程序 一个基本的场景包括光 摄象机和模型等 ExampleApplication 类中创建了缺省摄象机 ( 见 FrameWork 部分 ) 每个模型文件载入后被创建成 Entity 为了便于对场景的管理,OGRE 引入了场景节点的概念, 所有场景节点组合成一棵节点树, 全部 Entity 挂在这棵节点树中的不同节点上 场景管理器 mscenemgr 通过对节点树的操控来完成对场景物体的操控 场景建立好之后, 接下来处理应用程序的入口问题, 这部分代码在 EnvMapping.cpp 里.

EnvMapping 程序

课后工作 安装 OGRE 熟悉 OGRE 的变换和光照部分 熟悉 OGRE 的文件格式和场景管理模式 预习 OGRE 中的纹理映射