ogre引擎:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架来源: 发布时间:星期四, 2009年2月12日 浏览:300次 评论:0
这是意念自己 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 文过 3月 ![]() ![]() ![]() ![]() ![]() ![]() 关键字和术语: 游戏、 游戏引擎 、高层引擎、规则 、场景、物件、Terrain(地形)、解释器 、Application Framework(应用 ![]() 设计模式(Design Patterns)、 Singleton(单件模式 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Adapter(适配器模式 ![]() ![]() ![]() ![]() ![]() ![]() ![]() Factory(工厂模式 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Thanatos(死本能 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() OGRE(Object-Oriented Graphics Rendering Engine)面向对象图形渲染引擎 Abstract:     The abstraction of game engine is an important question in game programming, and the kernel of the question is “How could we give the game engine more adaptability?” In the paper we attempt to deduce the form which our game engine must be from our daily-lives. With the help of OGRE, I completed the game engine which has the form that we have just deduced.     The major questions of this paper are: First, why we make game engine? Second, how we make a game engine? The first question was answered in Part1, while the second in Part3. And the Preview gives us a theoretic conclusion to the second question. At the end of this paper, we used the game engine which has just been completed to make a simple game.     The  ![]() 摘要: 游戏引擎和框架 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 本文 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 游戏引擎应分为为高层 ![]() ![]() ![]() ![]() ![]() ![]() 目录 绪论 游戏形态和其所决定 ![]() ![]() 电脑游戏 ![]() 被电子竞技 ![]() ![]() ![]() 第 ![]() 引擎概述 高层引擎概述 第 2部分 OGRE图形引擎 ![]() 第 3部分 实作:基于OGRE图形引擎 ![]() 场景系统:OGRE场景体系 ![]() 场景:游戏 ![]() 规则:脚本系统 零件组装:具体游戏层 ![]() 第 4部分 结论和展望 附录 Terrain Example 参考 Preview 游戏形态和其所决定 ![]() ![]() 电脑游戏 ![]() “游戏是先于人类 ![]() ![]() ![]() ![]() “尽管游戏 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() —— ![]() ![]()   人类对于游戏 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 然而 ![]() ![]() ![]() ![]() ![]() 棋牌似乎是所能列举出 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 象棋、军旗和围棋 ![]() ![]() ![]() ![]() ![]() 图0-2 象棋很可能来自于人类对战争 ![]()   现代战略战术类电脑游戏 ![]() ![]() ![]() ![]() ![]() ![]()   图0-3 左: ![]() ![]() ![]() ![]() ![]() 图0-4 左: ![]() ![]() ![]() ![]() ![]() ![]() 图0-5 左: ![]() ![]() ![]() ![]()   最早 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()   图0-6 左:在这台电脑上 ![]() ![]() ![]() 图0-7 左:战术FPS游戏 ![]() ![]() ![]() 图0-8 左:传统图版RPG游戏 ![]() ![]() 图0-9 左:某网络RPG游戏场景截图  右:正在玩图版RPG游戏 ![]() ![]() 而被冠以“暴力”等罪名 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 下面来看看另 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 由上面 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 被电子竞技 ![]() ![]() ![]() 游戏既然是对客观世界 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2是这个世界 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 3世界是 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 游戏作为 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 另 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 通过上面 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 大部分游戏引擎中 ![]() ![]() ![]() ![]() ![]() 而第 2部分 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 3部分 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 4部分 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 本文所主要讨论 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 ![]() 第 ![]() 引擎概述 曾经有 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 近几年 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 1、“渲染和构造3D世界 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2、“内存使用 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3、“模型和动画 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 4、“物理 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 5、“声音系统 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 6、“网络和连线游戏环境” ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 7、“脚本系统” ![]() ![]() ![]() ![]() 8、“人工智能和导航” ![]() 当按照这个思路建立了自己 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 图1-1 基本 ![]() ![]()   ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 高层引擎概述 我们拿2D地图来做 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 图1-2 左边是直接在应用 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()   而在这里我们理解 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 下图是我们使用 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 图1-4 看着很像3DMax ![]() ![]() ![]() 工作室还没有自己 ![]() ![]()   把话题引回来 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 实际上现在大部分引擎都是或多或少地包括了高层引擎部分 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 我们这篇文章 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 现在我们具有 ![]() 图1-4 按照现在 ![]() ![]() ![]() 第 2部分 OGRE图形引擎 ![]() 第 2部分所需所有图片 OGRE(Object-oriented Graphics Rendering Engine ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() OGRE系统主要包括:Render系统和Render插件、Material系统和Material脚本、Entity(主要是物件系统)、GUI系统和Overlay脚本、Texture和图片解码器、Archive系统和文件解码器、Scene插件(主要是地形系统)、粒子系统、日志、Dll动态导入和插件系统等等 ![]() ![]() ![]() ![]() ![]() 下图是Root ![]() ![]() ![]() ![]() ![]() ![]() ![]() 图2-2 OGRE核心部分框图(引用自OGRE ![]() 图2-2是整个OGRE ![]() ![]() ![]() ![]() ![]() ![]() “ Root:整个Ogre系统 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Render ![]() ![]() ![]() ![]() ![]() ![]() ![]() SceneManager:场景管理器 ![]() ![]() ![]() Material:定义场景中几何体 ![]() ![]() Entity:场景中 ![]() ![]() SceneNode:代表位置和方向 ![]() ![]() ![]() ![]() ![]() ![]() Camera:场景中 ![]() ![]() ” 使用OGRE很简单 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 但细细分起来使用Application Framework开发 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 既然Application Framework本身封装 ![]() ![]() 图2-3 Ogre Application Framework 工程 我们从中可以看到高层 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 现在 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 3部分 实作:基于OGRE图形引擎 ![]() 第 3部分所有图片 场景系统:OGRE场景体系 ![]() 首先我们发现 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 要融入OGRE图形系统 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 如何办呢?我们先从表面上来推导 ![]() ![]() ![]() ![]() 在现有 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 如图 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在我们现有 ![]() ![]() ![]() 图3-2 基本 ![]() ![]() 我们把OGRE本身提供 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 图3-3 基本 ![]() ![]() ![]() 在这个划分中 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 场景:游戏 ![]() 场景中 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() OGRE对于地形 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 因此 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Scene ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 利用Adapter模式 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 有关Scene ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 规则:脚本系统 规则系统虽然并不难划分 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 从功能上理解这个系统是 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在做引擎 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 但是这并不表明引擎 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 这里我们 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 脚本分为编译型脚本和解释型教本 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 脚本分析器提供 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()     Index:     Funciton( param1 , “ ![]() 第 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() strCmd = ParseLine ![]() ![]() ![]() ![]() {     doFunction( getIntParam1 ![]() ![]() } 使用 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 例如我们建立如下 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() nCmd = ParseLine ![]() ![]() ![]() switch(nCmd) {      ![]()     {         doFunction( getIntParam1 ![]() ![]()     } } 这样就比原来快了很多 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 脚本分析器还需要有 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() switch(nCmd) {      ![]()     {         doFunction( getIntParam1 ![]() ![]()     }      ![]()     {         WalkTo( getIntParam1 ![]() ![]() ![]()     } } 现在 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()     virtual void do ![]()     {         doFunction( getIntParam1 ![]() ![]()     } }; 但这些新加 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()     virtual  ![]() ![]() ![]()     virtual void create ![]() ![]() ![]() ![]() }; 最后 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() //分析 ![]() ![]() strCmd = ParseLine ![]() //从map里寻找对应strCmd ![]() ![]() ![]() iterator it = Map.find(strCmd); ![]() ![]() {     // 通过Factory生成Command对象     Command* Cmd = it->second->create ![]()     // 执行Command对象 ![]()     Cmd->do( );     // 销毁Command对象     Delete(Cmd); } OK ![]() ![]() ![]() ![]() ![]() 图3-6 利用工厂模式解决 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 好了 ![]() ![]() ![]() ![]() ![]() ![]() 脚本怎样最终应用于规则呢?在我们现有 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() {     Cscript::getSingleton ![]() } 如果 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 零件组装:具体游戏层 ![]() 框架搭完后需要 ![]() ![]() ![]() ![]() ![]() ![]() 1、 利用框架开发 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2、 上层逻辑允且只允许和框架打交道 ![]() ![]() ![]() ![]() 3、 如果是框架没有完成 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 这里有 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 先看看我们 ![]() 1、建立 ![]() ![]() ![]() ![]() 2、有 ![]() ![]() ![]() ![]() ![]() 3、有若干怪物 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 4、当Player杀死所有怪物 ![]() ![]() ![]() ![]() ![]() ![]() 首先我们建立Application类 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在Application ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 下面是 ![]() ![]() ObjectNumber=1 #Object-1 ObjectType=7 ObjectPositionX=220 ObjectPositionY=220 ObjectPositionZ=220 Objectscript=Insanity.AI 这里 ![]() ![]() 通过更改Terrain.cfg和Scene.cfg我们创建出来了 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 那么世界 ![]() 很多人是这么做 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 触发器 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 从唯理 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 当把触发器加上并注册到物件系统里面后 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 第 4部分 结论和展望 通过对游戏世界 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 需要走 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 附录 Terrain Example /* ----------------------------------------------------------------------------- This source file is part of OGRE     (Object-oriented Graphics Rendering Engine) For the latest info, see    Copyright ?2000-2003 The OGRE Team Also see acknowledgements in Readme.html   You may use this sample code for anything you like, it is not covered by the LGPL like the rest of the engine. ----------------------------------------------------------------------------- */   /**     \\file          Terrain.h     \\brief         Specialisation of OGRE's framework application to show the         terrain rendering plugin  */   # ![]() # ![]()   # ![]() # ![]()   ![]() {   public:     TerrainListener(RenderWindow* win, Camera* cam) :ExampleFrameListener(win, cam) { };    // Override frameStarted event to process that (don't care about frameEnded)     bool frameStarted(const FrameEvent& evt)     {         float moveScale;         float rotScale;         float waterFlow;          ![]()          ![]()           // local just to stop toggles flipping too fast          ![]()            ![]()             timeUntilNextToggle -= evt.timeSinceLastFrame;           // If this is the first frame, pick a speed          ![]() ![]()         {             moveScale = 1;             rotScale = 0.1;             waterFlow = 0.0f;         }         // Otherwise scale movement units by time passed since last frame          ![]()         {             // Move about 100 units per second,             moveScale = 10.0 * evt.timeSinceLastFrame;             // Take about 10 seconds for full rotation             rotScale = 36 * evt.timeSinceLastFrame;                          //  ![]()             waterFlow = FLOW_SPEED * evt.timeSinceLastFrame;                     }           // Grab input device state         mInputDevice->capture ![]()           SceneNode *waterNode =  ![]()             mCamera->getSceneManager ![]() ![]()          ![]()         {              ![]()                 flowAmount  ![]()              ![]()                 flowAmount -= waterFlow;                ![]()                 flowUp = false;              ![]() ![]()                 flowUp = true;               waterNode->translate(0, (flowUp ? waterFlow : -waterFlow), 0);         }            ![]()           vec = Vector3::ZERO;            ![]()         {             // Move camera left             vec.x = -moveScale;         }            ![]()         {             // Move camera RIGHT             vec.x = moveScale;         }            ![]()         {             // Move camera forward             vec.z = -moveScale;         }            ![]()         {             // Move camera backward             vec.z = moveScale;         }            ![]()         {             // Move camera up             vec.y = moveScale;         }            ![]()         {             // Move camera down             vec.y = -moveScale;         }            ![]()         {             mCamera->yaw(-rotScale);         }          ![]()         {             mCamera->yaw(rotScale);         }            ![]()         {                          ![]()         }           // Rotate view by mouse relative position         float rotX, rotY;         rotX = -mInputDevice->getMouseRelativeX ![]()         rotY = -mInputDevice->getMouseRelativeY ![]()             // Make all the changes to the camera         // Note that YAW direction is around a fixed axis (freelook stylee) rather than a natural YAW (e.g. airplane)         mCamera->yaw(rotX);         mCamera->pitch(rotY);         mCamera->moveRelative(vec);           // Rotate scene node  ![]()         SceneNode* node = mCamera->getSceneManager ![]() ![]()          ![]()         {             node->yaw(rotScale);         }          ![]()         {             node->yaw(-rotScale);         }          ![]()         {             node->pitch(rotScale);         }          ![]()         {             node->pitch(-rotScale);         }            ![]()         {             mStatsOn = !mStatsOn;             //Root::getSingleton ![]()             showDebugOverlay(mStatsOn);               timeUntilNextToggle = 1;         }             // Return true to continue rendering          ![]()     }   };     ![]() { public:     TerrainApplication ![]()   protected:     virtual void createFrameListener(void)     {         mFrameListener=  ![]()         mFrameListener->showDebugOverlay(true);         mRoot->addFrameListener(mFrameListener);     }         virtual void chooseSceneManager(void)     {         // Get the SceneManager, in this  ![]()         mSceneMgr = mRoot->getSceneManager( ST_EXTERIOR_CLOSE );     }       virtual void createCamera(void)     {         // Create the camera         mCamera = mSceneMgr->createCamera("PlayerCam");           // Position it at 500 in Z direction         mCamera-> ![]()         // Look back along -Z         mCamera->lookAt(Vector3(0,0,-300));         mCamera-> ![]()         mCamera-> ![]()       }        virtual void createViewports(void)     {         // Create one viewport, entire window         Viewport* vp = mWindow->addViewport(mCamera);         vp-> ![]()     }       // Just override the mandatory create scene method     void createScene(void)     {         Entity *waterEntity;         Plane waterPlane;           // Set ambient light         mSceneMgr-> ![]()                // create a water plane/scene node         waterPlane.normal = Vector3::UNIT_Y;          waterPlane.d = -1.5;          MeshManager::getSingleton ![]()             "WaterPlane",             waterPlane,             2800, 2800,             20, 20,             true, 1,              10, 10,             Vector3::UNIT_Z         );           waterEntity = mSceneMgr->createEntity("water", "WaterPlane");          waterEntity-> ![]()           SceneNode *waterNode =              mSceneMgr->getRootSceneNode ![]() "WaterNode");          waterNode->attachObject(waterEntity);          waterNode->translate(1000, 0, 1000);           // Create a light         Light* l = mSceneMgr->createLight("MainLight");         // Accept default  ![]() ![]() ![]() ![]()         // NB I could attach the light to a SceneNode  ![]()         //  other objects, but I don't         l-> ![]()           mSceneMgr ->  ![]()           mSceneMgr-> ![]()         //mRoot -> showDebugOverlay( true );       }   };     /* ----------------------------------------------------------------------------- This source file is part of OGRE     (Object-oriented Graphics Rendering Engine) For the latest info, see    Copyright ?2000-2003 The OGRE Team Also see acknowledgements in Readme.html   You may use this sample code for anything you like, it is not covered by the LGPL like the rest of the engine. ----------------------------------------------------------------------------- */   /**     @file          Terrain.cpp     @brief         Shows OGRE's terrain rendering plugin. */   # ![]() # ![]()   # ![]() ![]() # ![]() # ![]() #end ![]()   # ![]() ![]() INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) # ![]() ![]() ![]() ![]() ![]() #end ![]() {     // Create application object     TerrainApplication app;       SET_TERM_HANDLER;          try {         app.go ![]()     } catch( Ogre::Exception& e ) { # ![]() ![]()         MessageBox( NULL, e.getFullDescription ![]() ![]() # ![]()         std::cerr << "An exception has occured: " <<             e.getFullDescription ![]() ![]() #end ![]()     }        ![]() }   参考 (1) ![]() ![]() ![]() ![]() (2) ![]() ![]() ![]() ![]() (3)OGRE文档和源代码——Ogre制作组(英国) (4) ![]() ![]() (5) ![]() ![]() (6) ![]() ![]() 0
相关文章读者评论发表评论 |
|