刘 浩 ,赵文吉 ,段福洲 ,曹 巍 ,潘李亮
LIU Hao1,2,3,ZHAO Wenji1,2,3,DUAN Fuzhou1,2,3,CAOWei4,PAN Liliang5
1.首都师范大学 资源环境与旅游学院,北京 100048
2.北京市城市环境过程与数字模拟重点实验室,北京 100048
3.三维信息获取与应用教育部重点实验室,北京 100048
4.中国科学院 地理科学与资源研究所,北京 100101
5.北京合歌科技有限公司,北京 100085
1.College of Resources Environment and Tourism,Capital Normal University,Beijing 100048,China
2.Urban Environmental Processes and Digital Modeling Laboratory,Beijing 100048,China
3.Laboratory of 3D Information Acquisition and Application,Beijing 100048,China
4.Institute of Geographic Sciences and Natural Resources Research,Chinese Academy of Sciences,Beijing 100101,China
5.Beijing Heegle Co.Ltd,Beijing 100085,China
管线分布在城市地下空间,构成了复杂的地下管线空间体系,传统的二维图形对管线的描述与表达具有很大的局限性,管线三维模型能够直观地描述管线的三维特征和空间关系,能真实地反映地下管线的空间分布状况,因此地下管线的三维建模已经成为数字城市建设的重要组成部分。
目前针对地下管线三维建模的研究主要通过三维建模软件(如Creator、3DMax等)和基于OpenGL建模实现。通过三维建模软件构建地下管线三维模型[1-2],虽然能够构造出较精细的管线模型但数据结构复杂、数据量庞大且不支持三维场景中的交互实时建模。因此地下管线的实时三维建模成为一个研究热点,目前大部分的研究均基于OpenGL[3-4]实现,主要的思路是采用连续四边形逼近管线模型,并采用合适的方法解决弯管和多连通管线问题,该类算法存在的局限主要有以下几点:(1)由于管线模型采用分段构造连续四边形的方法拟合生成,其拟合逼真度的提高将使模型数据量增大降低显示速度;(2)对于多连通管线节点的处理,很多研究采取建立管件模型库的方法,建模工作量大且不利于管线的实时建模;(3)目前的地下管线三维实时建模算法均基于CPU完成,在构建具有海量管线模型的管网系统时表现吃力。基于此,本文提出一种基于GPU编程的地下管线三维实时建模算法,该算法中CPU端只负责传入管径和管线中心线节点序列的坐标,将管线建模的几乎全部计算任务交由GPU端完成,尤其是利用GPU提供的Geometry Shader(几何着色器)自动生成管线的顶点数据并构建管线三角网能够进一步提高建模效率,该算法大大减轻CPU端的计算负载,并有效克服了目前基于OpenGL算法的局限,能够胜任各类地下管线的实时建模以及大规模地下管网系统的创建。
早期的GPU(图形处理器)不具备可编程性,其渲染管线只负责从内存中读取几何对象进行一系列矩阵变换最后输出并绘制,用户只能通过一些简单的函数打开或关闭渲染管线中的某个功能。而现代的GPU具备了很强的可编程性,用户可以通过编写高级着色程序控制渲染管线中的各个模块,极大扩展了GPU的功能,将原来由CPU承担的运算迁移到GPU完成[5]。
Geometry Shader是现代GPU对渲染管线可编程性的又一次扩展。它第一次允许GPU动态生成和销毁几何图元数据,大大扩展了GPU的功能。由于Vertex Shader(顶点着色器)每一次运行只能处理一个顶点数据,并且每次只能输出一个顶点的结果。在进行大规模数据计算时,几何图形的绘制任务量非常庞大,如果仅仅依靠Vertex Shader来完成效率较低,Geometry Shader能根据顶点的信息批量地处理几何图形,即可对顶点着色器输出的顶点数据进行函数处理,快速批量地产生出新的多边形顶点数据[6-8]。
利用Geometry Shader可对Vertex Shader输出的顶点数据进行函数处理并快速批量地产生出新的多边形顶点数据特性,本文设计由用户预先指定管线模型的管径,并通过鼠标交互选择管线模型的节点位置,即CPU端只传入管径和管线节点的坐标序列数据,而大规模的管线三维几何模型顶点数据的坐标计算、顶点数据的自动生成、基于顶点数据集的管线三角网构建以及管线表面纹理映射均在GPU中通过编写HLSL高级着色程序完成,算法的流程如图1所示。
图1 基于GPU的管线三维建模算法流程图
在平面图中将一段管线表示为一条直线,一般以其中心线来表示,而在三维透视图中则采用一段圆柱面来表示,以管线中心线作为圆柱面的轴心,管线截面半径作为圆柱面的半径。在虚拟现实中通常采用逼近法来表示,即将管线表面分成众多连续的四边形来拟合圆柱面[3],如图2所示。管线拟合的逼真度与管线表面等分数直接相关,管线表面等分越细,模拟管线在直观上就越接近真实管线,但模型的计算量也会增大,在传统的基于CPU的算法中,随着模型计算量增大,尤其是在构建一个具有大量管线模型的管网系统时,电脑的显示速度将明显降低。而在本文算法中,由于管线模型的计算工作全部交由GPU完成,不受等分数过大会影响绘制效率的限制,因此可选择一个较大的等分数从而获得一个较好的拟合效果。
图2 管线表面微分处理
以管线圆柱面的一个底面圆为例,阐述管线几何模型顶点坐标的计算方法。定义三维笛卡尔坐标O-XYZ为固定坐标系,局部坐标系o-xyz原点与底面圆s的圆心o重合,z轴为s的法线方向,y轴与固定坐标系Y轴平行,x轴根据左手法则确定。以x轴为起点沿逆时针方向将圆均分为n等份,每一等分所包含的夹角α=2π/n。则可以得出圆上第i点的坐标值为:
由空间解析几何可以得知三维空间中的顶点其参系坐标即该顶点在局部坐标系中的坐标(x,y,z)与固系坐标即该顶点在世界坐标系中的坐标(X,Y,Z)的对应关系如公式(2)所示。其中(x0,y0,z0)为参系原点在固系中的坐标,矩阵的9个参数为两轴系间的方向余弦,解算出矩阵参数后,即可代入求出管线断面圆上所有顶点的三维坐标。
Geometry Shader最大的特点就是能够快速批量地产生出新的多边形顶点数据,因此本文算法将管线顶点坐标的计算、管线顶点数据的自动生成以及管线三角网的构建全部移植到Geometry Shader中完成,为CPU端节省了大量的运算空间可以进行其他建模计算,提高管线实时建模的效率。此处阐述单根直管模型的构建步骤,关于弯管和多连通管线的处理将在后面给出。
(1)根据节点p1,p2和管径r确定管线圆柱的上下底面圆;
(2)根据管径r确定一个合适的管线表面等分数,管线表面等分数可设计算法根据管径的大小自适应选取,也可由用户设定;
(3)利用3.2节所述的方法计算管线圆柱上下底面圆上所有顶点的三维坐标;
(4)将所有顶点按照对应关系的顺序存储于管线三角网顶点数据集中;
(5)基于管线顶点集通过顺序连接相邻四边形对角线构建三角网,生成管线三维几何模型,如图3所示。
地下管线由给水、排水、燃气、热力、电力、电信和工业管道七大类组成[9],各类管线的材也多种多样,包括铸铁、合金、塑料、混凝土、陶瓷、橡胶等,可以通过为模型对象赋予相应的材质来模拟现实世界中的材质效果。用户可预先创建自定义管线材质纹理图,在建模时可根据需要选择相应纹理图进行纹理映射,纹理映射由GPU提供的Pixel Shader(像素着色器)完成,本文在实际建模时考虑到单根管线的材质一般保持不变采用了重复贴图的方式,简化了纹理映射的计算并且在管线表面产生环状花纹,配合光照的设置能够表现出较好的真实感视觉效果,如图4所示。
图3 管线三角网格生成
图4 三维管线纹理映射图
对于弯管连接如果直接连接两个管线的管口,会显得粗糙真实感差,因此将管线衔接处圆滑过渡,其实现方式为:将管线拐角以圆弧替代,弧线弧度等于相邻线段的夹角弧度,圆弧所在圆的半径等于管径,将圆滑处理后的管线中心线等分[3],每一等分的建模与单根管线建模方法相同,依次连接斜圆柱面生成弯管,建模效果如图5所示。
对于多连通管线节点的连接,很多研究利用建立标准的管件库来实现[3],但这种方法建模工作量大,适用范围小,不利于推广。本文采用直接相连,然后进行布尔切割运算[10],在节点处重构管线三角网以保证节点内部的连通性,该方法适用于三通及以上的多连通管线建模,无需判断连接处的管线数量,省去了管件库方法对每一个节点都需要选择相应管件模型的步骤,大大简化多连通管线节点处理的复杂度,建模效果如图6所示。
图5 弯管连接
图6 多连通管线连接
实验程序是在VS2008环境下使用C++语言和Direct3D完成,使用HLSL高级着色语言进行GPU编程。硬件配置为 Intel®CoreTM2 CPU 4400@2.00 GHz,2.0 GB RAM,NVIDIA GeForce 8500 GT显卡,1 GB显存。
图7展示了具有大规模地下管线模型的三维管网系统漫游时截图,该系统采用了本文介绍的地下管线三维实时建模算法,根据二维管网分布图及相关参数数据实时构建地下管线三维模型,最终生成三维管网系统。建模过程中系统运行流畅,即使在已经具备大量管网模型的基础上仍然可以流畅建模,并实现了完全的实时可视化建模。
图7 地下管线三维建模效果图
为了获得一个较好的管线拟合效果,本文将管线断面圆均分为64等份,也就是说每一段管线由128个三角形面片表示,表1展示了基于本文算法进行管线实时建模时随着管线数量的增加,系统渲染帧率和CPU占用率的变化情况。由表1可以看出,在地下管线建模过程中,随着管线模型的增加,由于该算法几乎将所有的计算任务全部交由GPU端完成因此CPU占用率呈现一个微弱的变化,空闲的CPU可以用来进行其他运算提高建模效率;在测试渲染帧率时将全部的管线模型均显示在渲染范围之内,因此随着管线模型的增加帧率会呈现出降低趋势,然而在实际建模过程中将只渲染经过可见性裁剪后的局部管线三角面片,因此能够保持一个较高的渲染帧率,从而支持大规模地下管线的实时三维可视化建模。
表1 地下管线实时建模实验实测数据
本文研究并实现了一种利用GPU编程的地下管线实时三维可视化建模算法,并对实验结果进行了分析。与现有的基于CPU的算法相比,该算法最大的优势是充分利用了GPU的运算能力完成建模过程中的绝大部分计算任务,尤其是利用Geometry Shader实现了管线顶点数据的自动生成归避了CPU与GPU频繁的数据传输,可有效提高地下管线实时建模效率。
本文只是从一个角度上将管线三维建模与GPU编程技术进行了结合,随着GPU编程性能的不断提高,使得以前一些效率不高的算法可以通过GPU编程重新实现,以获得一个满意的效果,利用现代GPU等高新计算机技术改善并进一步发展“数字城市”建设将成为数字城市可持续发展的必然。
[1]陈亚东,胡建平,王丽.城市地下三维管网建模技术研究[J].计算机与现代化,2010(8):77-79.
[2]瞿畅,张小萍.基于WTK的地下管网的虚拟设计[J].南通大学学报:自然科学版,2008,7(2):29-32.
[3]李清泉,严勇,杨必胜,等.地下管线的三维可视化研究[J].武汉大学学报:信息科学版,2003,28(3):277-282.
[4]简季,吴剑,杨武年,等.基于OpenGL的三维地下管线信息系统的设计与实现[J].计算机辅助设计与图形学学报,2004,16(10):1466-1468.
[5]刘磊,冯前进,王文辉,等.基于GPU的医学图像快速面绘制[J].计算机工程与应用,2007,43(32):189-191.
[6]Blythe D.The Direct3D 10 system[J].ACM Transactions on Graphics,2006,25(3):724-734.
[7]Microsoft Corporation.Direct3D 9 to Direct3D 10 considerations(Direct3D 10)[EB/OL].[2012-02-20].http://msdn.microsoft.com/en-us/library/bb205073.aspx.
[8]Microsoft Corporation.Reference for Direct3D 10[EB/OL].[2012-02-20].http://msdn.microsoft.com/en-us/library/bb205147.aspx.
[9]CJJ 61-2003中华人民共和国行业标准《城市地下管线探测技术规程》[S].北京:中国建筑工业出版社,2003.
[10]陈子辉,王丽,胡建平.DXF与OpenFlight API虚拟三维管网自动建模技术研究[J].测绘科学,2010,35(5):180-182.