基于Java3D的LOD算法的研究与优化

2013-07-13 08:36
天津职业院校联合学报 2013年2期
关键词:观察者视点激光器

季 婷

(天津新华职工大学,天津 300040)

虚拟现实系统和二维计算机图像技术不同,它注重于实时图形的生成,由于时间的限制,使得我们需要通过降低虚拟环境的几何复杂度和图像质量来保证实时显示效果。当场景很简单时,要实现实时显示并不困难,但往往为了达到逼真的效果,场景中会加入很多复杂的形体,并且还涉及到纹理处理、光照处理等操作,这就对实时显示提出了更高的要求。为了解决这个问题,以往的研究者都把主要目光放在了图形硬件加速器的发展上,高性能的图形工作站和高度并行的图形处理硬件是实现图形实时生成的一个重要途径。但是,虚拟现实系统对场景的复杂度几乎没有限制要求,因而,应用模型的复杂程度往往会超过当前图形工作站的实时处理能力。考虑到这一点,我们就需要从软件的角度出发,研究如何通过减少画面的复杂度,来实现复杂场景的实时显示效果。

一、几种降低虚拟场景复杂度的方法

虚拟现实场景构建的关键,在于如何降低场景的复杂度。

(一)预测计算法

根据各种物体运动的速度和加速度,来预测下一帧画面。在绘制之前估算出该物体下一步出现的位置,从而减少由输入设备所带来的延迟。

(二)场景分块法

它的思想是将一个复杂场景分成若干个子场景,各子场景之间几乎不可见或完全不可见。例如把一个建筑按房间划分成多个子部分,观察者在某个房间仅能看到房内的场景及与门口、窗相连的其他房间,这样系统就有效地减少在任意时刻需要显示的形体数目,从而有效地降低了场景复杂度。但是,这种方法仅能使用在封闭的空间内,对开放空间则难以使用。

(三)细节层次(Level of Detail,LOD)技术

指对同一个场景或场景中的物体,使用具有不同细节的描述方法得到一组模型,供绘制时选择使用。实际上,当物体投影在屏幕上所覆盖的区域比较小时,如果仍然对非常复杂的模型进行细节描述,不仅没有必要,而且会影响视觉效果,还会造成大量CPU处理资源和处理时间的浪费。在绘制时,如果一个物体离视点比较远,或者这个物体比较小,就可以用较粗的LOD模型绘制;反之,如果一个物体离视点比较近,或者物体比较大,就必须用较精确的LOD模型来来绘制。如图1所示,兔模型的远景结构可粗略构建,离视点越近,则构建越需精细。

图1 兔模型层次结构

二、LOD算法分析

LOD技术在不影响画面视觉效果的前提条件下,通过逐次简化景物的表面细节来减少场景的几何复杂性,从而提高绘制算法的效率。该技术通常对每一原始多面体模型建立几个不同逼近精度的几何模型。与原模型相比,每个模型均保留了一定层次的细节。当从近处观察物体时,采用精细模型,而当从远处观察物体时则采用较为粗糙的模型。同时,在两个相邻层次模型之间形成光滑的视觉过渡,即几何形状过渡,以避免视点连续地变化时两个不同层次的模型间产生明显的跳跃。这样,计算机在生成场景时,根据该物体所在位置与视点间的远近关系不同,分别使用不同精细程度的模型,避免了不必要的计算,既能节约时间又不会降低场景的逼真度,使计算的效率大大提高。如图2所示,用传统的LOD算法要对这栋房子建立三个LOD层次级别的模型,最右边为级别最低的,只有大致的房型轮廓,中图次之,拥有了一些细节描述,左边的图是级别最高的,各个细节也是最清楚的。

图2 房屋LOD三层次级别模型

可以想象,这样建立三个LOD级别的图像还是有跳变的,若想减少视觉差,就需要建立更多的级别模型来减少它们之间的差异,然而级别模型越多,数据的记录量就越大。

三、LOD算法在Java 3D中的实现

通过对LOD算法的描述可看出,为了满足实时要求,就要对一个物体按照视距的不同建立多个LOD模型,如图3所示。

图3 LOD层次模型

LOD算法可以应用在Java3D中,实现物体由远至近时的视觉变化效果。对于传统的LOD算法,可先在Java3D中定义各级的LOD层次模型,然后通过Switch类控制多个模型的显示条件,比如设定表示距离的数组,当视点处于某个位置时,观察者可看到LOD模型3,当视点距离不断拉近,LOD模型2、LOD模型1会相继替代前者依次显示出来。

LOD方法的实现要用到Java 3D中的DistanceLOD类,它实现的是基于距离的LOD策略,它对Switch对象根据该LOD节点到观察者的距离来选取其中之一作为可见的。它需要有一个有n个元素的单调递增的表示距离的数组,此外还需要一个含有n+1个Switch对象的列表。它根据距离数组和当前的距离来选择到底应该显示哪个模型。以三个分界点,四级LOD模型为例,传统LOD算法的结构如下:

四、LOD算法的优化

多个LOD模型的出现,意味着模型数据的急剧增加,如果是在大型场景构建中,按照传统LOD算法的思想,就要在场景中增加数量庞大的物体模型,以满足视距变化和实时运算。这样不仅使得代码量增大,而且在网络传输中为了传输这些额外的多级模型,将会占用不必要的带宽,降低网络应用率。

实际上,四级模型中有相当多的数据是完全冗余重复的。前面分析了传统LOD算法在数据重复方面有待优化,因此提出了通过建立共享模型的方法减少程序代码数据量,从而实现LOD算法的优化。在Java3D中,笔者利用SharedGroup共享类的特点,将其加入到LOD算法的实现过程中,用于定义基本共享模型。

在设计“量子点光子晶体光纤激光器”的实验场景时,有一部分是关于激光器内部激光发射原理的三维演示。当这部分场景运行时,观察者首先看到激光器的外部结构,包括激光器外壳和风扇叶;当操作者按住鼠标中键向怀内拖动物体时,激光器会随着鼠标被拉近,并且体积会随着距离的拉近而逐渐增大,扇叶开始转动;当继续拉近物体时,人的视野会产生穿过激光器外壳进入其内部的效果;最终,观察者可以看到激光器的内部结构,通过键盘和鼠标的控制,全方位观察光粒子的产生和发射的运动过程,如图4所示。

图4 量子点光子晶体光纤激光器

为了达到这样的效果,设计时把整个过程分成了三个分级点,即四级LOD模型。首先、将这四个模型分类,寻找它们的共同之处,利用SharedGroup建立基础共享模型;再将基础模型引入到四级模型中,并分别加入各自的特征变化形体。主要代码如下:

二、三、四级模型的建立思想与一级模型的建立相同。模型定义好后,使用Switch类将四级模型分隔在四个显示空间,某一视距位置下,只有一个空间处于可视状态,另外三个空间均不可见。主要代码如下:

四级模型和显示空间定义完毕后,开始定义三个分级点,它们可以用数组表示,三个分级点将整个空间距离分割成四段,当观察者移动视距达到某一位置时,相对应级别的显示空间中的模型便处于可见状态。

优化后的LOD算法与传统算法相比,其数据量有相当篇幅的减少,这种缩减在LOD更细层次的多级分层时表现得更为突出。同时,改进后的算法可以达到和传统算法一样的显示效果。

[1]张杰.Java 3D交互式三维图形编程[M].北京:人民邮电出版社,1999.

[2]祝奎臣.基于几何和图像的机舱漫游场景建模技术[J].船海工程,2006,(03).

[3]高新瑞.Java、Java 3D与计算机几何设计[M].北京:电子工业出版社,2007.

[4]都志辉.Java3D编程实践——网络上的三维动画[M].北京:清华大学出版社,2002.

猜你喜欢
观察者视点激光器
多普勒效应之新讨论
观察者对亲组织不道德行为的反应及其反馈效应*
用追击相遇的模型解释多普勒效应
基于PID控制的一体化恒温激光器系统设计
激光器发明60周年
“你看不见我”
基于980nm泵浦激光器的恒温驱动设计
环境视点
让你每天一元钱,物超所值——《今日视点—2014精萃》序
两会视点