一种三维场景实时绘制框架和绘制方法

文档序号:6632738阅读:317来源:国知局
专利名称:一种三维场景实时绘制框架和绘制方法
技术领域
本发明涉及一种三维场景实时绘制框架和绘制方法。
背景技术
虚拟现实(Virtual Reality,简称VR)技术是一种关于对现实世界的模拟、逼真体验的综合技术和方法。它涉及计算机图形学、人机接口、传感及人工智能等不同领域的知识。由于人类80%的信息是由视觉获得,所以,对现实世界的视觉模拟和逼真视觉体验,是虚拟现实系统重要的组成部分。三维几何造型技术、基于物力的建模技术、图像与图形相结合的技术、高效的真实感图形渲染技术等关键技术已经成为研究的热点问题。虚拟现实是一项使用技术,目前已被广泛应用于军事、航天、设计、生产制造、信息管理、商贸、建筑、医疗保险、危险及恶劣环境下遥控操纵、教育与培训、信息可视化以及远程通讯等多种领域。
虚拟现实的重要性和必要性引出了大批的图形开发标准,经过竞争和淘汰,目前OpenGL成国际上公认的3D图形工业标准,在Unix和PC平台上得到广泛的应用。OpenGL提供了数百个库函数,可以方便的绘制真实感的3D图形,但OpenGL的编程接口是低级的C函数,不提供可复用的对象库或者应用程序框架,开发效率不高。为了克服这些困难,人们往往在图形标准(OpenGL)上建立更高的开发工具。美国Quantum3D公司的OpenGVS就是一种虚拟环境的运行平台,OpenGVS具有一定的虚拟场景管理功能,提供过程式的用户接口,但OpenGVS也存在着一些局限(1)OpenGVS提供的虚拟场景绘制循环过程使其与仿真应用程序构成了紧密的耦合的关系,不利于仿真应用程序的维护和扩展;(2)OpenGVS仅提供过程式的用户接口,很难与面向对象的仿真应用程序良好的结合;(3)OpenGVS不支持对底层绘制元素(如三维模型的某个三角面)的访问,一些特殊效果实现比较困难,也使提高系统性能的多种优化措施难以实现。

发明内容
本发明的技术解决问题是克服现有技术的不足,提供一种面向对象的三维场景实时绘制框架和绘制方法,该绘制框架提供了方便的用户调用机制、消息处理机制,达到了耦合度底,扩展性强和绘制效率提高的目的。
本发明的技术解决方案三维场景实时绘制框架,其特点在于它由三层体系结构构成顶层,为用户接口层,提供与中间层联系的调用接口,发出调用请求至中间层;
中间层,为核心层,由插件管理、场景图SceneGraph管理、绘制图RenderGrarph管理和绘制管理模块组成,当顶层有调用请求时,由插件管理模块读取位于外部的模型文件,然后通过场景图管理模块生成场景图,最后调用绘制管理模块对SceneGraph进行App、Cull和Draw三步绘制操作,场景状态更新App阶段根据用户输入修改场景状态,场景可见性裁剪Cull阶段根据视点的位置对SceneGraph进行可见性剔除,并进行状态切换优化,然后调用RenderGrarph管理模块生成RenderGraph,渲染绘制Draw阶段根据RenderGraph生成底层的绘制语言,完成绘制操作;底层,为绘制语言管理层CGAL,封装了行业中存在的不同版本规格的绘制语言的所有状态和绘制属性,供绘制管理模块绘制时调用。
采用上述的三维场景实时绘制框架的绘制方法,其特点在于当顶层有调用请求时,由插件管理模块读取位于外部的模型文件,然后通过场景图管理模块生成场景图,最后调用绘制管理模块对SceneGraph进行App、Cull和Draw三步绘制操作场景状态更新App阶段、场景可见性裁剪CULL阶段和渲染绘制DRAW阶段,APP阶段根据用户输入修改场景状态,采用Visitor模式遍历场景图,处理场景数据动态变化;Cull阶段根据视点的位置,采用Visitor模式遍历场景图,对场景图进行视域剔除进行可见性剔除和LOD选择,生成绘制图,生成面向绘制的渲染序列,该阶段负载完全集中在CPU;Draw阶段根据绘制图生成底层的绘制语言,然后进行绘制,从而完成了一帧的绘制,下一帧继续循环APP、CULL和Draw三步,完成了整个场景的绘制。
本发明与现有技术相比的有益效果是(1)采用了三层体系结构,底层为绘制语言管理层,封装了OpenGL的所有状态和绘制属性,通过对底层的继承可以实现跨平台绘制;中间层为核心层,进行模型(包括实体模型文件,图像文件,声音文件等)读写的插件管理、内存组织和绘制过程的控制;顶层为用户接口层,提供方便的用户调用机制、消息处理机制,达到了耦合度底,扩展性强的目的。
(2)向上层仿真应用程序提供了面向对象的接口,可与面向对象的上层仿真应用程序很好的结合。
(3)针对自然环境复杂性和相关性,采用了两种信息存储模型基于包围球的SceneGraph和面向绘制的RenderGraph。SceneGraph是一种静态树结构,在场景构造时生成,树的组节点描述模型的功能和特点,叶节点保存了绘制该模型的所需信息。根据模型的功能和特点,组节点分为Group节点、LOD节点、DOF节点、Light节点等;RenderGraph是SceneGraph一个信息子集,仅仅包含需要送入绘制管道的信息,每一帧绘制前,需要遍历场景树生成一个渲染序列,可以对这个渲染序列进行优化,以达到快速渲染的目的。
(4)针对3D场景实时绘制的需求,绘制管理采用了三步绘制方法App阶段、Cull阶段、Draw阶段,App阶段采用Visitor模式遍历场景图,处理场景数据动态变化,如物体位置的移动,光照的变化等;Cull阶段采用Visitor模式遍历场景图,对场景图进行视域剔除、LOD选择等,生成面向绘制的渲染序列,该阶段负载完全集中在CPU;Draw阶段把渲染序列送入绘制管道进行绘制,该阶段负载主要集中在GPU。Cull阶段和Draw阶段可应用动态优化策略,通过调整这些策略可以均衡CPU和GPU的负载。


图1为本发明的结构示意图;图2为本发明的插件管理模块实现类图;图3为本发明的基本场景图SceneGraph结构示意图;图4为生成SceneGraph示例图;图5为场景图中的Composite模式应用类图;图6为绘制引擎中场景图核心数据类型的继承关系图;图7为本发明中的场景图SceneGraph的几何绘制对象类图;图8为本发明中场景图SceneGraph的绘制属性类图;图9为本发明中场景图SceneGraph的辅助类图;图10为本发明的绘制图RenderGraph的结构示意图;图11为本发明的Visitor与场景节点的交互图;图12为本发明的绘制流程图。
具体实施例方式
如图1所示,本发明由三层体系结构构成底层为绘制语言抽象层CGAL,属于绘制语言层管理,封装了行业中存在的不同版本规格的绘制语言,如OpenGL或者DirextX等的所有状态和绘制属性,供核心模块中的绘制管理时调用。
中间层,为核心框架,进行模型文件(包括实体模型文件,材质文件、纹理文件、声音文件和配置文件等)读写的插件管理、SceneGraph管理、RenderGraph管理和绘制管理,其中插件管理模块是基于插件形式设计的一个功能模块,该模块提供了一个灵活的系统扩展形式,采用统一的形式来调用插件功能,利用插件管理可以方便的扩展系统可读入的模型文件格式,从而能够更方便的对系统进行扩展;SceneGraph管理是对SceneGraph的管理,比如创建、遍历、销毁等;RenderGraph管理是对核心数据结构RenderGraph的管理,比如创建、遍历、销毁等;绘制管理主要对场景图SceneGraph的绘制过程,整个绘制过程分为场景状态更新App,场景可见性裁剪Cull和渲染绘制Draw三个阶段。
顶层,为用户接口管理层,提供方便的用户调用机制、消息处理机制,达到了耦合度低,扩展性强的目的,它包括I/O输入输出管理、事件接管适配器、VR应用接口和事件反馈适配器。
在绘制时,根据顶层(也即用户接口层)的调用请求,这种请求包括各种硬件设备发出的消息以及来自高层VR应用程序(如仿真平台)的方法调用,调用核心层中的插件管理模块读取所需的模型文件,通过SceneGraph管理模块生成SceneGraph,然后调用绘制管理模块对SceneGraph进行场景状态更新App、场景可见性裁剪Cull和渲染绘制Draw三个阶段的绘制操作。
本发明中的插件管理主要包含两个功能读取文件和提供统一插件接口。读取文件为读取各种三维模型、声音、文本、图像、视频等格式的文件提供一个统一的平台。图2为插件管理的实现类图,程序使用Read(filename)的形式来读取文件,插件管理模块接受到这个请求后,Registry类判断filename的后缀找到对应的读写类ReaderWriter(也即具体的DLL),然后通过DynamicLibrary类加载该读写类,并且该读写类通过RegisterReaderWriterProxy类进行注册,注册完毕后,Registry才能真正使用该读写类,并且把读取文件的请求发送给读写类,该读写类来读取程序需要的文件。提供一个统一的接口是用户可以按照这个接口增加其他插件,而不需要修改核心代码。例如,如果需要增加一个读取jpg格式的文件,用户只需要构造一个继承于ReaderWriter的读写类ReadWriterJPG,并实现acceptsExtension()方法、read()方法和write()方法即可,acceptExtension()方法提供对兼容性的判断,read()和write()方法来完成具体jpg文件读写。
本发明中的SceneGraph管理模块主要包含两个功能生成SceneGraph和遍历SceneGraph。
(1)生成SceneGraph通过调用插件管理模块,读取相应的文件,然后通过SceneGraph管理生成SceneGraph,图3为本发明生成的基本场景图,图4为生成的一个SceneGraph示例。
生成场景图的主要目的就是通过模型文件生成一个具有层次结构的场景图,也即通过各种Group节点和Leaf节点构成场景图骨架,所有的绘制元素(包括位置、颜色、纹理等信息)保存在Leaf节点中。
在场景图的构建过程中,会自动为该场景图的各个节点建立相应的包围球,包围球是可以包含节点中所有绘制元素的体积最小的球。包围球可以代表该节点的轮廓,在视域裁剪、碰撞检测中使用包围球代替实际节点可以加快裁剪速度和碰撞检测速度。
场景图构建后,用户如果需要对某个节点进行控制操作,需要对该节点增加一个回调函数,回调函数将会在绘制管理的APP阶段被调用。
在场景图构建过程中,本发明使用了Composite设计模式,它将对象组合成树形结构以表示“部分一整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。如图5所示。
Composite模式的关键是一个抽象类,它既可以代表简单元素,又可以代表简单元素的容器类。
在绘制场景图中,这个抽象类就是Node,它声明一些与特定图形对象相关的操作,例如ComputeBound(计算包围盒)、Traverse(遍历的传递)等,子类Leaf、Group、LOD、Switch、Transform分别定义ComputeBound、Traverse等的具体操作。Group类定义了一个Node对象的聚合。Group的Traverse、ComputeBound等操作是通过对它的自不见调用相应操作实现的。由于Group接口与Node接口是一致的,因此Group及其子类的对象可以递归地组合其他Group类型地对象。简而言之,Composite模式使容器既能包含简单元素,也可包含其他容器。
在场景中,具有众多不同类型的元素,比如光照、材质、纹理、几何形状、LOD节点,等等,将场景划分为不同类型的数据节点,这些不同类型的节点实体构成了层次化结构的场景图。图6的UML类图表示了主要节点的继承关系。
图6、7、8、9给出本发明生成的SceneGraph的场景图核心数据类型的继承关系类图。本发明中的SceneGraph类图涉及到了四种数据类型a.基本场景节点类型如图6所示Reference类型,用于引用计数。绘制引擎中所有类型都继承自Reference类,为了确保绘制引擎中基本节点类型的所有对象的完整性,所有对象由绘制引擎系统维持,不允许在栈上创建对象(由操作系统控制生存期),或调用delete销毁堆中存在的对象(二次开发人员控制),它通过利用C++语言的特性,将析构函数声明为私有来实现,并且所有对象的指针包含在一个模板类refptr<T>中,这个模板类重载了“=”号等操作,实现应用计数,当引用为零时,Reference对象自我销毁。
0bject是大部分类的基类,抽象了I/O方法,Clone方法。
Node类型,场景图中中间节点和叶子节点的共同基类,具有所有场景节点的共同属性和操作,比如包围盒的计算,遍历的传递,用户回调函数的调用等。
Group类型,所有场景图中间类型节点的基类,它包含了一个子节点的列表。
Leaf类型代表场景图中的叶节点,提供了对几何对象,图像等节点的容器和调用
Transform空间坐标变换类的基类,它包含一个四维矩阵,场景图中该类型节点以下的子树在坐标变换后的空间内。用于产生动态的效果。
LOD类型,层次细节模型的类型,它允许根据当前视点距离物体中心的距离切换模型的显示。它包含一个子节点的列表和显示范围(Range)的列表,这两个列表的元素一一对应,当视点与物体中心的距离在显示范围之内时,对应的子节点被遍历并绘制。当物体距离视点较远时,可以用低精度的模型取代高精度模型,减少绘制载荷。
Switch类型,它是Group节点类型的一种简单但有用的类型,它有一个子节点的开关状态列表,可以控制遍历零颗至全部的子树。可以用Switch节点来实现子图的显示和关闭。
Impostor类型,Group的子类型,负责几何绘制与缓存纹理绘制之间的切换。它有两颗子树,分别包含几何体的信息与缓存纹理的信息。
b.几何绘制对象类型,如图7所示,DrawObject类型,几何绘制对象的抽象基类。它声明了关于绘制对象的基本属性,即显示列表的使用与否和绘制属性状态集。DrawObject包含抽象的操作方法绘制,生成显示列表,立即绘制。DrawObject子类型的对象可被Leaf节点持有,代表具体的几何绘制信息。
Geometry类型,继承于DrawObject,专门处理几何体,根据几何体特有的属性对DrawObject的绘制方法进行了重载。几何体包含如下的信息位置坐标、纹理坐标、纹理坐标和颜色值等,这些信息全部保存在Geometry类中。
c.绘制属性类型,如图8所示StateSet类型,封装了OpengGL的绘制状态和属性。比如它可以包含纹理信息,并被DrawObject子类型的对象引用。StateSet可以被多个几何绘制对象共享节省在图形处理流程中的状态变化开销。
StateAtrrib类型,具体绘制属性的基类,包含编辑显示列表、立即显示等虚函数,光照Light、纹理Texture、材质Material等绘制属性都继承于它。
Primitive是提供使用数组绘制的基类,表示一种图元,基于数组的顶点法线等Texture类型,纹理类型的虚类。
Sprite类型,Texture类型的子类型,除具有纹理的特性以外,实现了生成缓存纹理以及保存缓存纹理等功能。
d.辅助类型,如图9所示Camera类型,封装了视点位置、方向以及投影焦距等属性,它对二次开发人员而言,模拟照相机的功能,对绘制引擎内部,则创建视图和模型矩阵。
Matrix类型,提供矩阵的表示以及矩阵的常用操作。能够构成基本图形变换操作的矩阵,如平移、旋转矩阵;可以构成投影变换矩阵,如透视投影和平行投影的矩阵;可以构成模型视图矩阵;提供矩阵左右乘法、求逆;提供矩阵与三维、四维向量的乘积运算等操作。
Vector类型,提供二维、三维、四维向量的操作。
(2)遍历SceneGraph在绘制引擎中,需要对场景图进行功能不同的遍历过程,例如App遍历,调用每个节点的用户注册回调函数;Cull遍历,进行可见性裁剪等。在本发明中使用Visitor模式遍历场景图,使用Visitor模式可以统一的表示作用于场景图中所有节点对象的类型安全操作(TypeSafe Operations),它使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
将这些遍历抽象为一个基类NodeVisitor,运用双向派遣(Double Dispatch)的方式,这种方式意味着得到执行的操作决定于请求的种类和两个接受者的类型调用NodeAccept(NodeVisitor*)接受遍历类型;Node对象将自己(this指针)作为参数,调用NodeVisitorApply(Node*);操作完成后调用NodeTraverse(NodeVisitor*),同样将NodeVisitor自己作为参数。Node在这个函数中根据遍历方式,调用子节点或者父节点的accept(NodeVisitor)函数。图10显示了Visitor模式的交互图,在这个过程中,NodeVisitor的apply函数是一个重载函数,根据不同的类型有不同apply实现体,因此它能够根据传入的node类型调用相应的操作。
Visitor使得场景图中的核心数据结构与访问它的操作相分离,大大降低了程序的耦合度,可以继承NodeVisitor,扩展遍历的行为方式;场景图部分也可以扩展数据类型,而只需要在Visitor一方定义新的处理函数。
本发明中的RenderGraph管理模块主要包含两个功能生成RenderGraph和遍历RenderGraph。生成RenderGraph结构的过程比较简单,该功能在绘制管理的CULL阶段调用,它的主要作用是把经过CULL阶段(经过裁剪和优化)后的绘制元素构成一个有固定层次的结构,也即RenderGraph。图11是生成RenderGraph示意图,其中(1)它有固定树形层次,树的深度永远为4。
(2)Render Graph只存储了Scene Graph中绘制元素DrawObject的信息。在Cull过程中,一个DrawObject生成一个RenderObject。
Render Graph中包含着Render Bin的集合,可以增加、删除Render Bin。在绘制RenderGraph时,将依次绘制其包含的所有Render Bin。
Render Bin目的是区分不用的绘制元素,例如所有透明物体放到一个RenderBin中,所有非透明的物体放到一个RenderBin中,每个RenderBin包含着Render Group的集合,可以增加、删除Render Group。在绘制Render Bin时,将依次绘制其包含的所有Render Group。Render Group是一组绘制元素的集合,也即Render Object的集合,可以增加、删除RenderObject。在绘制Render Group时,将依次绘制其包含的所有Render Object。Render Object是RenderGraph绘制过程中最基本单位,对于每一个RenderGraph的绘制最终都将转换到对于Render Object的绘制。
SceneGrapb经过CULL后,可见的绘制元素直接构成了RenderObject,并挂在RenderGroup下构成了RenderGraph,在绘制管理的Draw阶段将使用该RenderGraph。
遍历RenderGraph是在绘制管理的Draw阶段需要遍历RenderGraph,并把其中的RenderObject也即绘制元素送入绘制管道进行绘制,由于RenderGraph结构比较简单,而且为了提高遍历速度,采用了前续遍历的方式对其进行遍历。
绘制管理模块是整个绘制框架中非常重要的一个模块,它控制场景绘制流程。该绘制过程基于面向对象的思想,采用开放式的结构,使之易于结合多种快速绘制方法。实现中,采用SceneGraph管理模块中的Visitor模式遍历场景图。每一帧绘制过程可分为三个步骤App,Cull和Draw三个阶段,前两个步骤都是针对SceneGraph的遍历操作,而最后一个步骤则是针对RenderGraph而进行的遍历,如图12所示。
(1)App阶段该阶段的目标是处理场景数据动态变化,在每一帧绘制之前,对场景数据的必要修改,如物体位置的移动,光照的变化等。导致场景数据变化的因素包括用户的交互,如,漫游过程中视点的移动等;场景中各种对象之间的交互,如实体间的碰撞等;这里变化主要通过Scene Graph中各个节点上注册的回调函数来实现。
App阶段中,通过调用SceneGraph管理模块遍历Scene Graph,执行每个节点上注册的回调函数,改变该节点存储的内容,如矩阵,面片的几何数据,纹理和材质等。此外,为Cull阶段作一些必要的准备,如标记发生位置变化的节点等。
(2)Cull阶段该阶段依据场景和应用的特点,如场景的遮挡率,视点移动的速度等,选择快速绘制方法的应用策略,对场景数据作进一步处理,并生成适于绘制的Scene Graph绘制索引结构。
Cull阶段首先对Scene Graph结构进行遍历,依据视域剔除和LOD,剔除不可见节点,并生成绘制节点索引Render Graph;然后采用状态管理优化策略优化使得状态切换次数尽可能少,最后对Render Graph;为了优化绘制过程,采用状态排序的管理方案,在遍历SceneGraph后,通过视域剔除等操作,生成了所需的绘制元素,这些绘制元素中包含了顶点、纹理、光照等信息,如果直接通过这些绘制构成RenderGraph,然后通过Draw阶段进行绘制,在OpenGL绘制过程中,如果前后两个绘制元素状态不同(比如纹理),在绘制第二个元素时就需要切换OpenGL中的状态,这是一个非常耗时的操作,为了减少切换次数,采用了状态排序的策略对绘制元素进行状态排序,例如把状态相同的绘制元素尽可能的放在一起,然后通过这些排序后的绘制元素构成RenderGraph,这就时的在Draw阶段状态切换次数介绍,提高绘制效率。
(3)Draw阶段该阶段对Render Graph作进一步的处理和优化,使之适于生成绘制命令,最终完成绘制过程。
Draw阶段将遍历Render Graph,简化层次结构,并作相应的计算,如,求解模型空间中最终变换矩阵(将一绘制元素的平移、旋转等矩阵相乘)等,再调用绘制平台接口,生成绘制命令,并传递给OpenGL,完成绘制。
权利要求
1.三维场景实时绘制框架,其特征在于由三层体系结构构成顶层,为用户接口层,提供与中间层联系的调用接口,发出调用请求至中间层;中间层,为核心层,由插件管理、场景图管理、绘制图管理和绘制管理模块组成,当顶层有调用请求时,由插件管理模块读取位于外部的模型文件,然后通过场景图管理模块生成场景图,最后调用绘制管理模块对SceneGraph进行三步绘制操作,场景状态更新App阶段根据用户输入修改场景状态,场景可见性裁剪Cull阶段根据视点的位置对SceneGraph进行可见性剔除,并进行状态切换优化,然后调用RenderGrarph管理模块生成RenderGraph,渲染绘制Draw阶段根据RenderGraph生成底层的绘制语言,完成绘制操作;底层,为绘制语言管理层CGAL,封装了行业中存在的不同版本规格的绘制语言的所有状态和绘制属性,供绘制管理模块绘制时调用。
2.根据权利要求1所述的三维场景实时绘制框架,其特征在于所述的场景图管理模块采用Composite模式生成场景图时。
3.根据权利要求1所述的三维场景实时绘制框架,其特征在于所述的绘制管理模块的App阶段和Cull阶段采用Visitor模式遍历场景图。
4.采用权利要求1所述的三维场景实时绘制框架的绘制方法,其特征在于当顶层有调用请求时,由插件管理模块读取位于外部的模型文件,然后通过场景图管理模块生成场景图,最后调用绘制管理模块对SceneGraph进行App、Cull和Draw三步绘制操作场景状态更新App阶段、场景可见性裁剪CULL阶段和渲染绘制DRAW阶段,APP阶段根据用户输入修改场景状态,采用Visitor模式遍历场景图,处理场景数据动态变化;Cull阶段根据视点的位置,采用Visitor模式遍历场景图,对场景图进行视域剔除进行可见性剔除和LOD选择,生成绘制图,生成面向绘制的渲染序列,该阶段负载完全集中在CPU;Draw阶段根据绘制图生成底层的绘制语言,然后进行绘制,从而完成了一帧的绘制,下一帧继续循环APP、CULL和Draw三步,完成了整个场景的绘制。
全文摘要
三维场景实时绘制框架由三层体系结构构成底层,为绘制语言管理层CGAL,封装了行业中存在的不同版本规格的绘制语言的所有状态和绘制属性,供绘制时调用;中间层由插件管理、场景图管理、绘制图管理和绘制管理模块组成,当顶层有调用请求时,由插件管理模块读取模型文件,通过场景图管理模块生成场景图,最后调用绘制管理模块对SceneGraph进行App、Cull和Draw三步绘制操作,完成绘制操作;顶层,为用户接口层,提供方便的用户调用机制、消息处理机制。本发明提供了方便的用户调用机制、消息处理机制,达到了耦合度底,扩展性强和绘制效率提高的优点。
文档编号G06T15/00GK1763784SQ20051008695
公开日2006年4月26日 申请日期2005年11月23日 优先权日2005年11月23日
发明者赵沁平, 王莉莉, 杨跃东 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1