一种面向虚拟现实三维图形引擎的三维场景组织方法

文档序号:6518254阅读:238来源:国知局
专利名称:一种面向虚拟现实三维图形引擎的三维场景组织方法
技术领域
本发明涉及一种面向虚拟现实三维图形引擎的新的场景组织方法,属于计算机虚拟现实和计算机图形学技术领域。
背景技术
虚拟现实作为一种高度逼真的模拟人在自然环境中视、听、动等行为的人机交互技术,要求计算机所创建的三维虚拟环境足够真实可信,这无疑会牵涉到众多领域的各种前沿技术。如果为每个虚拟现实应用都去重新研究和实现这些技术细节,无疑会浪费大量的时间、精力和资金。图形引擎就是在实现部分底层技术的基础上,对其进行整理和封装,形成一个开发框架,使得应用开发人员不必再关心底层技术的实现细节,从而大大减少开发人员的工作量和工作难度,缩短开发周期。由于图形引擎是对特定应用的一种抽象,在不同的领域中,图形引擎需要解决的问题不一样,故而其功能也不尽完全相同,在虚拟现实领域,图形引擎侧重于交互和绘制的实时性。无论是交互还是绘制都涉及到场景中的实体,所以如何组织场景中的实体是三维图形引擎中的核心问题,好的场景组织方式不仅有利于内存的管理,而且能够加速场景绘制,同时还方便实时交互的实现。特别是当场景越来越复杂时,场景组织方式就愈发显得重要。
随着虚拟现实、仿真技术和三维游戏的发展,三维图形引擎的发展非常迅速,涌现出了很多商业的和开源的图形引擎,如OpenGVS、OGRE、OSG、OpenSG等,但是它们在场景组织方面各有优缺点。OpenGVS是Quantum3D公司开发的一个面向仿真的商业软件,场景组织是它的核心技术之一。OGRE是一个面向三维游戏的图形引擎,它把系统分成了很多模块,如资源管理、场景管理、渲染管理,这对系统的内存管理来说非常方便,但是OGRE的场景组织方式不能方便地表现细节层次(Level of Detail,LOD)、开关(Switch)、自由度(Degree of Freedom,DOF)等特殊节点,因此在实时交互的实现上存在一定的困难。OSG、OpenSG是开源软件,它们采用场景图对场景进行组织,这种场景图能够比较好的描述模型中各种类型的节点,但是它们采用有向非循环图(Directed Acyclic Graph,DAG)的方式实现模型共享,对每个节点实行引用计数,当引用为零时便释放内存,这种内存管理方法实现起来比较复杂,不如OGRE的简单。


发明内容
本发明的技术解决解决问题克服了现有技术中的不足,提供了一种面向虚拟现实三维图形引擎的三维场景组织方法,采用这种场景组织方法不仅有利于内存的管理,减少内存开销,而且能够加速场景绘制,同时还方便实时交互的实现。
本发明的技术解决方案一种面向虚拟现实三维图形引擎的三维场景组织方法,其特点在于包括下列主要步骤(1)加载模型文件,加载模型时在内存中采用场景图保存模型文件中的信息;(2)在场景中添加实体,每个实体对应一个模型文件,在场景中添加实体,也就是实例化模型,在实例化的时候,仅仅引用共同的部分(几何信息),而对不同的部分(非几何信息)进行复制,这样既节约了内存,又保证了实体间的独立性,整个场景中只有一个场景根节点,每添加一个实体,相当于在场景根节点上添加一棵子树,所有的子树和场景根节点构成最终的场景图。
由资源管理模块负责加载场景中的各种资源,包括几何模型、纹理图片等,并且通过维护一个资源列表来管理这些资源。加载模型的步骤首先读取资源文件的名称,然后遍历资源列表,根据资源文件的名称查看该资源是否已经加载,如果已经加载,直接返回指向该资源文件的资源指针,否则,创建资源对象,接着根据资源类型调用不同的加载器进行加载,如果加载失败,直接返回空指针,否则资源加载器把资源文件中的数据读取出来并保存到新建的资源对象中,并将指向该资源文件的资源指针添加到资源列表中,然后返回资源指针。程序结束的时候,资源管理模块遍历资源列表,逐个删除资源对象,从而防止内存泄漏。
由场景管理模块通过维护一个实体列表和场景根结点来管理场景中的实体,共同构成一个大的场景图。在常用的模型文件中,如vrml、flt、3ds等,其内部一般采用层次树状结构进行组织,这种层次树状结构通常包含一个根节点、若干内部节点和叶子节点。最顶层的节点是根节点,它没有父节点;叶子节点保存着需要绘制的实际几何体,它没有任何子节点;内部节点至少有一个子节点,这样,如果根不是树中唯一的节点的话,那么它也是一个内部节点。一个单独的模型本身就是一个场景图,模型加载后产生的资源指针实际上指向的是该场景图,而每一个实体都对应一个唯一的名字和资源指针,将实体加入场景,实际上就是把对应资源指针指向的场景图做为场景根节点的子树加入场景图,从而与其它实体一起构成一个更大的场景图。具体的添加实体的流程图如下首先获取实体名称和对应的资源文件名称,然后遍历实体列表,根据实体名称查看该实体是否已经在场景中,如果同名实体存在,则直接返回空指针,否则,调用资源管理模块,根据资源文件的名称获取对应的资源指针。如果资源指针为空,直接返回空指针,否则,根据实体名称和返回的资源指针创建实体。在创建实体的时候,仅仅复制资源指针所指场景图的内部节点部分,组成一棵以实体名称为根节点的子树。然后把子树做为场景根结点的子节点,从而将实体添加到场景中。除了添加实体外,还可以删除和修改场景图中的实体或者实体的子部件。在程序结束的时候,场景管理模块遍历实体列表,逐个删除实体对象,从而防止内存泄漏。
两个模块相互协作共同实现场景组织和资源共享。一个复杂的场景通常由多个实体组成,每个实体对应一个模型,当创建实体的时候,最直观的办法是先创建一个实体,加载对应的模型文件,读取并保存模型文件中的数据。虽然这种方法实现起来非常简单,但是因为每创建一个实体都要读取并保存模型文件中的数据,所以非常耗内存和时间,当场景非常复杂的时候,这个问题就更加突出。逼真性和实时性是图形学应用的两个相互制约的目标,相对而言,虚拟现实领域更侧重于实时性。在对场景中的实体进行建模的时候,为了降低建模难度和工作量,对相同或相近的实体通常采用相同的模型,即只建模一次,比如,为了绘制森林,虽然森林里存在很多棵树,但是在建模的时候可能只对其中的一棵树进行建模,这样就导致场景中存在大量实体对应同一个模型。在这种情况下,可以通过加载一次模型,多次实例化来创建多个实体。这样可以减少加载模型文件的次数,从而减少内存和时间开销。为了方便内存管理,将加载模型和创建实体分别放在资源管理模块和场景管理模块中实现,即资源管理模块在内存中保存各种资源数据,场景管理模块通过指针来引用共享资源。这里的共享资源仅限于几何信息,这是因为,在模型文件的场景图中,叶子结点用来保存各种几何信息,也就是用于绘制的大量数据,如三维模型的点、线、面的信息,这部分数据在整个运行过程中是不变的。内部节点用来表示几何信息之外的其它信息,包括纹理、变换、细节层次、绘制状态、光源以及其它要素。这些信息很多是可以通过用户交互来改变的,例如,可以将光源放置在一个内部节点上,这个节点影响其子树的内容,用户可以通过操纵该内部节点,来打开、修改和关闭光源;另外一个示例是变换,在一个内部节点内保存变换信息,用户通过改变这些信息,从而实现对其子树的旋转、平移等操作。所以当创建一个实体的时候,必须复制它所引用的模型的场景图中的内部节点,而仅仅共享其叶子节点,即几何信息。这样可以保证引用同一模型的不同实体之间的交互独立性,也就是说,对其中的一个实体进行操纵,不会影响到引用同一个模型的其它实体。
资源管理模块和场景管理模块在程序初始化阶段运行,运行的结果就是把整个场景组织成一个以场景根节点为根节点的场景图。使用场景图的方式组织场景,很容易实现对LOD、Switch、DOF等特殊节点的支持,这样,不仅使场景易于组织和扩展,而且还方便实时交互和绘制的实现。如果对场景图中的每个节点计算它的包围体,还可以方便实现碰撞检测和视锥裁减。
本发明与现有技术相比的有益效果是场景组织由资源管理模块和场景管理模块协作完成,这样不仅方便内存管理,而且当场景中存在大量重复出现的复杂实体时,采用这种方法可以很容易实现一次加载模型,多次实例化,从而大大减少内存和时间开销;使用场景图的方式组织场景,提供对LOD、Switch、DOF等特殊节点的支持,不仅使场景易于组织和扩展,而且方便实时交互和绘制的实现。如果对场景图中的每个节点计算它的包围体,还可以很方便实现碰撞检测和视锥裁减。


图1是立方体模型(cube.flt)的层次结构图;图2是立方体模型(cube.flt)加载后在内存中的层次结构图;图3为本发明实施例坦克模型(t72.flt)加载后在内存中的层次结构图;图4为本发明中的资源管理模块中加载模型的流程图;图5为本发明的场景管理模块中添加实体的流程图;图6为本发明资源管理和场景管理之间的关系图;图7本发明实施例加入第一辆坦克(tank 000)后的场景图。
具体实施例方式
实施例虚拟战场。战场中存在大量的重复的实体,比如树木、坦克、士兵等。为了描述简单,同时还能说明问题,假定战场由1000辆坦克组成,并且这些坦克均来自同一个坦克模型(t72.flt)。
图1是一个简单模型——立方体模型(cube.flt)的层次结构图,它包含3个内部节点和6个叶子节点。其中,3个内部节点分别是一个根节点、一个Group节点、一个Object节点;6个叶子节点分别保存组成立方体的6个面的几何信息,比如说,一个面由四个顶点组成,一个顶点的信息包括顶点的颜色、位置、法向量和纹理坐标。
加载模型的时候,把用于绘制的几何信息统一放在一个节点(GeometrySet)内保存,图2和图3分别是立方体模型(cube.flt)和坦克模型(t72.flt)加载后在内存中的层次结构图。
如图4所示为资源管理模块中加载模型的流程图,开始,读取资源文件的名称,然后遍历资源列表,根据资源文件的名称查看该资源是否已经加载,如果已经加载,直接返回指向该资源文件的资源指针,如果没有加载,根据资源类型(目前可以处理的资源文件有两种3ds和flt)调用不同的加载器进行加载;如果加载失败,直接返回空指针,否则将指向该资源文件的资源指针添加到资源列表并返回。结束加载模型。
如图5所示为场景管理模块中添加实体的流程图,开始,获取实体名称和对应的资源文件名称,然后遍历实体列表,根据实体名称查看该实体是否已经在场景中,如果同名实体存在,则直接返回空指针,否则,调用资源管理模块,获取资源文件对应的资源指针;如果资源指针为空,直接返回空指针,否则,根据实体名称和资源指针创建实体。在创建实体的时候,复制资源的内部节点部分,组成一棵以实体名称为根节点的子树。然后把子树做为场景根结点的子节点,从而将实体添加到场景中。
如图6所示为资源管理和场景管理之间的关系图,其中虚线上方是场景管理模块,场景中有唯一的根结点,圆代表内部节点,内部节点包括Group、LOD、Switch等,它们共同构成树状结构;正方形代表叶子节点,它们包含指向资源管理模块中的各种几何信息的指针,虚线下方是资源管理模块,三角形代表存放在内存中的各种几何信息,场景管理模块通过叶子节点中保存的几何信息的指针来访问资源管理模块中的几何信息。
图7是加入第一辆坦克(tank 000)后的场景图。整个场景图有一个唯一的场景根结点(Scene Root),场景中每加入一个实体,相当于将以该实体名字命名的根结点的子树做为场景根结点(Scene Root)的子节点,从而构成更大的场景图。
这种场景组织方式可以方便用户操纵实体和实体子部件,这是通过改变场景图中内部节点的属性信息来实现的。比如,可以通过改变Group节点(tank 000)的平移和旋转属性来控制坦克(tank 000)的位置和朝向;还可以通过改DOF节点(barrel)的属性控制炮管绕着炮塔旋转。
场景图中的节点通常有一个包围体,可以利用包围体来做碰撞检测和视锥裁减;场景图还支持LOD、Switch等特殊节点,这些都可以加速场景绘制。
权利要求
1.一种面向虚拟现实三维图形引擎的三维场景组织方法,其特征在于包括下列主要步骤(1)加载模型文件,加载模型时,在内存中采用场景图保存模型文件中的信息;(2)在场景中添加实体,每个实体对应一个模型文件,在场景中添加实体,也就是实例化模型,在实例化的时候,仅仅引用共同的部分,即几何信息,而对不同的部分,即非几何信息进行复制,整个场景中只有一个场景根节点,每添加一个实体,相当于在场景根节点上添加一棵子树,所有的子树和场景根节点构成最终的场景图。
2.根据权利要求1所述的面向虚拟现实三维图形引擎的三维场景组织方法,其特征在于所述的加载模型文件由资源管理模块负责,其加载的步骤为开始,读取资源文件的名称,然后遍历资源列表,根据资源文件的名称查看该资源是否已经加载,如果已经加载,直接返回指向该资源文件的资源指针,如果没有加载,根据资源类型调用不同的加载器进行加载;如果加载失败,直接返回空指针,否则将指向该资源文件的资源指针添加到资源列表并返回,结束加载模型。
3.根据权利要求1所述的面向虚拟现实三维图形引擎的三维场景组织方法,其特征在于所述的在场景中添加实体由场景场景管理模块负责,其中添加实体的步骤为开始,获取实体名称和对应的资源文件名称,然后遍历实体列表,根据实体名称查看该实体是否已经在场景中,如果同名实体存在,则直接返回空指针,否则,调用资源管理模块,获取资源文件对应的资源指针;如果资源指针为空,直接返回空指针,否则,根据实体名称和资源指针创建实体。在创建实体的时候,复制资源的内部节点部分,组成一棵以实体名称为根节点的子树。然后把子树做为场景根结点的子节点,从而将实体添加到场景中。
全文摘要
一种面向虚拟现实三维图形引擎的三维场景组织方法,属于计算机虚拟现实和计算机图形学技术领域,其特征在于(1)加载模型文件,加载模型时,在内存中采用场景图保存模型文件中的信息;(2)在场景中添加实体,每个实体对应一个模型文件,在场景中添加实体,也就是实例化模型,在实例化的时候,仅仅引用共同的部分,即几何信息,而对不同的部分,即非几何信息进行复制,整个场景中只有一个场景根节点,每添加一个实体,相当于在场景根节点上添加一棵子树,所有的子树和场景根节点构成最终的场景图。本发明不仅方便内存管理,而且当场景中存在大量重复出现的复杂实体时,可以很容易实现一次加载模型,多次实例化,从而大大减少内存和时间开销。
文档编号G06T1/00GK1710607SQ20051001213
公开日2005年12月21日 申请日期2005年7月8日 优先权日2005年7月8日
发明者梁晓辉, 赵沁平, 余江英, 车英慧 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1