基于OGRE的海量三维模型动态调度技术的研究与实现 - 李雷

更新时间:2024-02-01 11:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于OGRE的海量三维模型动态调度

技术的研究与实现 全日制工程硕士学位论文

基于OGRE的海量三维模型动态调度技术的研究与实现

李雷

工程领域计算机技术

指导教师欧元汉副教授

论文答辩日期 2012.05.27 学位授予日期 2012.06.28

答辩委员会主席陈友初高级工程师

论文评阅人

喻昕王挺

GRE的海量三维模型动态调度技术的研究与实现 摘要

虚拟现实(VR)是一个新兴的计算机技术,广泛运用于各个行业,为人

们的生活带来了极大的改变和方便。在运用VR技术的时候,如果遇到大规

模场景,海量的三维模型显示导致计算机的运算速度大大下降,对硬件提

出了极高的要求。OGRE (Object-Oriented Graphics Rendering Engine)是一

个面向对象的三维渲染引擎,同时支持Direct3D和OpenGL,主要面向游 戏场景。

但是OGRE中对于海量三维模型的管理能力显得较为不足,不能很好

的实现海量三维模型的动态调度。OGRE在管理场景的时候,是以资源组

的方式统一加载卸载,不能以单个模型作为加载卸载的单位,这样第一不

能很好的把离开当前窗口的物体从内存卸载掉,第二会把当前区域所有细

节层次的模型数据全部放于内存中,使得内存不堪重负。所以本论文重点

解决这些问题,首先实现以单个模型为单位的动态加载卸载,并且实现了

预加载,解决了模型“突现”的问题,然后能对离幵窗口的模型进行判断,

过期的模型进行删除,对于采用多个细节层次的情况,没有用到的细节层

次模型也会从内存卸载。

DatabasePager是动态数据库技术,用来缓解内存压力,能够自动加载

卸载需要的数据。LOD技术能缓解渲染压力。PagedLOD技术是结合LOD

和DatabasePager技术,能同时缓解渲染和内存的压力。能够根据距离选择

不同细节层次的模型,然后也能判断出没有用到的细节层次模型和当前窗

口外的模型,通知DatabasePager进行卸载判断。

文重点研究DatabasePager、PagedLOD等动态管理技术,将其实现

到了 OGRE当中。最终实验采用了大量的三维模型,实现了海量三维模型

的动态调度。

关键词:虚拟现实大规模场景海量三维模型动态调度 OGRE

DatabasePager PagedLOD ii

nd Implementation Of Dynamic Scheduling Technique Of

Massive Three-Dimensional Models Based On OGRE

ABSTRACT

Virtual reality (VR) is an emerging computer technology, widely used in

various industries, and people's lives changed dramatically and convenience. If

you encounter a large-scale scenes, the use of VR technology, the massive

three-dimensional model of the computer's processing speed is greatly decreased

and raised extreme demands on the hardware. OGRE (Object-Oriented Graphics

Rendering, Engine) is an object-oriented 3D rendering engine that supports both

Direct3D and OpenGL, mainly for the game scene.

But OGRE mass management capabilities of three-dimensional model seems

to be rather inadequate, can not realize the three-dimensional model of the

dynamic scheduling well. When OGRE managing scene, the resource group is

the loading and unloading unit, not a single model, so that firstly it can not

unload the outside current window objects from memory well and secondly the

details of the region-level model of data is all load in the memory, making the

memory overwhelmed. This thesis is focused on solving these problems, first

realization is making a single model as the dynamic loading and unloading unit,

and it can preload. It solved the problem of \

leaves the window, it can be judged, it can be deleted when it is expired. For the

case of multiple levels of detail, the level of detail model not using will be in

广西大学学位论文原创性和使用授权声明

本人声明所呈交的论文,是本人在导师的指导下独立进行研究所取得

的研究成果。除已特别加以标注和致谢的地方外,论文不包含任何其他个

人或集体己经发表或撰写的研究成果,也不包含本人或他人为获得广西大

学或其它单位的学位而使用过的材料。与我一同工作的同事对本论文的研

究工作所做的贡献均已在论文中作了明确说明。

本人在导师指导下所完成的学位论文及相关的职务作品,知识产权归

属广西大学。本人授权广西大学拥有学位论文的部分使用权,即:学校有

权保存并向国家有关部门或机构送交学位论文的复印件和电子版,允许论

文被查阅和借阅,可以将学位论文的全部或部分内容编入有关数据库进行

检索和传播,可以采用影印、缩印或其它复制手段保存、汇编学位论文。

本学位论文属于:

口保密,在年解密后适用授权。 密。

(请在以上相应方框内打“ V”)

论文作者签名:曰期:

指导教师签名:日期

作者联系电话: 电子邮箱:

d from memory.

DatabasePager is a dynamic database technology which used to alleviate the

memory pressure, it can load or unload data automatically. LOD technology can

ease the rendering pressure. PagedLOD technology is a combination of LOD

and Databasepager, it can both relieve the pressure of the rendering and memory.

With PagedLOD technology, models of different levels of detail can be selected

according to the distance, and it can also determine the level of detail models

that not using, the models outside the window, then it notify DatabasePager to

begin unload judgment.

This paper focuses on DatabasePager, PagedLOD dynamic management

techniques, applied to the OGRE.The final test using a large number of

three-dimensional models, it can dynamic schedule the massive

three-dimensional models.

KEY WORDS: Virtual Reality; Large-scale scenes; Massive three-dimensional

model; Dynamic scheduling; OGRE; DatabasePager; PagedLOD

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究Lj实现

第一章绪言

虚拟现实(VR)是一个新兴的计算机技术,广泛运用于各个行业,为人们的生活带

来了极大的改变和方便。它通过计算机的高速计算和存储能力来模拟现实中的场景,具

有高效、便利、低成本等等优点。在运用VR技术的时候,如果遇到大规模场景,海量

的三维模型显示导致计算机的运算速度大大下降,对硬件提出了极高的要求。

OGRE (Object-Oriented Graphics Rendering Engine)是一个面向对象的三维值染引

擎,同时支持Direct3D和OpenGL,主要面向游戏场景。OGRE在文档一致性、资源管

理模式、完善的动画系统以及阴影系统等方面具有一定的优势。

但是OGRE中对于海量三维模型的管理能力显得较为不足,不能很好的实现海量三

维模型的动态调度。OGRE在管理场景的时候,是以资源组的方式统一加载卸载,不能

以单个模型作为加载卸载的单位,这样第一不能很好的把离开当前窗口的物体从内存卸

载掉,第二会把当前区域所有细节层次的模型数据全部放于内存中,使得内存不堪重负。

所以本论文重点解决这些问题,首先实现以单个模型为单位的动态加载卸载,并且实现

了预加载,解决了模型“突现”的问题,然后能对离幵窗口的模型进行判断,过期的模

型进行删除,对于采用多个细节层次的情况,没有用到的细节层次模型也会从内存卸载。

DatabasePager是动态数据库技术,能够自动加载卸载需要的数据。PagedLOD技术

是结合LOD和DatabasePager技术,能够根据距离选择不同细节层次的模型,然后也能

判断出没有用到的细节层次模型和当前窗口外的模型,通知DatabasePager进行卸载判 断。

本文重点研究DatabasePager、PagedLOD等动态管理技术,将其实现到OGRE当中。

1 ■ 1研究意义

1)城市规划部门的应用需要

城市规划部门在进行规划的同时,希望能用软件来辅助进行规划,尤其是虚拟

现实的软件,虚拟现实技术将很好的把图形、模型显示在计算机上,并且能进行方

便、快速的处理,非常的直观,而且改动起来也非常的方便。以前人们只能用笔和

1

tabasePager 原理 3.1.1 3.1.2 3.1.3

DatabasePager动态数据库简介

DatabasePager 的主要工作

DatabasePager中的删除数据的判断原理......

3.1.4 DatabasePager 的基本结构

3.1.5 DatabasePager 独立测试程序

3.2动态调度技术在OGRE中的实现

3.2.1 准备工作

3.2.2

3.2.3

DatabasePager 在 OGRE 里的实现

线程在 OgreDatabasePager 里的实现

3.2.4模型进入场景预加载功能的实现

3.2.5工作原理图

3.2.6核心功能测试程序

第四章基于OGRE的PagedLOD技术的研究与实现

4.1弓丨言

4.2 LOD基本原理

4.3 PagedLOD基本原理

4.3.1 PagedLOD 简介 4.3.2

4.3.3

PagedLOD 类结构

PagedLOD 用法

4.4 PagedLOD技术在OGRE中的实现 4.4.1

4.4.2

4.4.3

添加 PagedLOD 节点

PagedLOD中LOD技术的实现

PagedLOD 与 DatabasePager 的结合

4.4.4

PagedLOD 的实现

4.5 实验结果对比

第五章总结与展望

参考文献 a m

攻读硕士学位期间参加的科研项目

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

纸,画起来不方便,修改起来麻烦,效率也很低下,并且是静态的,不能动态的进

行处理。在展示的时候不能很直观的展示给客户。如果用了虚拟现实技术,将能很

好的解决这些问题,能动态的展示规划效果,更加直观,更加詢丽。如果只用OGRE,

虽然在這染效果和文档一致性上能够发挥OGRE的优点,可惜遇到大场景的时候,

OGRE的处理能力略显不足,无法高效管理海量的三维模型。如果能弥补OGRE的

这个缺陷,把其他地方现有的动态管理技术运用到OGRE中去,那么将具有重要的

现实意义。

2)三维地图展示与应用的需要

随着计算机的发展,使人们在电脑上观赏和使用三维地图成为可能。但是三维

地图相比于原始的二维平面地图来说,数据量巨大,普通的计算机无法承载,或许

能装下一个小区,但是一个城市、一个省、一个国家、甚至一个地球的时候将手足

无措。所以还是需要应用数学方法,提高软件效率来解决此类问题。OGRE的处理

能力较为不足,只能以资源组的方式统一加载卸载资源,不能以单个模型为加载卸

载的对象,不能很流畅的在巨大的三维场景中漫游,所以要想办法把更加先进的动

态调度技术应用到OGRE当中。

3)游戏开发部门的应用需要

游戏作为新兴产业,自出现起就吸引了全世界的眼球,尤其是青少年,它的娱

乐性、直观性、高效性、方便性让人欲罢不能,逐渐成为人们的主要娱乐休闲活动。

OGRE引擎对于游戏的幵发还是非常有用的,有很多游戏中会用到的实用技术。但

是游戏不乏有大型场景,比如说模拟飞行游戏,驾驶飞机在高空飞行的时候,视野

是很幵阔的,如果用OGRE,显示不了视野内的全部场景,你将会看到地图的边界,

这非常影响视觉效果,并且会把场景中所有细节层次的模型全都加载进内存。如果

能把先进的动态管理技术运用到OGRE当中来,既能处理海量模型,又能发挥OGRE

针对游戏的长处,将具有很重要的现实意义。

4)电子竞技运动项目的需要

来源于电脑游戏而又高于游戏的电子竞技运动,是新时代产生的一种新兴的体 2

程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

育运动,已经被国家体育局列为第99个运动项目,孕育而生一系列的电子竞技比赛、

联赛,专业的电子竞技运动员等等。这种运动主要是通过电脑软件硬件来进行比赛,

尤其是虚拟现实的软件,比如虚拟足球比赛、虚拟赛车比赛,运动员通过操作电脑

来模拟进行踢球、赛车等等,相对于传统的体育项目来说,电子竞技更强调智慧、

思维、心里素质等能力。OGRE比较适合开发电子竞技项目的软件,如果能提升

OGRE处理大场景的能力,将更好的提高这类软件的效率。

5)动画制作部门的应用需要

各种经典的3D动画深深地感动着每一个欣赏中的观众。计算机的出现让动画制

作显得方便了很多,以前的动画是画师一笔一笔的画,效率非常低下,计算机的快

速处理能力能产生连续的动作效果,能只用构建场景一次就能多次多角度使用。超

大场景对计算机的硬件要求比较高,毕竟硬件的处理能力是有限的,如果能用软件

思想来解决大场景的管理,解决海量三维模型的动态调度,显得更加有意义。

1.2选题依据

目前计算机图形技术被广泛用于各个领域,给工业生产、城市规划、游戏动画等等

带来了极大的方便,近几年的高速发展使越来越多的人感受到虚拟现实的魅力。OGRE

作为一个JT?放图形引擎为开发工作者提供了很多帮助,被应用做出各种优美、华丽的场

景,OGRE尤其在场景值染和文档一致性方面具有很大的优势,并且能支持OpenGL或

者 DirectX。

但是,OGRE在处理海量三维模型时,在处理大场景时,劣势突显出来。OGRE不

能很有效的管理超大场景,通常只能一次性的把全部数据加载进来,所有细节层次的模

型都加载进内存,无法进行动态管理,这对计算机的处理能力提出了极高的要求。如果

能把别的引擎、别的地方的动态管理技术应用到OGRE中,那么将具有很大的优势。

1.3国内外发展现状

1976年,Clark和他的研究小组第一个提出了 level of detail (LOD)模型概念。这个

关于LOD的基本想法是当物体只覆盖很小区域的屏幕时,可以使用比较粗糖的物体模 3 目录

m ^ I

ABSTRACT Ill

第一章m m 1

1.1研究意义 1

1.2选题依据 3

1.3国内外发展现状 3

1.4研究思路 4

1.5研究内容和论文结构 5

1.5.1研究内容 5

1.5.2论文结构 5

1.6应用程序幵发的软硬件环境

6

第二章虚拟现实以及相关引擎 7

2.1虚拟现实简介 7

2.1.1 概念和由来 7

2.1.2基本特征和构成 7

2.1.3 如何开发一个VR应用 8

2.1.4场景和对象 8

2.1.5行为动作 2.1.6

交互

8 9

2.1.7 雜 9

2.2 OGRE三维引擎简介 9

2.2.1 OGRE环境搭建 9

2.2.2 OGRE场景结构 10

2.2.3 OGRE运行时的启动流程 11

2.2.4 OGRE的资源管理模式 11

2.3 OSG三维引擎简介 12

2.3.1 OSG的代码结构 12

2.3.2 OSG的场景结构 12

2.3.3 OSG中关于动态调度的功能 13

2.3.4 OSG的资源管理模式 13

第三章基于OGRE的DatabasePager技术的研究与实现 14 V

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

中,在OGRE中实现海量三维模型的动态管理。这其中还要对OGRE引擎进行深入学

习,了解其中的机制和原理,这样才能运用自如,才能将这些技术很好的应用到OGRE

中。

1.5研究内容和论文结构

1.5.1研究内容

管理海量三维模型是当前虚拟现实研究的热点,有很多实用的技术。在总结和了解

有关论文和成果的基础上,着重研究一下几个方面:

(1) DatabasePager 技术

DatabasePager动态数据库技术是OSG中动态调度技术的核心,能够对数据进行有效

的管理,对不用的数据进行必要的卸载。本论文重点研究如何把DatabasePager的原理

运用到OGRE环境中。

(2) LOD技术

LOD技术可以概括为物体在远处和近处可以采用不同的细节层次。

(3) PagedLOD 技术

所有的模型都按照统一的方式管理,这不是一个明智的选择。PagedLOD技术运用分

页管理大大的提高了运行效率。本论文研究如何把PagedLOD技术应用到OGRE环境当 中。

(4) OGRE环境极其应用

OGRE是一个幵放的3D图形引擎,具有很多优点。本文研究如何把动态管理的先

进技术应用到OGRE环境当中。

1.5.2论文结构

本文共分为五章,具体编排如下:

第一章是绪言,介绍选题依据、研究意义等内容。

第二章是虚拟现实简介,介绍虚拟现实的发展概况和各种特点,并简单介绍了三维

引擎OGRE和OSG。

第三章是基于OGRE的DatabasePager技术的研究与实现,DatabasePager的技术原 5

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

型[2]。通俗的讲就是如果离观察者近,就调用精细的模型,如果离观察者远,就调用粗

糙的模型。

在文献[1]中,作者写道LOD细节层次技术是对同一个物体在不同的时间带来不同的

表现的实践,当物体距离远时调用低层次细节表现,当距离观察者近时调用高层次细节

表现。LOD转换使分离的物体的模拟变的非常简单,因为整个物体能被瞬间替换,地形

的LOD转换还是有很多问题的,因为地形需要表现一个连续的景象,表面不能有断痕,

需要大量不同的细节在这个表面上,距离观察者近的地面是高细节层次的,远离观察者

的地面是低细节层次的。建筑的LOD转换同样是个障碍,因为会有突变的现象,这会降

低虚拟体验。为了解决这个问题,同样的建筑模型需要创建不同的细节版本或者用交融

方法去解决突变的问题。

在文献[2]中,作者写道由于大量的模型不能同时被转进内存,所以需要仿照电脑操

作系统分页存储空间的方法来进行分页调度,我们把它叫做PagedLOD分页形式管理。

通俗讲就是只调用用户能看见的区域和将可能看见的区域,也就是可见区域和预可见区

域,不可见区域暂时不调用。

OSG三维引擎提供的DatabasePager动态数据库技术能够实现海量地形数据的动态

调度。DatabasePager是实现PagedLOD分页调度的关键,为进入视野的数据添加请求,

长期不使用的数据送入删除队列,需要预编译的数据还能提前进行预编译。

DatabasePager能对不在视野内的数据进行卸载,并且有时PagedLOD节点虽然在视野

内,但是显示的只是一个细节层次的模型,其他细节层次的子节点数据长期不使用,

DatabasePager也能对其进行卸载。在处理海量模型数据和海量地形的大场景时非常有

效。在DatabasePager的类中内置了相关的线程,通过不断的循环对数据进行加载卸载。

并且判断过期节点有两种方法,一是超过数量模式,设定一个目标的PagedLOD节点数

量,未达到数量的话不会进行删除,超过数量再进行判断;二是过期模式,在这种模式

下,PagedLOD的细节层次子节点超过设定的时间没使用,就会进行卸载。

1.4研究思路

在现有的软硬件环境基础上,先学习掌握更为先进的动态管理技术,比如LOD、

PagedLOD、DatabasePager等,研究他们动态调度海量三维模型的实现方法和原理。然

后建立OGRE环境,载入超大场景和海量三维模型,把这些技术实现到OGRE环境当

4

丨:j制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

理以及在OGRE中的实现。

第四章是基于OGRE的PagedLOD技术的研究与实现,PagedLOD的技术原理以及

在OGRE中的实现。

第五章是总结与展望,说明本文的工作、创新点、以及以后的工作。

1.6应用程序开发的软硬件环境

本人用C/C++语言结合OGRE幵放3d引擎开发大规模场景的仿真程序,所用的计

算机配置为:

主机系统: CPU: Intel(R) Core(TM)2 Duo CPU T8100 @2.10GHz 2.09GHz

内存:2G

显卡:NVIDIA GeForce 8400MGS 独立显卡,显存 256M

软件环境:操作系统:winXPsp3

编译器:VS2010spl

三维模型格式:.mesh格式(OGRE引擎专用格式) 6

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

第二章虚拟现实以及相关引擎

2. 1虚拟现实简介

2.1. 1概念和由来

现在有很多关于VR的定义,通常,限制性的方法是定义VR为3D,一个能够让用

户通过3维输入输出设备体验的,多重感知的,仿真的,实时的和互动模拟的空间。在

这样的研究背景下,VR被定义为一个三维的计算机描述的空间,这个空间用户可以任

意移动他的视角。我们因此考虑下面的方式是构成的VR系统,三维多用户聊天(Active

Worlds 2007),第一人称 3D 视频游戏(Quake 2007),Unreal tournament (Unreal 2007),

并且在网络上的3D虚拟空间。

2.1.2基本特征和构成

一个VR应用程序由不同的部分组成,可以概述如下:

1)场景和对象。该场景对应于这些物体所在的世界。包括光,视角,和摄像机。此

外,它仍然应该包括一些属性,这些属性是属于这个虚拟世界内部的。例如,重力可以

是一个对象在这个世界的一个属性。这个对象有一个虚拟的颜色和材质描述。他们有大

小、位置、和方向。

2)行为。这些对象可以有行为。例如,他们可以移动,旋转,改变大小等等。

3)互动。用户必须能够与虚拟世界中的对象进行互动。例如,用户可以选择一些对

象或者他可以拖动一些对象。这个可以是由一些规律的鼠标和键盘来完成或者通过专门

的硬件例如一个3D鼠标或者数据手套。

4)交流。如今越来越多的虚拟现实应用是一个远程用户可以相互交流的协作环境。

为了实现这个目标,网络通讯是十分重要的。

5)声音。VR应用同样应该包括声音。在过去的几十年里,为了计算VR应用里的

声音,一些研究已经被完成。 7

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

2.1.3如何开发一个VR应用

在过去的十五年里,一个VR应用的不同部分的开发不是一个简单的工作,大量的

软件工具被研发去减少开发者的工作。这些工具可以被分类为创作工具和软件程序库。

创作工具:创作工具允许开发者去创建一个静态场景,在应用比较熟练的情况下。

不过,他们认为有一些幵发者有VR知识并且一些编程技巧去使用脚本语言去进行编程

行为。这些被创作工具使用的脚本语言可以把一个创作工具转变成另外一个。

软件程序库。利用一个程序库可以从头开始编程一个完整的虚拟应用。程序库的例

子是Java3D、OGRE、OSG等,要使用这样的库,良好的编程知识、VR的知识和计算

机图形学都是必需的。在执行之前这些代码需要被编译和连接。它也可以使用播放器,

这个播放器可以及时的解释一个3D格式并且生成这个VR应用。VRML和X3D都是

3d格式,能够被专门的播放器解释通过一个web浏览器。

2. 1.4场景和对象

今天,针对于对象建模和场景建模存在着大量的创作工具,而且不用去对他们编程。

每一个工具带着他们自己的特点和GUI。因此,一个开发者,知道这个工具支持的特点

和他们怎样通过图形界面使用是非常重要的。幵发者同样需要知道哪种文件格式是被支

持的。针对他们用的这个播放器(或者用户接口)和这些创作工具的费用,开发者可以

选择使用哪种创作工具。最流行的创作工具是3DStudioMax,Maya,;MilkShape3D。如

果幵发者是为了针对一个特定的文件格式开发一个VR应用,他们需要去注意这些创作

工具支持的文件格式。例如VRML/X3D这种文件格式,不是所有的工具都允许以这种格

式输出对象。此外,当行为是嵌入式的时候他们不能总是正确的输出他们。除了这些创

作工具,软件程序库也可以用来进行场景建模。但是对于这一点,开发者需要有编程技

巧。现有的库有:Performer, Java3D ,OGRE,OSQ 用C4+写的X3D toolkit 或者用javaSD

写的Xj3D。这些创作工具能用来创建对象的材料(质地和颜色)到物体上。然而,有

时候是不合适的,这个开发工具可能为了适应VR应用程序而需要去修改他。

2.1.5行为动作

幵发动作和行为总是最困难的任务。通常,行为是用特殊的脚本语言或者编程传统 8

硕士学位论文 基于WRE的海量三维模型动态调度技术的研究与实现

语言如java或者C/C++。然而,一些创作工具允许行为直接使用脚本语言。这意味着开

发者仍然需要去知道这些脚本语言。此外去建立一个真实的行为,物理引擎需要被使用,

这同样增加这个VR应用的复杂性。

2.1.6交互

交互行为能发生在两种方式上。第一个方式是考虑对象之间的交互行为。当一个交

互发生时,这个物体能在交互的影响下产生一定的动作。举个例子,当一个对象和另一

个物体相撞时,他的形状(或者颜色)可以改变。因此,碰撞检测是非常重要的。由于

支持的碰撞检测不能总是非常有效,开发者必须想办法去改进他。第二个交互的方式是

考虑用户和物体之间的。软件程序库总是支持编出用户交互的程序。

2.1.7导航

当今,虚拟世界总是非常大的。因此,考虑用户如何能在虚拟世界内部导航,而且

在其中不会迷路,有两种方法来解决导航问题(例如漫游),但是如果想实现它的话开

发者通常需要有非常好的编程技巧和VR知识。

2.2 OGRE三维引擎简介

OGRE是一个面向对象的开源三维引擎,同时支持DirectX和OpenGL,基于修改的

LGPL开源协议。在使用它的源代码之前,需要先进行环境搭建,并且对于新手来说是

一个非常头疼的问题,这中间牵扯到很多步骤、很多操作,并且每一步都很容易出错,

很容易整到最后才发现根本没有成功。编译的时间也很长,通常要几个小时,建议使用

“联机编译\工具,能很好的提高编译的速度。下面来讲解OGRE环境搭建的步骤。

2. 2. 1 OGRE环境搭建

1、安装DirectxSDK。我用的版本是DXSDKjunl0.exe,双击安装。因为OGRE同时

支持OpenGL和DirectX,所以需要先装好这些文件。

2、安装联机编译工具incredibuild3_61.exe (不想用联机编译的也可以不安装),中

间需要输入你的电脑在局域网的ip地址。联机编译工具是一个非常强大的工具,之前编

译这么复杂的软件通常需要几个小时,而使用了联机编译基本可以在一二十分钟内迅速 9

口制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究每实现

完成。它的原理是同时使用局域网里的其他机器的cpu—起来工作,这样相当于多台电

脑在同时工作,效率是一台机器的N倍,建议大家使用。

3、编译依赖库Dependence。Dependence是OGRE需要的其他库,添加进去能使

OGRE的功能更加广泛。

4、把编译好的Dependencies文件夹放到OGRE源码的文件夹里。

5、安装cmake工具,我使用的是cmake2.8,双击CMake (cmake-gui)。第一行输

入OGRE源码的路径,第二行输入想要生成的工程文件的路径。然后点配置(configure),

解决目录里的红色部分,再配置,一直到完全成为白色为止。最后点生成(generate)。

6、找到在cmake里输入的生成的工程的文件夹的位置,双击.sin解决方案,编译

OGRE源码,最好debug和release版都编译,建议使用联机编译程序,因为工程是dll

类型的,所以只需要编译就能生成相应的dll文件。然后要生成INSTALL,将会把相关

文件生成到相应的目录。

7、设置环境变量,OGREJiOME设成你编译生成的sdk所在的目录,path里加上

%OGRE_HOME%\\Bm\\debug,设置完环境变量需要重启电脑。

8、将OGRE源码工程的最下面的SampleBrowser设置成启动项目,运行,这是OGRE

自带的例子,如果成功说明OGRE环境搭建已经完成。这里面有很多精彩的例子,可以

让大家感受到OGRE的魅力。

2.2.2 OGRE场景结构

OGRE设计的一大特点是场景图和场景内容分离,应用程序和這染过程使用不同的

部分。 10

硕上学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

场景图(Scene Graph)

挂接

场景WI 场景WI I场景W~

(Scene Node) (Scene Node) (Scene Node) 应

挂接 i J$ I I I 读

翻对象 I I 括动对? I I 活淑才? I用

(Movable Object) (Movable Object) (Movable Object) X X X 继承

^ I I I I ^ (Entity) (Entity) (Entity)

包含 I I I ^I II I

(SubEntity) f<. M A 誇

1

(SubEntity) (SubEntity) 浪

1 I 借

可》宣觀t象I 可馆染对象I 可馆染对象I 用 (Renderable) (Renderable) (Renderable)

图2_1 OGRE场景图结构(场景图与场景内容分离)

Fig.2-1 OGRE Scene Graph Structure(Scene Graph And Scene Content Separation)

2.2.3 OGRE运行时的启动流程

K构建场景root对象。

2、创建在OGRE中的资源,这些资源在后面会用到。

3、选择 DirectX 或者 OpenGL。

4、构建程序窗口,OGRE在里面這染。

5、将要使用的资源进行初始化。

6、构建场景用刚才的资源。

7、调整插件和第三方库。

8、构建巾贞监听器。

9、开始循环,进行渲染。 2.2.4

OGRE的资源管理模式

OGRE的资源管理模式显得较为粗ir,是以资源组的形式进行统一的加载卸载,程 11

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

2.3.3 OSG中关于动态调度的功能

OSG中有关于细节层次的LOD节点功能,能够根据距离来选择需要渲染的物体模

型。还有更有效的PagedLOD分页节点功能,能够对长期不在视野的物体从内存中卸载

掉,当需要时再重新加载进内存。PagedLOD的动态调度的功能主要是依靠DatabasePager

动态数据库来实现的,能够在程序运行时进行动态的加载卸载,同时不在视野的内的其

他细节层次的模型也能进行卸载,特别适合大场景的调度。当然也有一定的缺陷,加载

的时候如果跟不上這染的速度,偶尔会产生突然跳出的现象,可以通过延长设定的过期

时间来进行弥补,使不在页面的数据不立即进行卸载,总之要尽可能将效果保证在用户

可接受的范围内。

2.3.4 OSG的资源管理模式

OSG的资源管理模式较为精致。OSG可以实现单个文件的加载卸载,能够对内存数

据进行有效的管理。OSG会将场景树信息保存到一个文件中,在程序运行的时候,根据

文件中的索引进行读取。 13

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

(2)加载子节点:如果场景蹄选器选出的是新节点,并且节点和文件数据没有在内存

中,将会添加一个数据请求来记录信息,然后由后台的线程来加载。

(3)预编译数据:加载进动态数据库的文件如果需要预编译的话,可以提前进行预编

译来提高效率。之前先送入等待编译队列。

(4)合并到场景树中:之前准备好的对象会放入等待合并队列,由

addLoadedDataToSceneGraph函数来把带有文件数据的子节点addchild到对应的 父节点。

弃胸象P人 释放该节点以

选:巧漏國, >列 ,〉低系统开销

数据请求队 尝试_—??

I/????.? =o 列 ■=>加载节点的文件 _

加载后,需要提前^、等待编译队 ^、执行对象的预编 编译的数据 >列 ‘ ^译T作

编译完毕,或者不 等待合并队 . -

1——

图 3-1 DatabasePager 的主要[作

Fig.3-1 The Main Work Of The DatabasePager

在上图的原理中,对象离视点太远也算作是离幵“当前页面”。左边代表提供的数据,

送到中间白色方块的相应队列中,右边代表得到的最终的操作和结果。由后台线程

DatabaseThread来处理的是用浅色方块表示的,由其他函数来处理的是用深色方块来表 示的。 15

口制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

第三章基于OGRE的DatabasePager技术的研究与实现

OGRE在海量模型数据处理能力方面比较不足,只能以资源组的形式统一的加载和

卸载场景中的数据,也就是说当前场景中的数据必须先加载到内存中,使用时从内存中

直接调用,不使用时统一进行卸载,不能很高效的对内存中的数据进行管理,也不能很

有效的对单个模型数据进行处理。所以使用起来比较臃肿,不是很灵活。而DatabasePager

动态数据库技术能很好的解决这个问题,这个技术在OSG中有着很好的应用,而本论

文主要是考虑如何将它应用到OGRE当中去。由于这一章的重点是模型的动态加载卸

载,还没有详细介绍PagedLOD技术,本章中用的PagedLOD节点都只有一个子节点,

只考虑该子节点的加载卸载,不考虑其他细节层次。而下一章将对PagedLOD技术的应

用进行详细讲解。

3.1 DatabasePager 原理

3.1.1 DatabasePager动态数据库简介

DatabasePager动态数据库是伴随着海量数据,育而生的。所谓动态,大致意思可以

总结为一句话,就是需要的数据加载进内存,不需要的数据从内存卸载出去。不过看似

简单的一句话,细节实现起来还需要考虑很多的问题,比如怎样加载卸载才能不影响主

程序的运行,怎样能保证需要的数据恰好在数据库中,怎样判断哪些是不用的数据,并

且悄悄的卸载掉,这些都是需要仔细的思考和研究的。

3.1.2 DatabasePager 的主要工作

DatabasePager的主要工作可以分为以下几个部分:

(1)删除模型数据:在场景更新的过程中,如果当前场景中的模型超过规定数量或者

超过规定时间规定顿数,将会对模型节点进行删除,把文件数据信息从内存释放。

这样进行删除判断能有一定的缓冲机制是非常好的,如果一旦不使用就删除的话

会比较麻烦,因为有些数据虽然暂时不用,但是马上可能又需要,再重新加载的

话得不偿失。 14

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

序中将要用到的资源文件先放置在资源组中,然后加载时全部都放入内存中,包括粗糙

程度不同的多个细节层次模型数据,后面在使用哪个模型时可以迅速从内存中取出进行

渲染,渲染效率比较高。但是这样做对内存的压力很大,资源组中所有的东西都在内存

中,己经离开视野的和没有显示的细节层次模型都还在内存中,无法进行有效的卸载,

有时会使内存不堪重负。本论文会研究OSG中的动态调度技术,加强OGRE资源管理

的效率,缓解内存压力,实现大场景的动态调度。

2.3 OSG三维引擎简介

OSG的英文全称是(Open Scene Graph),意思是幵放场景图形。主要应用于虚拟仿

真、工程可视化方面,基于修改的LGPL开源协议。OSG引擎只支持OpenGL,不支持

DirectX。OSG的环境搭建和OGRE—样复杂,但是方法相近,在此不再赘述。

2. 3.1 OSG的代码结构

1、osg库:这个库包含OSG三维引擎的基本内容,比如有智能指针、公告板、摄

像机、裁减、节点、LOD、PagedLOD等等。在构建场景树结构的时候重点使用这个库,

以及一些其他库所需要的公共部分。

2、osgDB库:包含了各种关于文件处理和数据库部分,本论文研究的重点

DatabasePager就在这个库里面。其他还包含有读写文件、共享状态管理等功能。

3、osgUti丨库:OSG的实用工具部分,里面包含OSG使用过程中的所需的各种工具。

4、osgGA库:包含了窗口视景与用户的交互的管理工具,构建出一个设备抽象层,

并且与平台无关。

5、osgViewer库:视景器,OSG的這染部分主要使用这个库,包括场景、视口、视

景器、植染等等部分。

2.3.2 OSG的场景结构

OSG中有两个树,场景树和渲染树。场景树部分是用户在使用的过程中自己创建,

植染树是OSG根据用户提供的信息进行生成。 12

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

3.1.3 DatabasePager中的删除数据的判断原理

一、超过数量删除模式(_targetMaximmnNumberOfPageLOD>0):

1、进入视野的PagedLOD节点添加进活动PagedLOD节点。

2、如果某一顿幵始不使用,则将PagedLOD节点从活动PagedLOD列表中移到不

活动PagedLOD列表中。

3、如果下一顿又开始使用,则将PagedLOD节点从不活动PagedLOD列表中再移回

到活动PagedLOD列表当中。

4、如果PagedLOD总数<=PagedLOD的最大值,直接return

5、删除的数量二 PagedLOD总数-PagedLOD目标最大值

6、如果删除的数量

>不活动PagedLOD数量

删除的数量=不活动PagedLOD数量

7、过期时间=当前倾的引用时间-0.1

过期帖=当前顿编号-1

8、遍历不活动节点列表幵始移除子节点。

9、把子节点送入删除队列,等线程删除。 16

程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现 开始

^ X r Si

I PagedLOD 节点 1 否

PagedLOD 节点

\\^否进入场

添加到活动

PagedLOD 列表 __ 是 否

该节点当前倾 ^ 移至不活动该节点当前中贞

\\^是否在使用PagedLOD节点 是否乂使用

从末尾开始移除蘧^

过期子节点— _^

资湄送入删除列- 表 T

等待线程删除资 源

~~F=^ 结束

V-

图3-2超过数量删除模式

Fig. 3-2 Delete Mode — More Than Number 17

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

二、过期删除模式(_targetMaximumNumberOfPageLOD=0):

1、过期时间=引用时间-设定过期延迟。

2、过期顿数=引用巾贞编号-巾贞数延迟。

3、遍历活动PagedLOD节点列表,超过时间和顿数的子节点删除。

4、标记子节点列表中是PagedLOD节点的。

5、把子节点送入删除队列,等线程删除。

6、如果子节点还是PagedLOD节点,就直接删除子节点。

开始 ^ ‘ I

)%踪 PagedLOD 节点 Li 一丨.丨^ I

PagedLOD节点否

否进入场

I添加到活动PagedLOD列表

; r

从末尾移除过期子节点 ; ,? n i irtii

—I

~资源送入删除列表

巧待线程删除资源r i ‘ s % ▼ 结東

图3-3过期删除模式

Fig. 3-3 Delete Mode - Expired 18

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

3.1.4 DatabasePager 的基本结构

表 3-1 DatabasePager 类 public 的主要函数

Table 3-1 The Main Fuction Of DatabasePager's Public

☆ DatabasePager。 默认构造函数

void requestNodeFile( 请求加载数据的虛函数。filename是需要加

const std::string& filename, 载的文件数据名。group是需要合并到的

Group* group,

PagedLOD 节点或其他节点。FrameStamp noat丨 * 指的是当前的帕标记,内部有顿编号、时

是一个空指针,用于后

const Referenced*)

面保存各种力口载佶息。

void setDatabasePagerThreadPause(bool) 设置 / 查询线程的暂停

bool getPatabasePagerThreadPauseQ const

void setAcceptNewdatabaseRequests(bool) 设置/齊询能否添加新的数据需求

☆ void signalBeginFrame( 设置倾开始或者顿结束,保持与主进程同

const FrameStamp*) 步。

void signalEndFrameQ

voidsetDoPreCompile(bool) 设置/获取是否用线程来进行数据的预处理

bool getDoPreCompi 1 eQ const 厂作

☆ void setTargetFrameRate(double) 设置/获取目标喊速率,系统会0行调整来

double getTargetFrameRateO const

匹配

☆ void setTargetMaximumNumberOfPageLOD(设置/获取 PagedLOD 的 B 标最大值,超过

unsigned int)

这一数值将会进行删除,如果设为0将进

unsigned int

入过期过顿判断模式

getTai^etMaximumNumberOfPageLODO

const

static DatabasePager* createQ

分页数据库的对象初始化函数

virtual void updateSceneGraph(const 更新场景图

osg::FrameStamp& frameStamp)

表 3-2 DatabasePager 类 protected 的主要内容

Table 3-2 The Main Content Of DatabasePagefs Protected

struct DatabaseRequest:

数据请求结构体,用来保存请求的内容和

public osg;-.Referenced 信息

struct RequestQueue : public osg::Referenced 数据请求的队列的结构体

struct ReadQueue : public RequestQueue 读取队列结构体

virtual void removeExpiredSubgraphs(const 只是作出选择,由哪种方式进行删除

osg::FrameStamp &frameStamp)

virtual void 超过数量删除模式

capped_removeExpiredSubgraphs(const

osg::FrameStamp &frameStamp)

virtual void

过期删除模式

expiry_removeExpiredSubgraphs(const

osg::FrameStamp &frameStamp)

osg::ref_ptr 文件需求队列 19

丨-:!制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

fileRequestQueue;

osg::ref_ptr 待合并数据列表

dataToMergeList;

double expiry Delay;

过期延迟(过期时间)

int expiryFrames; 过期喊数

表3-3 DatabasePager中与PagedLOD相关的部分

Table 3-3 DatabasePager In Part With PagedLOD

virtual void registerPagedLODs(

在一个子图中寻找所有 PagedLOD 节点,

osgxNode* subgraph, int frameNumber = 0) 并且用 DatabasePager 注册它们,所以它

能追踪到过期的节点 注意,必须从更新线程里调用

void setT^etMaximumNumberOfPageLOD( 设定/奔询数据线程可同时调度的分页 unsigned int target)

LOD 节点的数目

{ _targetMaximumNumberOfPageLOD = target;} 注意,如果超过目标数,多余的活动 .. PagedLOD将会终止。但是一且低于0标

erOfPageLODO const数目’?卿dLOD将会继续加賴0标值

{ return taj^etMaximumNumbcrOfPageLOD; }

★ virtual void updateSceneGraph( 更新场景图

忍nst osg::FrameStainp& frameStamp)

{ reTnoveExpiredSubgraphs(frameStanip); 、 . 、一、..

addLoadedDataToSceneGraph(franieStamp); }〗、移除过期子树 2、添加取数据到场 m

typedef std::list

PagedLOD 节点列表,列表类型

< osg::ref ptr> PagedLODList

class MarlcPagedLODsVisitor 标记 PagedLOD 的访问器

class FindPagedLODsVisitor

寻找 PagedLOD 的访问器

friend class FindPagedLODsVisitor

virtual void removeExpiredSubgraphs( 移除过期子图

constosg::FrameStamp &frameStamp) 注意,只能在更新线程中调用

PagedLODList activePagedLODList

活动/不活动的 PagedLOD 节点列表

PagedLODList inactivePagedLODLi st

unsigned int targetMaximumNumberOfPageLOD PagedLOD 的目标最大数量

3.1.5 DatabasePager独立测试程序

为了将动态数据库DatabasePager运用到OGRE当中,首先要独立使用DatabasePager

来进行前期的测试,看看需要什么参数和返回值。自己编写的独立测试程序

DynamicManage 1完成了这个功能,用自己写的main函数来直接使用DatabasePager的

对象,没有场景树,没有這染环境等其他无关的东西,只有与动态数据库相关的部分。

这样就先掌握了 DatabasePager的参数、返回值、使用方法等原理,后面才能很好的运

用到OGRE当中去。由于使用中会用到帕的概念,所以该程序手动设置第一巾贞、第二中贞

等等,共设置了五顿,本论文仍然用PagedLOD节点为例来进行说明。 20

程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

中贞 PagedLOD DatabasePager

声明喊标记 声明分页 声明DatabasePager

指针 节点 对象指针 准 P 备 i |K>.

creat ()生成 : 添加子节

点信息 7

_声明数据库

需求指针

丁- T

V — —---

设为第一桢 设定容量,时

间延迟’帧延 迟 ; ,

? 添加文件请

用 f 阶 m

加入活动 & 分页节点 “I~

S — T图

设为第二帧——?记录访问——^更新场景图

时中贞信息 后

续 一\‘一

设为第三顿 ^一一 段 ■“更新场景图

七一-一

设为第酬 更新场景图

设为第五顿^—‘ -??更新场景图

图3-4 DatabasePager独立测试程序

Fig.3-4 The DatabasePager Independent Testing Program 21

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

OSG与OGRE节点的方式不太一样,OGRE中场景树和场景内容是分离开的,其中有

个实体的概念,在前面创建完场景树之后,实体是挂接到场景组节点的。而去掉实体是

调用detachObj ect()解除的函数。

3.2.3 线程在 OgreDatabasePager 里的实现

关于线程的类同样内置于OgreDatabasePager中。与原来的OSG中的线程不同,在

OgreDatabasePager分别设置了加载文件和删除文件两个独立的模块。

在加载文件的模块中,首先要获得指向OgreDatabasePager的指针和指向场景管理器

的Ogre::SceneManager的指针,前者是为了获取待需求请求中的文件信息,后者是为了

使用Ogre的creatEntity函数来根据文件信息加载文件。最后要把加载后的文件加入待合

并列表。

在卸载文件的模块中,同样要获得指向OgreDatabasePager的指针来获取删除列表的

文件。由于获得的类型是Ogre的MovableObject类型的数据,而进行卸载需要的是Entity

类型,所以在这里要使用static—cast进行强制类型转换,最后进行卸载,彻底从内存消失。

3.2.4模型进入场景预加载功能的实现

模型在离幵场景之后,如果已经被卸载掉,再重新进入场景的话需要重新加载,而

这个加载的过程即时再快也需要一定的时间,所以容易出现模型突然跳出来的“突现”问

题,非常影响观赏的效果。所以要想办法解决这个问题,实现模型的预加载。由于OGRE

是采用包围盒的技术来判断场景是否在场景中,也就是说判断包围盒的位置,如果在视

野内,就加载,不在视野内,就卸载。而我设法获取了模型的包围盒,然后进行保存,

并通过修改包围盒大小设置成了原来的两倍,也就说让模型的大小范围只是包围盒的一

小部分。如果采用此方法,当模型还未进入场景时,包围盒已经进入场景,判断后添加

数据请求,后台线程进行自动加载,在模型真正进入场景前就进行了加载,不再出现“突

现”的问题,保证了程序的流畅性、真实性和观赏性。 23

1:1制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

模型预加载实现之前

当前视野

,一、、、 —?

模型进入视野, 由于加载需要时间,所以出现时

通知后台加载,此 就好像是直接跳到了这里,影响

时包围盒的大小 观赏效果

和模型相同

模型预加载实现之后

Z'一一-、、、

Z 模型的包围盒 、、 / 、、、、、、 / ,'—、、、 I / c> c> \\ f 0 0 ^

\\ 、、、、?’/'、^ 、、 、、、__〃> \\ 乂; 这样在模型进入当前视野之前,应 \\ \\

/

?

/

该就已经加载好了,观赏效果比原

来要好

、、、、、、、_??一-\

获取模明的包II盒并设置成两

倍。包围盒进入场景,通知后台

开始加载

图3-5预加载的实现

Fig. 3-5 The Implementation Of Pre-loaded 24

程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

3.2.5工作原理图

蹄选出耍显

示的物体

OgreDatabasePager-requestNodeFile

负责加载的线程

.从请求列表读取第一“数

使用requestNodeFile读取文件 | 据请求?

将文件加入到请求列表 加载数据

^

——;::^——

释放“加载文件线程” —

数据加入到待合并列表

OgreDatabasePagerriupdateSceneGraph

检奔PaeedLOD列表的过期数据

删除过期的细节层次子节点 负责卸载的线程 ^

—?从删除列表中获取数据

将文件加入到删除列表 ^

释放“纖餅離” 翻肖贼Entity類 I 挂接‘‘等待合并列表”里的实体] 卸载数据 至!J SceneNode

图3-6 DatabasePager在OGRE内的过程图

Fig.3-6 The DatabasePager Process Diagram Within The OGRE

上图的过程如下:

1、上图详细说明了整个处理过程。PagedLOD是OgreDatabasePager处理的对象类型,在

实际的应用中,其他的类型进行相应的处理后也可以使用,这里就以这种类型为例

子进行说明。程序员在建立场景树的过程中,PagedLOD节点的setFileName函数会将

文件信息记录在节点中。 25

[:丨制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

DatabasePager独立测试程序完成了本论文想要的结果,在需要时进行了必要的加载

和卸载。现在完成了独立模块的测试,当然这还远远不够,下一步开始真正的移植,并

且结合OGRE三维引擎来进行实际的应用。

3.2动态调度技术在OGRE中的实现

这一部分将深入讲解如何将DatabasePager动态调度技术运用到OGRE当中。在分

析完DatabasePager的原理之后,发现目前的OGRE引擎还不能直接移植这个方法,原

因是OGRE的某些不同的设计原理。所以要在移植之前做一些相应的准备工作。

3.2.1 准备工作

第一 OGRE不是以单个文件作为加载卸载的单位。OGRE是以资源组的方式来加载

卸载资源文件的,资源组中的文件会统一地加载卸载,不是很灵活。虽然可以让一个资

源组中只有一个文件,但是这样又会带来其他的麻烦。最好的方式还是直接以单个文件

作为处理单位,这样就需要调整OGRE原有的资源管理方式,让它来适应本论文的需求。

第二还要想办法获得模型蹄选信息。在决定需要加载哪个文件的时候,首先要知道

模型是如何进行蹄选的,能找到控制点,才可以调用DatabasePager的功能,否则一切

都是空谈。本文蹄选模型的方法是通过物体的包围盒来判断,当包围盒进入场景时,会

通知OGRE进行瑄染。所以当包围盒进入场景之后,获取需要加载的模型信息,然后通

过线程进行加载,最后进行渲染。

3.2.2 DatabasePager 在 OGRE 里的实现

为了进行区分,将新加的动态数据库的类名设置成了OgreDatabasePager。基本实现

了原有的大部分功能,对于线程的部分进行了调整,使用了另一个线程方法,没有使用

原来的线程方法。为了方便读取资源文件,为requestNodeFile新加了一个参数

Ogre::SceneManager* mSceneMgr,这个指针被传递到OgreDatabasePager内部,进而给线

程来读取资源文件。另外,里面的osg::ref_ptr类型的参数改成了

Ogre::MovableObject*类型。在DatabasePager.cpp文件中,也针对OGRE做了相应的调整。

比如:合并到场景父节点的代码换成了

scenenode->attachObject( databaseRequest->_loadedModel); 22

日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

2、然后在场景的這染过程中,会进行场景蹄选,PageLOD节点如果在视野内,就会请

求加载文件子节点。

3、加载子节点调用的是OgreDatabasePager::requestNodeFile函数,这里到了整个过程的

重点之一,从这里,外面的数据将进入DatabasePager中,后面将进行一系列的处理。

requestNodeFile根据参数的各种信息,将数据送到“请求列表一requestList”。

4、在requestNodeFile的最后会尝试释放OgreDatabasePager内置的线程来完成实际的文

件加载工作。使用线程的意义在于,场景這染的时候不必再去考虑数据的加载卸载

过程,交给线程去处理了,这样能大大提高场景植染的效率。

5、OgreDatat)asePager::updateSceneGraph函数起着至关重要的作用,总结起来它做了两

件事,一是去除过期子树,二是加载数据到指定父节点。

6、updateSceneGraph函数在场景這染的每一巾贞都会检查PagedLOD列表,来搜索需要删

除的节点。

7、删除过期节点有两种判断方式,一个是“超过数量删除模式”,一个是“超过巾贞和时间

删除模式”。

8、将要删除的节点放入弃用列表一childrenToDeleteList。然后又幵始尝试释放线程。

10、在线程中,会进行更底层的操作。开始时是阻塞的,被释放后开始循环。它首先要

删除“弃用队列”中的对象,然后从“请求列表”拿到“数据请求”加载相应的数据。然后

判断是否需要进行预编译,需要的送入“等待编译列表”,最终都将数据送入“等待合

11、updateSceneGraph的最后一步就是把—dataToMergeList中的节点合并addchild到指定

的父节点。等待场景的這染。

3.2.6核心功能测试程序

在动态调度技术嵌入到OGRE里之后,需要进行测试它的功能。所以编写了测试程.

序,先用了单个模型来观察加载卸载的效果。

1、首先要createEntity创建一个模型的实体,就是下面要显示的模型的信息。

2、设置一个包围盒对象获取实体的包围盒。

3、由于OGRE的createEntity函数已经自动地将实体加载进内存,所以这里要手动地先

进行卸载。 26

硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现

4、建立场景节点sceneNode挂接到根节点的下面。

5、建立PagedLOD节点挂接到sceneNode下面。

6、给PagedLOD设置实体信息。这一点和OSG不同,OSG中需要赋给PagedLOD的是文

件信息,而我的程序中是赋予实体信息,原因是他们加载文件方式的不同。OSG是

根据文件名到目录中去找文件进行加载,而我的程序可以直接通过实体获取mesh信

息,然后load便可加载文件到内存。

7、传递包围盒对象给PagedLOD节点。

8、程序在运行的同时,会检测PagedLOD节点是否在场景内,然后添加数据请求进行加

载。如果离开场景,便会自动判断进行卸载。

27 位论文 基于QGRE的海量三维模型动态调度技术的研究与实现 LOD DatabasePager

根据距离选择 根据需要从内

不同细节层次 存动态加载卸

的模型 载模型

缓解這染压力 缓解内存压力 r m

N. PagedLOD 是 LOD 和 Z ^vDatabasePager 技术的,

PagedLOD

既能选择不同层次

的模型,又能根据需

要从内存动态加载 卸载模型

同时缓解植染和内

存的压力

图 4-1 LOD、DatabasePager、PagedLOD 之间的关系

Fig.4-1 The Relationship Of LOD DatabasePager And PagedLOD

4.2 LOD基本原理

在进行三维场景的浏览时,用户通常只关注眼前的模型,离得较远的模型会比较小,

看不清也不会仔细去看。所以为了提高這染的效率,可以把远处的模型换成较为粗糖的、

容量较小的模型,这样能很好的缓解這染的压力,但是无法缓解内存的压力,因为有些

模型虽然没有被這染,但是仍然在内存中。 30 基于OGRE的海量三维模型动态调度技术的研究与实现

第四章基于OGRE的PagedLOD技术的研究与实现

4.1引言

PagedLOD 的全称是 Paged Level Of Detail。Level Of Detail 是指 LOD,LOD 是根据

用户与模型的距离,选择不同粗糖程度的模型来进行植染,因为距离视点远的模型本来

本文来源:https://www.bwwdw.com/article/2idw.html

Top