李雙宇,吳芳華,徐道柱,楊春成,吳國佳
(1.中國地質大學(武漢),湖北 武漢 430078;2.西安測繪研究所,陜西 西安 710000)
增強現實(AR)技術是一種將現實世界信息與虛擬世界信息無縫集成的技術,通過系統處理來提高使用者對現實世界的感知度,將計算機生成的虛擬場景或物體等元素與現實場景進行疊加,以此達到增強現實的效果[1]。與傳統AR技術需要依托專業視覺設備不同,移動端AR(MAR)應用系統具有開發成本低、便攜性強、集成度高、推廣普及容易等優勢[2]。因此,在移動GIS應用中引入AR技術,能使地理要素的識別更具直觀性[3]。
國外關于MAR系統的研究起步較早,1999年日本廣島城市大學和美國華盛頓大學共同研發了ARToolKit軟件開發工具包;2010年Wagner D[4]等首次在手機設備上采用了基于自然特征的跟蹤注冊方式;2012年高通公司發布了AR開發工具包Vuforia[5],由于其具有多元化的平臺支持,很快成為國內應用最廣泛的AR引擎之一。國內對于MAR系統的研究起步相對較晚,北京理工大學在設計三維注冊和光學透視設備[6]方面成果頗豐;上海交通大學提出了空間AR流水線概念[7];華中科技大學提出了標示角點與全局單應性矩陣相結合的三維注冊手段[8]。同時,我國的一些高科技企業也對AR技術進行了大量研究和應用,如高德和百度均推出過車載AR導航相關產品;視辰信息科技自主研發了AR引擎Easy AR,本文采用該引擎將AR技術應用到海洋地貌可視化中。
海洋地貌作為海洋環境的基礎地理信息要素,對其進行逼真的模擬和再現,是人們對海底環境進行了解的基本手段和方法[9]。將AR技術與海洋地貌可視化相結合,有助于更加準確地掌握海洋地貌特征,對于開發海洋資源、實施海洋工程以及發展海洋經濟等方面都具有很重要的應用價值;再將二者融合到移動端,能為用戶提供更好的體驗,更加有助于大眾了解海底地形地貌、普及海洋知識。
海洋地貌是覆蓋于海水之下地球固體表面的形態,其復雜程度并不亞于陸地地形,也存在山脈、平原、盆地等不同種類的地貌。傳統的二維海圖采用水深線或水深點來表達海洋地貌,往往不夠直觀,包含的信息量也較少;而三維海洋地貌可視化表達則往往脫離了海洋洋體,無法體現海洋環境。海洋地貌的可視化表達不僅需要考慮海洋洋體的可視化,而且需要考慮海底地貌的可視化。對于海洋洋體部分,需充分考慮海水的顏色、波長、波速、反射等基本視覺屬性;對于海底地貌部分,需充分考慮地形特征、分層設色規律、紋理設置、垂直夸張度設置等。MAR海洋地貌可視化的實現主要包括模型建立、AR功能實現和移動端交互設計3個部分。其主要技術流程如圖1所示。

圖1 技術流程圖
由于海底地形與陸地地形十分相似,因此海底地形三維建模方法主要借鑒陸地地形的三維建模方法。作為海洋地貌可視化系統的核心組成部分,三維海底地形模型的快速構建決定了系統的質量基礎。
建立真實的三維海底地形,需獲取目標區域的高精度高程圖,本文采用World Machine提取目標地區的高度貼圖[10]。World Machine是一款優秀的地形編輯工具,可通過內置的Generators(生成器)和Effects(效果器)創建一個精細的世界外貌,并提供廣泛的地形信息輸出格式支持。
首先,在地理空間數據云網站(http://www.gscloud.cn/)下載目標區域的DEM數據,并將其轉換為HF2或其余可被World Machine識別的文件類型[11]。在World Machine中會自動打開一個Device Workview (設備工作視圖,World Machine中每個操作都被稱為一個設備),在Device Workview中輸入地形屬性后,導出png格式的圖片數據,如圖2所示。

圖2 World Machine導出的高程圖
本文利用Blender軟件建立海洋地貌三維模型。Blender是一款跨平臺的三維應用工具,與其他3D建模工具相比,其對內存和驅動的需求更低。Blender的軟件交互界面基于OpenGL構建,在所有支持的硬件與平臺上均能提供一致的用戶體驗。將高程灰度圖導入Blender中,利用平面細分工具和材質紋理工具制作真實海底三維模型。
2.2.1 細分方式建模與調節
為了盡可能還原真實的海底地貌細節,需將海洋地貌模型表面進行多級細分,增大表面面片數,以適應不同地形下模型表面的細微變化。簡單來說,即假定一個單獨多邊形的一級細分為2×2個網格,那么在其二級細分上將為4×4個網格,三級細分為8×8個網格。
對于復雜的海底地貌模型,格網劃分得越細,表面呈現得越光滑。利用該特性可使三維模型中不同形狀間的融合過渡風格在柔和平滑和銳利參差之間調整,只要有一個規則的拓撲網格,就能輕松調整形狀之間的組合及其表現樣式[12]。Blender內置的細分修改器在進行操作時沒有破壞性,任何時候都能返回并進行修改。三維海底地形模型如圖3所示。

圖3 三維海底地形模型
2.2.2 表面色彩渲染
在計算機數字圖像處理中常用的顏色模型包括HSL模型和RGB模型[13]。HSL模型通過色相(H)、飽和度(S)和亮度(L)3個顏色通道的變化及其相互之間的疊加得到各式各樣的顏色。HSL模型中的H分量代表人眼所能感知的顏色范圍,在Blender中H的取值范圍為[0,1];S分量代表色彩的飽和度,取值范圍為[0,1],用于描述相同色相、亮度下色彩純度的變化,數值越大顏色越鮮艷;L分量代表色彩的亮度,取值范圍為[0,1],用于描述色彩的明暗變化,數值越大色彩越亮越接近白色,數值越小色彩越暗越接近黑色[14]。
HSL模型的多色漸變渲染方法[15]在實際應用中,為了使顏色更加純正,通常S取值為1.0;L取值過大顏色接近白色,取值過小又接近黑色,因此通常L取值為0.5;鑒于海底地形的色譜通常為紅、黃、綠、青、藍,H的取值范圍為[0,1],海水越深,H值越大。當海底最大水深為Zmax,最小水深為Zmin(若存在類似海島高于水面的情形,Z和Zmin均取水面以上高度的負值)時,H的取值范圍為[Hmin,Hmax],則水深為Z時的H值為:

在Blender中,為了實現更好的人機交互,將HSL模型修改為HSV模型[16],其中V分量代表明度,即所有光的亮度。一般而言,V值為L值的兩倍(小于等于1)。在Blender 2.80版中,提供了紋理節點編輯器對模型的材質進行編輯。該系統通過將顏色、圖案和其他紋理組合在一起來實現流水線式的紋理創建。流水線上每個節點的數據通過曲線鏈接并傳遞到下一個節點,直到最后的輸出節點。Diffuse BSDF是一個彌散型表面類型的著色器,材質輸出欄表示最后輸出到模型上的結果,向其添加幾何節點、顏色漸變節點等,給整個模型上色。根據需要,還可在不同高度段落內設置不同的基礎色相。將多個節點進行組合后,再混合到同一輸出,得到的分層設色模型(圖4)。

圖4 分層設色模型
目前,Unity提供的AR插件包括ARkit、ARcore、Vuforia以及EasyAR等。本文通過Unity3D+EasyAR搭建MAR海洋地貌可視化系統。基本開發環節為:
1)開發環境搭建,安裝Unity3D。在EasyAR官網下載EasyAR_SDK,并將其導入Unity3D,構建基本開發環境。
2)在EasyAR官網注冊賬號,添加SDK License Key,獲取項目中EasyAR插件使用權限。
3)在Unity中利用EasyAR插件相關功能進行AR場景的搭建,刪除主相機,添加EasyAR中自帶的AR相機。工程中通過添加ImageTarget識別圖以及圖所對應模型進行編輯與設計工作。
本文設計開發的MAR海洋地貌可視化系統包括基礎功能、拓展功能和重置功能3個基本模塊,如圖5所示。

圖5 功能模塊框架圖
3.3.1 功能模塊
1)基礎功能模塊。該模塊主要包括模型平移、旋轉和縮放功能,負責對模型空間位置和大小進行基本控制。系統采用單指觸控的方式進行模型平移與旋轉操作,為解決平移、旋轉沖突問題,添加了按鈕切換平移與旋轉模式。縮放功能通過雙指實現,雙指向內時縮小,向外時放大。
2)拓展功能模塊。該模塊包括對海底地貌模型操作和水體模型操作兩部分,通過界面右下角紋理切換按鈕可實現海底地貌模型紋理切換,還可通過相應的滑動條對模型垂直夸張度、水體顏色、波速、波長、反射進行設置,以滿足同一海洋模型在不同情況、不同需求下的可視化顯示。
3)重置功能模塊。模型顯示后,由于用戶操作會出現位置、形狀、屬性等變化,重新識別時模型仍為改變后的狀態,只有重新打開應用才可恢復初始狀態。為了方便用戶使用,系統設計了重置功能并將其細分為水體模型重置、海底地貌模型重置和水體屬性重置功能。
3.3.2 基礎功能的實現
系統包括平移、旋轉、縮放3種手勢操作,通過添加相應腳本實現。
1)模型平移。系統采用單指觸摸移動模型的方式,利用Input.touchCount判斷觸摸點數量,當數量為1時執行平移功能。模型平移涉及模型的屏幕坐標、世界坐標以及移動端觸摸點的屏幕坐標。首先將模型的世界坐標通過矩陣轉換為自身的屏幕坐標,并進行存儲;再將觸摸點的屏幕坐標轉換為世界坐標,由于屏幕只有X、Y方向上的值,因此Z值需使用模型的屏幕坐標。利用模型與觸摸點的世界坐標計算模型與觸摸點在世界空間中的偏移量,再將觸摸點的屏幕坐標實時轉化為觸摸點的世界坐標,并加上偏移量即可得到模型的世界坐標。由于該功能需要選取模型,因此需添加Box Colider(碰撞器),并設置碰撞范圍。
2)模型旋轉。旋轉功能采用單指觸摸的方式實現,為與平移相區別,利用控制按鈕切換平移與旋轉模式。通過定義一個二維向量Vector2記錄屏幕中水平和豎直方向上的偏移量,將Vector2的分向量與世界空間的三維向量Vector3在水平與豎直方向的分向量進行運算,再通過Transform.Rotate對世界空間三維坐標系進行旋轉,達到模型旋轉的目的。
3)模型縮放。縮放功能采用雙指觸摸的方式實現,記錄兩個觸摸點新舊位置的距離差,若為正則表示放大手勢, 若為負則表示縮小手勢。根據實際情況,對距離進行處理,轉換成縮放因子。利用模型的Transform組件,根據模型自身比例大小進行運算,實現縮放功能。
3.3.3 拓展功能的實現
拓展功能主要包括海底地貌模型與水體模型的垂直夸張度改變功能、海底地貌模型紋理改變功能以及水體屬性改變功能(顏色、波長、波速、反射),用于根據用戶需求實現個性化設置。為使高度和屬性改變得更平滑,系統利用Unity中UI的Slider控件進行滑動調節。
1)垂直夸張度改變功能。海底地貌模型與水體模型均采用相同原理實現垂直夸張度改變,將Slider控件的值實時賦予模型Transform組件中垂直方向上的比例值,以此實現對垂直夸張度的改變。此外,需將水體模型設置為海底地貌模型的子對象,以避免海底地貌模型垂直夸張度改變時水體模型垂直夸張度上限過高或過低。
2)海底地貌模型紋理改變功能。模型的材質球中的Albedo選項用于放置紋理圖片,更換不同圖片將改變紋理效果。新建Resources文件夾,將要替換的紋理文件存入該文件夾,替換Albedo中的紋理圖片,并利用Button控件切換紋理圖片。
3)水體屬性改變功能。系統中的動態水體模型是基于Unity3D中的Mobile Ocean & Water插件構建而成的。水體模型的屬性可通過代碼直接訪問修改。該功能與UI控件Slider相結合,將Slider的值賦予著色器屬性,以達到改變屬性的目的,且Slider控件自帶上下限,有效避免了超限問題。
3.3.4 重置功能的實現
1)模型重置功能。水體模型重置與海底地貌模型重置采用相同的方法,在模型加載期間分別記錄水體與海底地貌模型在Transform組件中的位置、旋轉、縮放參數。當需要重置時,通過點擊重置按鈕,將記錄的相關參數重新賦予模型,實現重置效果。
2)水體屬性重置功能。水體屬性重置除了相關顏色、波長、波速、反射的參數重置外,還要重置與之關聯的Slider控件。因此,該功能代碼需要同時將值賦予著色器屬性與對應的Slider控件。
3.4.1 目標識別技術
在AR的識別技術中,圖像指紋和漢明距離是兩個關鍵要素[17]。圖像指紋可通過“感知哈希算法”得到,通過將識別圖與相機實時圖像進行對比得到漢明距離,即可實現目標識別。
“感知哈希算法”首先將圖像縮小為8×8個像素,去除圖像細節,同時將灰度值也分為64級灰度,計算灰度值的平均值;再將所有像素的灰度值與平均值進行比較,當像素灰度值大于或等于平均值時記為1,小于平均值時記為0;最后將所有比較結果組合在一起,組合產生的64位整數即為該圖像的“指紋”。
漢明距離是對長度相同的字符串進行對比,字符串中對應位字符不同的數量就是漢明距離。將識別圖與相機實時圖像的圖像指紋進行對比,根據漢明距離識別圖像,當漢明距離小于5時,說明圖像很相似;當漢明距離大于10時,說明是不同的圖像。本文采用“感知哈希算法”通過漢明距離進行目標識別。
3.4.2 跟蹤注冊技術
跟蹤注冊技術是AR的核心技術,可實時高效地將真實世界與虛擬世界精準對齊,將真實世界坐標系與虛擬世界坐標系統一起來,統一的過程即為注冊。由于AR在使用過程中,用戶會不斷移動,導致自身與目標坐標系以及相對位置均在實時改變。為了實現AR,需實時注冊,不斷修改相關參數,該過程稱為跟蹤。目前的跟蹤注冊主要分為3種:基于傳感器、基于機器視覺和基于混合的跟蹤注冊[18]。
基于傳感器的跟蹤注冊技術利用移動設備自帶的傳感器(如方向傳感器、GPS傳感器等)獲取當前位置和方向信息,并通過攝像頭實現虛擬信息與真實世界的疊加,完成跟蹤注冊。由于傳感器為移動設備內置設備,因此易受外界因素影響,傳感器的抖動將影響跟蹤注冊,使虛擬信息跟隨抖動疊加。基于機器視覺的跟蹤注冊技術是通過攝像頭對視頻圖像進行處理,得到跟蹤信息,再根據這些信息得到真實世界中虛擬信息的位置信息[19]。基于混合的跟蹤注冊技術是結合上述兩種方法,先利用傳感器粗略確定用戶位置姿態,再利用機器視覺跟蹤注冊技術進行精確處理。本文采用基于混合的跟蹤注冊技術,在提高注冊速度的同時,增加了注冊穩定性,提高了用戶體驗。
3.4.3 屏幕坐標與世界坐標的轉換
屏幕坐標與世界坐標的轉換是實現AR模型識別和基于移動端屏幕操作的關鍵技術。AR實現過程中涉及屏幕坐標系、攝像機坐標系、世界坐標系3個坐標系。世界坐標系下的點與理想屏幕中投影點的像素坐標關系為:

式中,(X,Y,Z)為某點在世界坐標系中的坐標;(x,y)為屏幕中投影點的位置;f1、f2、p、q和m為攝像機內參,可由攝像機標定求解;R、T為攝像機外參,即攝像機在世界坐標系中的位置和姿態。
在Unity中,屏幕坐標系是指電腦或手機等設備屏幕的坐標系,屏幕坐標系通過像素進行定義,屏幕左下角為坐標原點(0,0),右上角為(width,height),對應于屏幕的寬與高。攝像機坐標系與屏幕坐標系相似,區別在于攝像機坐標系位于三維空間,而屏幕坐標系位于二維平面。攝像機位于攝像機坐標系原點,X軸向右,Y軸位于攝像機正上方,Z軸方向為攝像機朝向。
Unity提供了一系列封裝好的方法,通過這些方法可快速實現不同坐標系的轉換。
1)Camera.WorldToScreenPoint方法可將世界坐標轉換為屏幕坐標,其中Camera為場景中的Camera對象。
2)Camera.ScreenToWorldPoint方法可將屏幕坐標轉換為世界坐標。
在安卓手機上運行MAR海洋地貌可視化App,系統自動識別筆記本電腦上展示的目標區域,顯示海洋洋體模型和海洋地貌模型,移動模型、修改水體模型顏色、旋轉模型、改變模型垂直夸張度、改變模型紋理和改變模型波長與反射屬性等功能效果如圖6所示。

圖6 MAR海洋地貌可視化系統實現效果
本文在移動端將AR技術應用于海洋地貌可視化與多層次展示中,取得了較好的表達效果。本文中海洋被假定為靜態水體,但真實的海洋洋體是一個復雜的動態系統,在將來的實驗中還有待進一步完善。