一种倾斜摄影实景三维模型单体化方法
2018-07-03陈良超王俊勇重庆市勘测院重庆400020
陈良超,詹 勇,王俊勇(重庆市勘测院,重庆 400020)
利用倾斜摄影测量技术获取地面多视角影像开展实景三维建模是近年来快速发展的一种新兴城市三维建模技术[1-4]。由于该建模方法建模速度快,所生成模型真实性强,因而得到了快速发展和广泛的应用[5-6]。但是由于利用倾斜摄影技术进行实景三维建模得到的模型通常是近似格网分割的“表皮”模型,其结构为连续的三角面构成的表面模型,不能够区分出建筑、小品、道路、植被等地物单体信息,因此,在进一步开展数据分类、属性挂接等三维应用时,需要对倾斜模型进行对象化(或称单体化)操作,实现在“表皮”模型中识别出具体的建筑、小品、道路、植被等地物对象,从而支撑相应的三维应用开展。
目前,倾斜摄影实景三维模型的单体化[7-8]方式主要有3种:一是硬切分,直接利用对象矢量线范围将对象从倾斜模型中分割出来,形成独立的对象;二是ID单体化,事先根据对象矢量线范围对倾斜模型三角面进行分割,属于同一个对象的三角面赋予相同的ID;三是动态单体化,在倾斜模型进行最终展示时,通过间接方式实现矢量范围线内的模型高亮显示,从而实现单体化的目的。
本文提出的单体化方法属于动态单体化方法,根据单体化模型的底面轮廓信息,利用GPU编程技术,实现模型渲染时的动态单体化。该方法的主要特点为:用于存储模型单体化信息的可以不是一个矢量范围线,而是利用图像表达的对象范围,以图像表示范围的最小单元为像素,因此这种方式可以表示任意形状的对象(如中间有空洞或分割而导致不连续的建筑、小品或其他地物)。同时,本文采用GPU编程,在三维场景渲染时,开展动态单体化,方法效率高,实时性强,通过设置不同的显示颜色控制接口,能够实现单体化对象的高亮颜色更改和显隐控制。
1 技术路线
本文的技术路线如图1所示。首先,根据要进行单体化的模型,获得单体化对象的底面,底面来源包括基础测绘得到的底面矢量、手工勾画的底面轮廓范围等;然后生成底面轮廓纹理和底面模型,将底面模型和倾斜摄影实景三维模型加载到三维场景中,构造一个RTT(render to texture)相机,获得观察视点下的底面模型的RTT纹理,并利用投影纹理映射技术,将RTT纹理投影到倾斜摄影实景三维模型;最后通过GPU编程,根据底面纹理像素值,实现模型的单体化展示、颜色修改和显隐等操作,达到单体化展示、控制和应用的目的。
图1 单体化技术路线
2 底面模型
2.1 底面轮廓纹理
通常,单体化模型的底面轮廓信息以一个矢量多边形来表示,本文的底面轮廓纹理,是由描述单体化模型的底面轮廓信息的图片经过栅格化处理得到。相对于矢量表示的轮廓线,纹理图片表示的轮廓基于像素点来描述,因此可以表示任意的底面轮廓形状。例如,对于一个单体化对象,其底面轮廓可能为任意形状,既可以是简单的多边形,也可以包含1个或多个矢量多边形,多边形之间可不相交,也可以是中间有空洞的面等,如图2所示,相对于矢量表示的轮廓,纹理轮廓形式更加简单。进一步的,将获取的底面轮廓信息处理成底面轮廓纹理。底面轮廓纹理只包括两个值,属于对象底面的部分,像素值为W(255,255,255,255),其他位置的像素值为B(0,0,0,0)(也可设置为其他值,与W不同,alpha为0)。例如,若底面信息为矢量范围线,处理后矢量范围线及其内部的像素为W,范围线外的像素为B,若范围线中心有空洞不属于底面,则空洞部分像素为B。
图2 底面轮廓纹理
底面轮廓纹理的大小根据包围盒的大小和需要设置的精度(米/像素,即每个像素表示的长度)来确定,并将长宽转换成2的指数幂。设一个物体底面轮廓的包围盒长h,宽w,精度m,得到的纹理像素的长度th、宽度tw为
(1)
式中,[]表示取整。根据式(1)得到的纹理尺寸为2的指数倍,同时,限制纹理尺寸最大值为1024,最小值为16。
2.2 生成底面模型
底面模型用于确定底面轮廓纹理在三维场景中的位置,在进行单体化时,加载至三维场景中,使得底面纹理在XOY方向的投影恰好与三维场景中对应的单体化模型位置一致,如图3所示。
图3 底面模型
本文给出2种底面模型生成方法。一种是简单方法,计算出底面纹理图对应的三维场景中4个角点的空间坐标为A(xmin,ymin,z)、B(xmax,ymin,z)、C(xmax,ymax,z)、D(xmin,ymax,z),z值统一取一个任意值,如0,利用A、B、C、D4个点构建矩形,得到底面模型。将上一步得到的底面投影纹理作为底面模型所用的纹理,A、B、C、D4个点对应的纹理坐标分别为(0,1)、(1,1)、(1,0)、(0,0)。
另一种方法是根据底面轮廓纹理像素对应的所有顶点在XOY面的投影,计算出所有顶点的凸包,并赋予z值,得到凸包形式的底面模型,若有矢量面,可直接利用矢量面赋予z值得到底面模型。纹理同样使用的是底面投影纹理,根据模型4个角点A、B、C、D的坐标和顶点坐标(x,y),求得对应的纹理坐标(tx,ty),如下
(2)
此时,将底面模型加载到三维场景中时,底面模型与人工三维仿真模型在同一位置,其纹理显示的底面范围与人工三维仿真模型底面一致,由图3可以看到,底面轮廓纹理已与需要单体化的模型实现了位置匹配,底面模型可以被选中,即需要单体化的对象可以被选中,下一步的内容就是将底面轮廓纹理投影到倾斜摄影三维模型。
3 基于GPU的动态单体化
3.1 GPU可编程管线
图形处理器(graphics processing unit,GPU)也称图形处理单元。GPU是显卡的计算核心,被用于纹理映射和多边形着色等需要很多存储空间的计算机图形任务中。利用GPU进行一连串的图形处理任务被形象地称为“图形流水线”,即图形管线。图形管线的入口为顶点坐标和颜色纹理信息,可输出一帧适合当前显示器显示的图像。GPU可编程管线则可由程序控制管线的输入和输出[9]。
可编程管线目前包括多个图像处理器,本文主要使用OpenGL的顶点着色器(vertex shader)和片元着色器(fragment shader)。顶点着色器可以用于替代顶点和法线变换、纹理坐标生成和变换、光照及材质应用等传统管线命令;片元着色器则应用于替代纹理应用、雾化和像素汇总等工作[10]。
对倾斜模型需要进行单体化的区域,构造一个RTT相机,将其渲染至纹理,得到单体化对象底面模型的RTT纹理,在GPU可编程管线阶段,利用着色器语言,根据底面轮廓纹理的像素值,判断修改最终显示的片元颜色值,最后利用投影纹理映射PTM(projective texture mapping)技术,将纹理贴至倾斜三维模型场景上,实现倾斜三维模型的动态单体化。
3.2 RTT相机
渲染到纹理[11-12]指将渲染目标从系统帧缓存内取出,并生成一张纹理。利用渲染到纹理技术可以将场景渲染到纹理后进行后处理,因而被广泛应用到各种特效处理中,如3ds Max中,在UV展平后,可以将所有纹理合并成一张贴图。渲染到纹理通常包括4个步骤:确定用来RTT的渲染场景;创建RTT相机,创建纹理并绑定纹理和渲染对象到相机;利用RTT相机渲染场景;得到渲染后纹理。
RTT相机是用来构建渲染场景的相机,在单体化应用中,首先需要一个俯视的RTT相机,并创建一个空白纹理对象,将其绑定到RTT相机,用来存储最终的RTT纹理,纹理的大小可以根据显卡的性能设置,一般为2的指数幂。然后确定RTT相机的位置、投影方式及RTT相机的观察范围等,进而计算出相机的投影矩阵和视图矩阵。
图4为RTT相机示意图。a为场景主相机的视椎体,即透视投影,B为模型的包围盒(本文中用于单体化的底面模型,当场景中观察到多个单体化模型时,为多个模型包围盒的并集),c为a与B的交。此时,RTT相机为俯视相机,视椎体为d,视椎体恰好包围c,从而确定RTT相机的投影矩阵P和视图矩阵V。由上可知,RTT相机的参数由主相机和单体化底面模型决定。
图4 RTT相机示意图
将c渲染到纹理上,得到RTT纹理。此时,纹理分辨率ratio如下
ratio=texturesize/dsize
(3)
式中,dsize为d的顶面面积,即RTT相机的投影范围大小;texturesize为纹理的大小;ratio值越大,表示d顶面的纹理越清晰。d的顶面面积越大,RTT相机渲染到纹理得到的图片分辨率越低,反之越清晰。因此,纹理分辨率决定了单体化模型的边缘的光滑程度。分辨率越高,边缘越光滑清晰。由于RTT纹理尺寸为预设值,因此要提高纹理分辨率ratio的值,则要在可能的情况下减小dsize。在实际操作中,有以下措施:
(1) 控制主相机的视椎体大小,在保证场景的情况下,减小主相机的远近裁切面,从而减小求交部分c的大小,如图5所示,当B很大时,主相机只观察B的一部分时,自动调整f1、f2的值,使得主相机恰好包括视椎体的物体,减小a,从而减小c,进而减小d。
图5 RTT自动裁切面
(2) 在主相机接近水平时,主相机的远裁切面较大,此时,设置一个水平距离L,如图6所示,A点为主相机位置,AB为相机观察方向,与地球相切,r为地球半径,h为海拔高,根据几何关系,求得L,如式(3)所示。此时B所在位置为主相机远裁切面所在位置。若三维场景较小,可按整个场景的包围盒大小调整L的长度,同时当坐标系为平面系时,也可以按式(4)进行远裁切面的设置作为近似控制值。
(4)
图6 RTT自动裁切面设置
3.3 投影纹理映射
投影纹理映射(projective texture mapping),是指将一张纹理映射到物体上,类似于将幻灯片投影到墙上[13]。投影纹理映射的优点为:首先,用户不需要指定投影顶点的纹理坐标,不需要在三维模型建模或应用程序中计算出纹理坐标的值;其次,可以避免因插值带来的纹理坐标不均匀,从而产生纹理扭曲的现象。
投影纹理映射使用了OpenGL中的纹理坐标自动生成技术。其流程为:根据视点相机的位置、相机姿态,以及接收投影的物体顶点坐标,求出每个接收投影的物体顶点坐标所对应的纹理坐标,然后根据纹理坐标获取纹理的值,具体操作在顶点着色器中,利用视点矩阵投影矩阵获得[12]。
纹理投影矩阵如下
TVP=B×P×V×W
(5)
式中,TVP为纹理投影矩阵,作用是将顶点坐标转换成纹理坐标;B为偏移矩阵;P为RTT的投影矩阵;V为RTT的视图矩阵;W为模型矩阵。其中,P和V都可通过计算获得,模型矩阵W从模型中获得,而偏移矩阵B是将投影空间中的顶点坐标从[-1,1],归一化到[0,1],方法为先缩小1/2,再平移1/2。
在应用程序中计算出TVP以后,进一步在着色器中,使用TVP和模型顶点v,得到投影纹理坐标TVPT,如下
TVPT=TVP×v
(6)
根据投影纹理坐标,获取纹理中对应的像素值,在本文的单体化中,即获得了底面轮廓纹理的像素值,从而将倾斜摄影模型的顶点和底面纹理轮廓对应起来,当底面纹理轮廓像素值Pixel等于W时,该纹理单元显示为单体化模型的纹理单元,属于单体化模型,否则不属于单体化模型,见表1。对于不属于单体化模型范围的部分,由于底面模型纹理的a值为0,因此与倾斜摄影实景三维模型混合后的颜色依然显示为倾斜摄影实景模型的纹理颜色。
表1 单体化模型的判断
对于Pixel值为W属于单体化模型的像元,进一步设置最终颜色显示。设置一个颜色控制变量mColor,其类型为片元着色器语言中的一致性变量,根据mColor设置颜色的不同,修改单体化对象的最终显示的混合颜色。
此外,设置当mColor为H(0,0,0,255)时,可利用Discard方法或显示颜色为透明,实现挖洞功能,见表2。最终结果如图7所示,依次展示的模型隐藏,模型不同颜色选中。
表2 轮廓判断与显示
图7 单体化结果
4 试验与应用
本文利用重庆市互联网产业园及其周边的倾斜摄影实景三维模型开展项目试验,单体化模型信息来源于同区域的人工三维精细模型数据。试验采用三维平台为重庆市勘测院自主研发的集景三维数字城市平台。工作流程如图8所示,人工三维仿真模型通常为3ds Max制作的倾斜三维模型,为对象化的单体模型,通过利用俯视图,获取每个仿真模型所对应的底面轮廓纹理,建立底面模型,实现对同一位置倾斜摄影三维模型的单体化展示和应用。
图8 基于人工模型的倾斜摄影模型应用
图9为通过本文方法实现道路和建筑的单体化展示效果,可以利用图层开关设置建筑和道路的不同颜色。同时,可以对单体化对象进行显隐,例如,图10(a)为利用单体化技术,设置mColor为H(0,0,0,255),实现将所有的建筑模型隐藏,此时通过添加人工三维仿真建筑模型,实现倾斜摄影实景三维模型与人工三维仿真模型的共同展示,如图10(b)所示。图11为单独选中一栋建筑,并查询其ID值,因此,利用ID值可以进一步挂接属性信息,进而开展单体化应用。
通过多个场景的试验比较,在进行动态化时,场景的帧率变化很小,因此对三维场景的渲染效率影响小。通过以上试验证明,本文方法是有效的,并且运行效率高,效果较好。
图9 单体化道路和建筑模型
图10 建筑模型隐藏及显示仿真建筑模型
图11 选中单个建筑
5 总结与展望
本文通过底面轮廓纹理和底面模型的建立,实现了倾斜摄影实景三维模型单体化技术。由于底面信息采用纹理表示,因而可以实现像素级的任意形状的模型单体化;同时,基于GPU编程技术,可以高效、动态地实现单体化对象的颜色修改、显示和隐藏,从而为倾斜摄影实景三维模型的单体化应用提供了技术基础。进一步利用本文的实时动态单体化技术,可以在倾斜摄影实景三维模型上实现专题图的制作,进行模型任意的开挖,叠加三维仿真模型,也可以实现在倾斜摄影实景三维模型作为现状模型,叠加设计方案、开展方案对比等方面的应用。
参考文献:
[1] 黄健,王继.多视角影像自动化实景三维建模的生产与应用[J].测绘通报,2016(4):75-78.
[2] 朱国强,刘勇,程鹏正.无人机倾斜摄影技术支持下的三维精细模型制作[J].测绘通报,2016(9):151-152.
[3] 王琳,吴正鹏,姜兴钰,等.无人机倾斜摄影技术在三维城市建模中的应用[J].测绘与空间地理信息,2015(12):30-32.
[4] 谭仁春,李鹏鹏,文琳,等.无人机倾斜摄影的城市三维建模方法优化[J].测绘通报,2016(11):39-42.
[5] 李德仁,刘立坤,邵振峰.集成倾斜航空摄影测量和地面移动测量技术的城市环境监测[J].武汉大学学报(信息科学版),2015,40(4):427-435.
[6] 文雄飞,张穗,张煜,等.无人机倾斜摄影辅助遥感技术在水土保持动态监测中的应用潜力分析[J].长江科学院院报,2016,33(11):93-98.
[7] 王洪峰,李铁军,赵龙.倾斜摄影实景三维单体化模型自适应聚类算法[J].应用科技,2017,44(2):35-39.
[8] 王勇,郝晓燕,李颖.基于倾斜摄影的三维模型单体化方法研究[J].计算机工程与应用,2018(3):178-183.
[9] 仇德元.GPGPU编程技术:从GLSL、CUDA到OpenCL[M].北京:机械工业出版社,2011.
[10] 王锐,钱学雷.OpenSceneGraph三维渲染引擎设计与实践[M].北京:清华大学出版社,2009.
[11] 田壮,聂芸.基于RTT的三维模型标签实时显示技术[J].现代电子技术,2015(20):55-58.
[12] 王俊勇,詹勇.一种基于GPU的三维数字地形实时编辑方法[J].城市勘测,2016(1):93-97.
[13] 刘子才,胡谷雨,罗健欣.基于特征匹配的关联投影纹理映射[J].计算机与现代化,2016(1):64-68.
[14] SHREINER D.OpenGL编程指南(原书第7版)[M].李军,徐波,译.北京:机械工业出版社,2010.