航天宏圖信息技術股份有限公司 上海宏圖空間網絡科技有限公司 劉富乾
航天宏圖信息技術股份有限公司 王 芬
航天宏圖信息技術股份有限公司 上海宏圖空間網絡科技有限公司 廖芳芳
航天宏圖信息技術股份有限公司 管占磊 王 新
通過實現三維建筑物快速可視化,真實還原建筑物模型及其自身整體風格、規模和形態,可以有效地提升三維數字城市建設效率,有利于城市發展規劃。針對目前大多數建筑物三維可視化方法重點關注建筑物建模方法與可視化展示,忽略了模型在現實三維世界中的真實表現,本研究提出一種基于Unity3D和GIS建筑物數據實現快速可視化的算法,通過預制大量真實世界建筑物屋頂和墻面的紋理貼圖資源,為建筑物模型隨機且均勻地按需貼圖,實現三維建筑物逼真顯示,并通過紋理拼接的方式用一張圖保存豐富的紋理貼圖信息,使得資源內存加載得到了優化,提升了三維模型可視化的效率。對比實驗結果表明,本研究提出的方法可以快速實現三維建筑物的真實可視化。
隨著我國數字化城市的建設,三維數字城市在城市規劃中發揮著重要的作用,建筑物三維可視化作為其中關鍵技術之一,越來越受到人們的關注。近幾年來研究人員也對其進行了相關的研究,如Grou等介紹了一個場景分析系統,該系統利用建筑物立體像對和輪廓信息實現建筑物表面建模。M.Pollefeys等提出一種從場景圖像序列中自動提取紋理化三維曲面模型的方法。陳愛軍等提出利用城市航空立體像對實現三維建筑物全自動建模的方法,該方法利用匹配生成的三維信息對二維建筑物輪廓線進行三維插值,獲得建筑物的三維信息,由此實現了建筑物三維建模。朱國敏等針對抽象的建筑物面對象提出基于三角剖分的規則建筑物批量三維模型構建方法。朱慶偉等提出一種基于三維激光掃描儀的建筑物建模方法,該方法利用三維激光掃描儀獲取建筑物的二維幾何數據和三維位置點數據信息,結合二者實現三維建筑物建模。
現有的建筑物三維建模方法大多關注在建筑物模型的可視化表現上,缺乏對建筑物自身整體風格、規模、形態等的關注,使得建筑物模型表現缺乏真實性。另外,精細建模使得大范圍三維建筑物快速可視化變得困難,數據量也給后期的空間分析帶來諸多不便。本研究分析現有建模方法的不足,在實現建筑物建模的基礎上,針對建筑物模型的特點,使用多種真實小范圍紋理圖案拼接形成一張建筑物屋頂拼接紋理圖案和一張墻面拼接紋理圖案,僅用兩張紋理圖案緩解了計算機內存消耗,在真實還原三維建筑物的同時提升了建模效率。
本研究首先對建筑物Shapefile矢量數據進行提取、解析、處理,然后利用建筑物二維幾何坐標信息和高程信息實現三維建模,并利用Unity預制的貼圖紋理資源對三維建筑物模型進行隨機且均勻的貼圖,最后基于Unity構建UnityMesh實現三維建筑物可視化。研究方法如圖1所示。
圖1 本文研究方法流程圖
(1)解析Shapefile數據
Shapefile格式是一種使用文件方式存儲GIS數據的文件格式,通常包括一個以坐標點集形式存儲對象位置信息的主文件*.shp、一個存儲幾何體位置的索引文件*.shx和一個存儲對象屬性信息的表文件*.dbf三部分。
主文件是一個直接訪問、可變記錄長度的文件,其中每條記錄都用它的頂點列表來描述一個形狀。在索引文件中,每條記錄包含對應的主文件記錄從主文件開始的偏移量。表文件包含每個幾何形狀的特征屬性。幾何圖形和屬性之間的一對一關系是基于記錄號的。表文件中的屬性記錄必須與主文件中的記錄順序相同。
通過解析Shp數據,提取出待建模建筑物區域的BoundingBox以及數據ID數組,遍歷數據ID數組獲取每個ID對應的建筑物平面坐標和高度信息。
(2)空間數據坐標轉換
Unity作為一款仿真工具,其平臺支持常見的簡單三維模型創建,比如長方體、球、平面、圓柱體等。在Unity場景中添加物體,物體的位置是以世界坐標系顯示在場景中的。
本文解析原始建筑物Shp數據的ID數據獲取到經緯度坐標,要正確顯示到Unity場景視圖中,需要將經緯度坐標轉換成墨卡托投影下的世界坐標。
(3)偏移點糾正
針對模型在世界坐標系下的中心點與模型實際位置存在偏差的情況,通過解析獲取的模型中心點,計算該點與世界坐標系下的中心點之間的偏移量,然后根據偏移量去糾正模型的所有頂點。
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)針對屋頂面和墻面進行三角剖分,計算三角形索引值,索引的計算按照順時針方向、一個面有六個索引的方式來進行索引值填充;
紋理數據在本質上就是現實三維世界中物體的真實貼圖照片,因此建筑物貼圖照片的質量在一定程度上影響著三維建筑物可視化的真實性。但是當使用大量不同的建筑物貼圖照片時,會加重計算機建模工作的內存負載,降低可視化效率。所以本研究通過將具有代表性的小范圍建筑物屋頂和墻面紋理圖案作為拼接因子,拼接出一幅屋頂紋理圖案和一幅墻面紋理圖案,最終采用的紋理數據包括屋頂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)刷新屏幕顯示。
首先獲取MeshData的頂點、法線、UV、正切線、三角形索引值,然后創建GameObject添加MeshFilter組件以及MeshRender組件。MeshFilter組件是設置Mesh;MeshRender組件作為網格渲染器保證在場景中看到個體呈現渲染效果,給物體添加材質紋理等。最終在Unity中實現三維建筑物可視化。
本方法基于Unity進行實驗研究。選取臺灣省桃園市為實驗區,在提取實驗區建筑物Shapefile矢量數據的基礎上,通過解析獲得建筑物數據的范圍邊界、中心點、幾何頂點以及高程信息,并將幾何頂點和中心點的經緯度坐標經過轉換獲得墨卡托投影下的世界坐標,根據當前放置顯示中心點計算糾正偏移點。結合幾何頂點坐標和高程信息實現建筑物的三維建模,然后利用Unity預制的紋理貼圖資源隨機且均勻地為三維建筑物模型貼圖,最后基于Unity構建UnityMesh實現三維建筑物可視化,實現效果如圖4所示。為了對比分析本研究方法的有效性,本文還基于實驗區數據進行了三維建筑物白模建立,實現效果如圖5所示;以及為三維建筑物模型賦予相同材質的紋理貼圖,實現效果如圖6所示。
圖4 三維建筑物不同材質貼圖模型
圖5 三維建筑物白模
分析以上三種三維建筑物建模方法,圖5所示方法獲得的三維建筑物白模沒有紋理信息,缺乏真實感和直觀感;圖6所示方法獲得的三維建筑物模型賦予了相同材質的紋理貼圖,雖然相較于圖5所示方法豐富了紋理信息,但是比較單一,缺乏對建筑物本身風格的關注;圖4所示的本研究方法為每個建筑物隨機且均勻地設置了不同的紋理貼圖,從整體上看和現實世界的建筑相一致,具備真實感。
圖6 三維建筑物相同材質貼圖模型
同時相較于使用大量精細的紋理圖案,本論文研究方法僅用了一張屋頂拼接紋理貼圖和一張墻面拼接紋理貼圖,大大緩解了計算機內存壓力,提升了三維建模效率。
結論:針對現有的大多數基于GIS建筑物數據的三維可視化方法側重于模型的構建,對建筑物自身的真實紋理及結構表現能力不足等問題,本研究提出了一種基于Unity3D的GIS建筑物數據三維可視化方法。通過將具有代表性的小范圍建筑物真實紋理拼接成一幅豐富的紋理貼圖,同時利用Unity預制好紋理資源,實現建筑物的快速逼真可視化。一方面,相較于簡單的三維白模及單一模型豐富了紋理信息。另一方面,相較于精細建模節省了內存消耗,提升了三維可視化的效率。