高亦远,李 豪,葛荣存,李佳祺,李 创,佘江峰
(南京大学 地理与海洋科学学院 江苏省地理信息技术重点实验室,南京 210023)
自然景观是虚拟三维地理场景的重要组成部分,景观要素的相关渲染技术被广泛应用于地理信息系统、游戏、虚拟现实、动画等领域[1–3].作为自然景观中的常见要素,树木的表达一直是研究的热点和难点[4].由于树木形态自身的复杂性,树木的真实感表达与场景的渲染效率之间存在着矛盾[5,6]:由大量三角面片构成的模型虽然可以有效表达树木形态,但渲染效率较低,而使用较少几何面片构成的模型则真实感不足,二者都会影响用户体验.目前三维场景中树木的表达方法大致分为两类[6],一类是基于几何模型的绘制方法,另一类是基于纹理图像的绘制方法.
基于几何模型的方法通过算法简化树木模型,从而解决树木结构过于复杂导致的渲染耗时问题.例如:Remolar 等提出了树叶合并简化算法[7],将相似的树叶进行合并;郭星辰等提出了一种参数化的方式对植物形态特征予以集成和组织,满足了树木的共性特征[8];Lluch 等提出了多层次模型表示法[9],实现模型的简化;Zhang 等提出了基于植物器官的层次合并算法[10],引入了叶序、花序等概念来进行层次合并.以上方法虽能在单株树木上达到简化效果,但在渲染大规模森林场景时总体的渲染负担依旧繁重.在大规模植被的可视化表达方面,Li 等提出了一种基于图的中性景观模型,能快速生成具有真实感的森林景观格局,但在渲染性能方面还需要深入研究[11].
基于纹理图像的绘制方法将树木的几何模型用简单面片表示,其绘制工作量基本与树木的形态复杂度无关.布告板是这类方法的一种简单而典型的实现,其基本思想是将几何模型替换为始终朝向观察者的平面布告板,通过将物体某个角度观察的快照作为纹理贴到布告板上,从而减少动态渲染时的计算量[12].但是传统布告板的缺点也很明显,当视点变化时布告板上的纹理贴图不会发生变化,真实感比较缺乏.在布告板方法的基础上,相关学者提出了布告板云方法[13,14],该方法将树木拆解为多个布告板进行表达,在每个布告板贴上相应的纹理图片.这在一定程度上解决了单布告板缺少三维立体感的问题,但在表达精细的树木模型时需要大量的布告板面片,使得渲染时的计算量大为增加.Maciel 等提出了Impostor 方法[15],在预计算阶段将树木模型渲染到一个面,减少了几何复杂度.在此基础上孙雪波等又提出了基于动态Impostor 技术的树木快速绘制方法[16],可以实现树木的多角度表达,但视角变化时纹理仍需实时生成,实时计算量仍然很大.She 等提出了球面布告板的概念,使用不规则球面模拟树冠,与传统布告板相比,其几何复杂度和纹理复杂度略有提高,但对于特定树木可以取得较好的表达效果[17].
本文提出了一种新的布告板方法,使用单个平面布告板作为树木模型的几何替代物,根据视点位置动态切换与观察方向及距离最相适应的纹理贴图,所取得的树木三维表达效果与观察方位具有更好的一致关系.
自适应布告板方法首先需要获取多个观察方向以及视距上的树木纹理图片集合,可用于后期场景渲染时的动态选取.对于比较重要的树木(如古树名木),如需要还原树木的原貌,可以采用人工或无人机实地拍摄的方法,获得树木在不同距离或方位上的高清照片;对于数量庞大的普通树木,可以采用计算机模拟的方法分类获得多方位观察效果图.无论采用哪种方法,对于每一张图片,都要记录下该树木图片所对应的观察方位以及视距.以计算机模拟方法为例,有关过程如下:
在具有树木高精细模型的前提下,通过设置相机位置、光照、分辨率等渲染参数,利用三维软件获得同一树木在不同观察方位和视距下的渲染图像.具体步骤如下(图1):
1)将树木模型(高为h)置于原点,将模型高度的1/2 处设为树木的中心;
2)设定相机位置到树木中心距离r,保证渲染的树木完整,并设置水平及垂直方向的采样间隔角度;
3)根据水平和垂直方向间隔角,以及相机到树木的距离,确定相机的位置,渲染对应位置的纹理图片.垂直角θ、水平角σ与相机位置(X,Y,Z)间的公式如式(1)~式(3),渲染效果如图2所示.
在此过程中,应对生成的图片标注方位和视距等信息,以便于在漫游过程中,根据视点与树木的相对空间关系方便地选取最合适的图片作为纹理.
图1 树木的多方位视觉效果的生成示例
图2 同一树木的多方位渲染效果
与传统布告板相比,自适应布告板可以解决特定视角下的渲染缺陷,但也存在一些新的困难.传统布告板只需要将树木纹理图片的树根部位与地面相接就可将树木固定在场景中.使用自适应布告板时,树木根部会随着纹理图片的观察角度变化而发生渲染位置的变化.如图3所示,3 棵树木垂直观察角度分别为:0 度、50 度、90 度.当观察的垂直角由0 逐渐增加时,树根位置将由图像底部上移至图像中部.在场景中若根部定位不恰当就会出现图4所示错误.
为确保树木表达的准确性,需要在每次切换纹理图片时动态调整布告板的位置,使得树木根部定位点与地形高度一致,形成树木“长”在地上的效果.这需要对每张图片额外标注根部定位信息.本文采用的方法为固定树木中心点的位置,使树根在不同视角上都与地面相接.
具体步骤为:先测量一张水平角度生成的纹理贴图中树木根部距离图片底部的距离d1 及纹理图片的高度d2;然后,将布告板置于场景中,令其中心位置距离地形该点高度d2–d1 处.在调整后的场景中,无论从什么位置观察树木图片都可以保证树木根部与地形固定点相接.
图3 树根位置变动示意图
图4 树根定位的错误效果与正确效果比较
传统布告板使用一张纹理图片表示物体,减少几何复杂度,提高渲染性能.当视点发生变化时,旋转布告板,使其始终面向相机位置.但观察角度发生变化时,纹理图片并不会发生改变,影响真实感.
自适应布告板的主要思想是,生成目标物体的多视角纹理图片集,根据布告板与视点的相对方位关系,从多视点纹理图片集中选择与观察角度最契合的纹理图片在布告板上显示.
当视点位置发生变化时,则自动切换布告板上的纹理图片,使之与视角同步变化,实现观察效果与观察角度的一致.这样,可以使布告板展现出近似真实模型的效果.
自适应布告板方法具体包括以下几个步骤:
1)预先生成(或拍摄)树木在各个相对方位与距离上的树木纹理图片;
2)根据视点和布告板的相对位置关系得到观察方向和距离;
3)根据观察方向计算旋转矩阵,调整布告板位置,使其朝向相机位置;
4)寻找与观察方向和视距最匹配的图片,并将图片用作为纹理更新到布告板上;
5)当视点移动时,从第2 步开始新的纹理选择过程.
根据视点P1(x1,y1,z1)布告板中心P0(x0,y0,z0)计算水平角θ与垂直角σ的公式为:
根据计算得到的水平角和垂直角,查询距离该点位置最近的纹理图片.依据由水平角θ与垂直角σ推算出的旋转矩阵来调整布告板的方向,使其始终朝向相机.
纹理查询的直接方法是遍历已有图片对应的拍摄控制点,分别计算控制点到观察点的相对方位和距离,并选择最接近的控制点所对应的纹理图片.但是当纹理图片集合较大时,遍历全部拍摄控制点代价过大.改进办法是:基于观察点位置查询其周围特定范围内的拍摄控制点,以减少比较次数.
根据纹理图片的获取方式及其方位信息,可将纹理图片查询分为规则和不规则两种方式.三维软件渲染生成的纹理图片相机位置精确可控,相邻控制点间水平角或垂直角间隔一致,根据观察点位置以及水平与垂直间隔角可以快速确定周围的4 个拍摄点,从中选择最近拍摄点的纹理图片.但真实拍摄的影像纹理图片难以精确控制其拍摄方位,拍摄位置分布也具有不规则性等特点,在这样的拍摄图片集中寻找合适的纹理面临较大的困难,需要利用已有的拍摄控制点生成空间 Delaunay 三角网,再确定观察方位点所在三角形,最后寻找与视点最近的点所对应的纹理图片(图5).
基于自适应布告板的树木表达方法有效减少了场景交互过程中的树木渲染计算负荷,能够在计算能力较弱的平台上更流畅地渲染三维树木.但在图片较多的情况下,纹理读取和加载的压力也会变大,需要一种合适的纹理加载方法以提高效率.本文采用异步加载以及缓存相结合的方法,算法过程如图6所示.
一般来说,从硬盘或网络中加载纹理图片耗时长,如果减少纹理图片的加载次数将会有效减少系统的IO 压力.利用纹理图片缓存技术,可以减少加载重复纹理的时间消耗[15,18].但纹理图片缓存也有弊端:缓存过多纹理图片会占用大量的内存,这会导致计算机性能的严重下降.可设置一个定长的图片缓存队列,当缓存图片数量超过队列长度时,主动释放哪些早先加载但使用频率较低的纹理图片.
图5 纹理图片规则(左)与不规则(右)寻址示例,红色圆点为观察点,黑色圆点为拍摄控制点
图6 纹理图片加载流程图
本方法总体的流程如图7所示.
基于浏览器的三维场景渲染是三维应用的一个热点,和桌面应用软件相比,Web 应用最大的优势是客户端免安装,但浏览器又是一个典型的渲染计算能力比较弱的环境,能否在浏览器环境提供可接受的渲染性能是本文方法是否可用的一个重要验证.本文基于WebGL 技术检测浏览器端的树木渲染效果.软件环境为Chrome 63,WebGL 1.0.硬件环境为:CPU Intel Core i7 2.6 GHz,内存8 GB,GPU 为NVIDIA GeForce GTX1060,显存3 GB.
实验中使用3DS 格式树木模型,来源于archibase.net 网站,选用了6 种树木模型,顶点数84 441 至1 516 168不等,模型数据量大小为2.25~38.5 MB 不等.使用Blender 软件将树木模型渲染生成纹理图像集合,采用的水平角间隔和垂直角间隔均为2 度,对每种树木各渲染了8280 张图片,构成了树木的纹理图片集.
图7 自适应布告板法总体流程图
相较于传统布告板方法,自适应布告板树木表达方法有效改进了非水平方向观察时存在的真实感不足问题(图8).在表达大规模树木时,为了避免树木在观感上过于整齐一致,为树木增加一个随机的水平扰动角度,使得从同一方向观察的不同个体树木的效果有所差异,增加了场景的总体真实感(图9).
图8 传统布告板与自适应布告板对比
图9 三维场景中树林的表达
在表达树林场景时,如果使用常规的几何模型方法,每增加一棵树木都会增加大量的几何面片,消耗大量的计算资源.使用纹理贴图替代几何模型表达树木后,增加一棵树木只会增加渲染纹理图片的存储空间,不会显著增加更大的计算压力.此外,由于同类树木可以共享纹理图片库,对于这种情况,纹理图片的存储和管理事实上不会增加过多的额外负担.
试验表明,在包含100 棵树木的三维场景中动态漫游时,浏览器渲染帧率可达到60 fps;在由500 棵树木构成的场景中,纹理图片加载完成后,仍能以50 fps以上的帧率运行.
若直接使用高精度的树木三维模型,受浏览器性能的限制,仅包含100 棵树木的三维场景就已经卡顿严重,甚至难以运行,十分影响用户体验;若使用传统的布告板方法,虽然渲染帧数得到了保障,但有明显的“纸片感”,这种问题在俯视的情况下尤甚.
自适应布告板树木表达方法使得渲染效率显著提高,场景交互更为流畅,在真实感表达方面也显著优于传统的布告板技术.
本文提出自适应布告板的树木表达方法,在预先生成的树木的多方位图像中,根据视点变化动态检取最匹配的图像作为纹理,在布告板上实时动态切换纹理,在有效减少场景中树木的几何复杂度的同时,提高了树木的真实感效果,取得了渲染效率与渲染效果的较好平衡,对于渲染计算能力较弱的环境(如Web 浏览器)也具有很好的适用性.
进一步研究可考虑继续优化树木的纹理图片获取方法和纹理加载算法,进一步降低纹理图片加载的负担;同时考虑为树木添加阴影效果,增强三维场景的真实感.在此基础上,还可以考虑为常见树木种类建立纹理图片库,以满足更为广泛的应用需求.