APP下载

基于Unity3D的三维建筑快速可视化算法研究

2021-11-03航天宏图信息技术股份有限公司上海宏图空间网络科技有限公司刘富乾

电子世界 2021年18期
关键词:墙面顶点纹理

航天宏图信息技术股份有限公司 上海宏图空间网络科技有限公司 刘富乾

航天宏图信息技术股份有限公司 王 芬

航天宏图信息技术股份有限公司 上海宏图空间网络科技有限公司 廖芳芳

航天宏图信息技术股份有限公司 管占磊 王 新

通过实现三维建筑物快速可视化,真实还原建筑物模型及其自身整体风格、规模和形态,可以有效地提升三维数字城市建设效率,有利于城市发展规划。针对目前大多数建筑物三维可视化方法重点关注建筑物建模方法与可视化展示,忽略了模型在现实三维世界中的真实表现,本研究提出一种基于Unity3D和GIS建筑物数据实现快速可视化的算法,通过预制大量真实世界建筑物屋顶和墙面的纹理贴图资源,为建筑物模型随机且均匀地按需贴图,实现三维建筑物逼真显示,并通过纹理拼接的方式用一张图保存丰富的纹理贴图信息,使得资源内存加载得到了优化,提升了三维模型可视化的效率。对比实验结果表明,本研究提出的方法可以快速实现三维建筑物的真实可视化。

随着我国数字化城市的建设,三维数字城市在城市规划中发挥着重要的作用,建筑物三维可视化作为其中关键技术之一,越来越受到人们的关注。近几年来研究人员也对其进行了相关的研究,如Grou等介绍了一个场景分析系统,该系统利用建筑物立体像对和轮廓信息实现建筑物表面建模。M.Pollefeys等提出一种从场景图像序列中自动提取纹理化三维曲面模型的方法。陈爱军等提出利用城市航空立体像对实现三维建筑物全自动建模的方法,该方法利用匹配生成的三维信息对二维建筑物轮廓线进行三维插值,获得建筑物的三维信息,由此实现了建筑物三维建模。朱国敏等针对抽象的建筑物面对象提出基于三角剖分的规则建筑物批量三维模型构建方法。朱庆伟等提出一种基于三维激光扫描仪的建筑物建模方法,该方法利用三维激光扫描仪获取建筑物的二维几何数据和三维位置点数据信息,结合二者实现三维建筑物建模。

现有的建筑物三维建模方法大多关注在建筑物模型的可视化表现上,缺乏对建筑物自身整体风格、规模、形态等的关注,使得建筑物模型表现缺乏真实性。另外,精细建模使得大范围三维建筑物快速可视化变得困难,数据量也给后期的空间分析带来诸多不便。本研究分析现有建模方法的不足,在实现建筑物建模的基础上,针对建筑物模型的特点,使用多种真实小范围纹理图案拼接形成一张建筑物屋顶拼接纹理图案和一张墙面拼接纹理图案,仅用两张纹理图案缓解了计算机内存消耗,在真实还原三维建筑物的同时提升了建模效率。

1 研究方法或原理

本研究首先对建筑物Shapefile矢量数据进行提取、解析、处理,然后利用建筑物二维几何坐标信息和高程信息实现三维建模,并利用Unity预制的贴图纹理资源对三维建筑物模型进行随机且均匀的贴图,最后基于Unity构建UnityMesh实现三维建筑物可视化。研究方法如图1所示。

图1 本文研究方法流程图

1.1 数据准备与处理

(1)解析Shapefile数据

Shapefile格式是一种使用文件方式存储GIS数据的文件格式,通常包括一个以坐标点集形式存储对象位置信息的主文件*.shp、一个存储几何体位置的索引文件*.shx和一个存储对象属性信息的表文件*.dbf三部分。

主文件是一个直接访问、可变记录长度的文件,其中每条记录都用它的顶点列表来描述一个形状。在索引文件中,每条记录包含对应的主文件记录从主文件开始的偏移量。表文件包含每个几何形状的特征属性。几何图形和属性之间的一对一关系是基于记录号的。表文件中的属性记录必须与主文件中的记录顺序相同。

通过解析Shp数据,提取出待建模建筑物区域的BoundingBox以及数据ID数组,遍历数据ID数组获取每个ID对应的建筑物平面坐标和高度信息。

(2)空间数据坐标转换

Unity作为一款仿真工具,其平台支持常见的简单三维模型创建,比如长方体、球、平面、圆柱体等。在Unity场景中添加物体,物体的位置是以世界坐标系显示在场景中的。

本文解析原始建筑物Shp数据的ID数据获取到经纬度坐标,要正确显示到Unity场景视图中,需要将经纬度坐标转换成墨卡托投影下的世界坐标。

(3)偏移点纠正

针对模型在世界坐标系下的中心点与模型实际位置存在偏差的情况,通过解析获取的模型中心点,计算该点与世界坐标系下的中心点之间的偏移量,然后根据偏移量去纠正模型的所有顶点。

1.2 基于Unity生成建筑物模型

Unity是由Unity Technologies开发的一个让用户轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。任何地理参考数据都可以基于其真实世界的坐标覆盖在Unity上,并与其他元素一起集成到单个环境中。基于这个原理,可以利用Unity工具基于GIS数据实现3D城市模拟。

在经过对二维数据的坐标转换和中心点偏移纠正处理以后,就能够使用这些数据在地图中进行快速的三维可视化渲染。

建筑物在空间上由不同的建筑构件组成,本方法主要将建筑物分解为屋顶和墙面两部分基本要素,通过解析Shp数据可以获取到建筑物的高度数据,结合建筑物二维平面坐标数据和建筑物具备的高度属性,在空间Y轴上拉伸可以快速计算出建筑物的屋顶坐标信息。将墙面在Y轴方向上根据对应的剩余高度比例值进行拆分,分为第一层楼、中间层楼和顶层楼,获得每层楼的顶点坐标信息。经过以上空间规则的组合迭代,结合脚本参数化可以实现建筑物体的建模。

根据建筑物的屋顶坐标信息确定屋顶面,生成屋顶Mesh数据。墙面为连接屋顶面与地面的四边形,本研究通过将周围墙面拆分为第一层楼、中间层楼和顶层楼,分别创建墙面底部Mesh数据、中部Mesh数据和顶部Mesh数据。实现基于建筑物矢量数据中的矢量轮廓数据和高度数据,生成待建模区域中建筑物的三维白模,其过程如下:

1)获取建筑物屋顶和每层墙面的顶点;

主要的算法思想是,遍历Edge的数组,取得第一条边的第n+1顶点与第n顶点,分别记为v1,v2。此时可以计算出墙面的方向向量,以及归一化后的方向记为wallSegmentDirection。v1重新赋值给新的变量,记为wallSegmentFirstVertex。由此计算第二个点wallSegmentSecondVertex=wallSegmentFirstVert ex + wallSegmentDirection * 一段墙面的长度。

在CreateWall函数中首先记录wallSegmentFirstVertex与wallSegmentSecondVertex的Y值,分别记为currentY1和currentY2。在计算顶点的过程中每个墙面的顶点即为四个顶点,存储当前顶点,后面的顶点在currentY1和currentY2基础上减去对应的剩余高度比例值。

2)计算判断屋顶面和每层墙面的顶点是否顺时针绘制,这一步为了确保屋顶面的法向量朝上,墙面的法向量朝外,从而保证渲染建筑物的外部表面;

3)计算判断屋顶面是否包含空洞,便于下步进行屋顶面三角剖分;

4)针对屋顶面和墙面进行三角剖分,计算三角形索引值,索引的计算按照顺时针方向、一个面有六个索引的方式来进行索引值填充;

1.3 建筑物表面贴图

纹理数据在本质上就是现实三维世界中物体的真实贴图照片,因此建筑物贴图照片的质量在一定程度上影响着三维建筑物可视化的真实性。但是当使用大量不同的建筑物贴图照片时,会加重计算机建模工作的内存负载,降低可视化效率。所以本研究通过将具有代表性的小范围建筑物屋顶和墙面纹理图案作为拼接因子,拼接出一幅屋顶纹理图案和一幅墙面纹理图案,最终采用的纹理数据包括屋顶Diffuse漫反射贴图、屋顶Ambient Occlusion环境映射贴图、屋顶Normal法线贴图、墙面Diffuse漫反射贴图、墙面Ambient Occlusion环境映射贴图、墙面Metallic金属度贴图、墙面Normal法线贴图和墙面Roughness凹凸贴图,如图2所示。

图2 屋顶和墙面拼接纹理图案

资源是Unity开发系统的重要组成部分。Unity提供ScriptableObject添加标签CreateAssetMenu可以在Assets按钮下一键生成包括纹理贴图文件在内的资源脚本。图3是预制好的纹理贴图资源脚本,方便读取和存储变量。

图3 纹理贴图资源脚本

本方法使用资源脚本文件预制好的纹理尺寸大小进行适配计算每块墙面的UV配比值。利用Assets文件夹中的纹理贴图资源对每个建筑物随机均匀地赋予不同的纹理贴图,实现精确控制纹理坐标和“逼真贴面”,具体实现如下:

(1)获取组成建筑物各个部分的相关信息,包括组成建筑物屋顶和不同层墙面的各个节点的空间位置坐标信息(x,y,z);

(2)将ScriptableObject生成的纹理贴图资源随机均匀地分配给每个建筑物;

(3)根据建筑物屋顶和不同层墙面各个节点的空间位置坐标(x,y,z),计算组成对应面的每个节点所对应的纹理坐标(u,v);

(4)将对应的纹理图案赋予给相应的建筑物面,实现逼真贴面;

(5)刷新屏幕显示。

1.4 构建UnityMesh

首先获取MeshData的顶点、法线、UV、正切线、三角形索引值,然后创建GameObject添加MeshFilter组件以及MeshRender组件。MeshFilter组件是设置Mesh;MeshRender组件作为网格渲染器保证在场景中看到个体呈现渲染效果,给物体添加材质纹理等。最终在Unity中实现三维建筑物可视化。

2 数据结果处理与分析

本方法基于Unity进行实验研究。选取台湾省桃园市为实验区,在提取实验区建筑物Shapefile矢量数据的基础上,通过解析获得建筑物数据的范围边界、中心点、几何顶点以及高程信息,并将几何顶点和中心点的经纬度坐标经过转换获得墨卡托投影下的世界坐标,根据当前放置显示中心点计算纠正偏移点。结合几何顶点坐标和高程信息实现建筑物的三维建模,然后利用Unity预制的纹理贴图资源随机且均匀地为三维建筑物模型贴图,最后基于Unity构建UnityMesh实现三维建筑物可视化,实现效果如图4所示。为了对比分析本研究方法的有效性,本文还基于实验区数据进行了三维建筑物白模建立,实现效果如图5所示;以及为三维建筑物模型赋予相同材质的纹理贴图,实现效果如图6所示。

图4 三维建筑物不同材质贴图模型

图5 三维建筑物白模

分析以上三种三维建筑物建模方法,图5所示方法获得的三维建筑物白模没有纹理信息,缺乏真实感和直观感;图6所示方法获得的三维建筑物模型赋予了相同材质的纹理贴图,虽然相较于图5所示方法丰富了纹理信息,但是比较单一,缺乏对建筑物本身风格的关注;图4所示的本研究方法为每个建筑物随机且均匀地设置了不同的纹理贴图,从整体上看和现实世界的建筑相一致,具备真实感。

图6 三维建筑物相同材质贴图模型

同时相较于使用大量精细的纹理图案,本论文研究方法仅用了一张屋顶拼接纹理贴图和一张墙面拼接纹理贴图,大大缓解了计算机内存压力,提升了三维建模效率。

结论:针对现有的大多数基于GIS建筑物数据的三维可视化方法侧重于模型的构建,对建筑物自身的真实纹理及结构表现能力不足等问题,本研究提出了一种基于Unity3D的GIS建筑物数据三维可视化方法。通过将具有代表性的小范围建筑物真实纹理拼接成一幅丰富的纹理贴图,同时利用Unity预制好纹理资源,实现建筑物的快速逼真可视化。一方面,相较于简单的三维白模及单一模型丰富了纹理信息。另一方面,相较于精细建模节省了内存消耗,提升了三维可视化的效率。

猜你喜欢

墙面顶点纹理
过非等腰锐角三角形顶点和垂心的圆的性质及应用(下)
冷暖——老旧小区改造,改变的不止是墙面
基于BM3D的复杂纹理区域图像去噪
使用纹理叠加添加艺术画特效
关于顶点染色的一个猜想
TEXTURE ON TEXTURE质地上的纹理
开关的美丽衣裳
消除凹凸纹理有妙招!
手工字母花卉让墙面与众不同
一种墙面清洁、探伤机器人的设计与实现