詹總謙,李一揮,桂鑫源
(武漢大學(xué)測繪學(xué)院,湖北 武漢 430079)
傾斜攝影測量與SketchUp二次開發(fā)技術(shù)相結(jié)合的建筑三維重建
詹總謙,李一揮,桂鑫源
(武漢大學(xué)測繪學(xué)院,湖北 武漢 430079)
結(jié)合SketchUp建模靈活、簡單易學(xué)及攝影測量精度高的優(yōu)勢,利用SketchUp Ruby二次開發(fā)技術(shù),對傾斜攝影測量單像建模、攝影測量模塊與SketchUp Ruby腳本插件的通信、建模效果等方面進行深入研究,解決了用C++和Ruby聯(lián)合開發(fā)SketchUp三維建模插件的關(guān)鍵技術(shù)問題。
SketchUp Ruby二次開發(fā);傾斜攝影測量;建筑物重建;單像建模
建筑物重建是構(gòu)建數(shù)字城市的重要內(nèi)容之一,在城市規(guī)劃、災(zāi)害應(yīng)急、通信設(shè)施建設(shè)等領(lǐng)域具有廣泛應(yīng)用[1]。傳統(tǒng)建模方法主要利用3ds Max、Maya、SketchUp等三維建模軟件[2-4],通過現(xiàn)場拍照、手工建模、紋理貼圖等步驟進行重建,工作量大、精度不高;利用LiDAR技術(shù)可以高精度、高密度地獲取地物三維坐標(biāo),但設(shè)備成本高,建模算法尚不成熟[5];采用全自動實景三維建模技術(shù)的商用軟件有Street Factory和Smart3D等[6-7],該技術(shù)自動化程度高、宏觀效果好,但細節(jié)粗糙、模型非單體化,后期處理煩瑣,軟件價格也相當(dāng)昂貴。
文獻[8—9]闡述了利用傾斜攝影測量和3ds Max二次開發(fā)技術(shù)快速實現(xiàn)城市建筑物三維建模的方法,提高了建模的精度和效率。但3ds Max操作復(fù)雜,難以在短時間內(nèi)熟練掌握。而SketchUp簡單易學(xué)、視角靈活,建模效率優(yōu)于3ds Max等軟件,已成為建筑設(shè)計、園林景觀等領(lǐng)域的主流軟件[10]。SketchUp采用Ruby作為二次開發(fā)語言,是一種簡單快捷、面向?qū)ο蟆⒆詣永厥?Garbage Collection)的腳本語言,開發(fā)效率優(yōu)于C++和Java[11]。
本文在SketchUp軟件環(huán)境下,結(jié)合傾斜攝影測量技術(shù)[12-13],實現(xiàn)單像建模方法,開發(fā)了建筑物半自動三維重建插件。該插件可通過人機交互的測量方法,快速、高精度實現(xiàn)建筑物三維模型的幾何重建和紋理映射等過程。
1.1 技術(shù)框架
本方法首先以動態(tài)鏈接庫形式制作傾斜攝影測量量測模塊,然后建立Ruby腳本、SketchUp建模API函數(shù)、攝影測量量測模塊之間的通信,進而實現(xiàn)SketchUp中攝影測量插件的開發(fā)。整體技術(shù)框架如圖1所示。
該技術(shù)以傾斜攝影測量空三加密成果和影像數(shù)據(jù)作為攝影測量模塊輸入,技術(shù)流程描述如下:首先通過雙像立體或單像建模方式獲取建筑物關(guān)鍵點坐標(biāo)數(shù)據(jù);然后將坐標(biāo)數(shù)據(jù)傳遞給Ruby腳本,腳本調(diào)用API函數(shù)創(chuàng)建建筑物幾何模型;最后,使用Ruby腳本將幾何模型所有坐標(biāo)信息傳遞給攝影測量模塊,獲取最佳紋理后由Ruby腳本讀取,調(diào)用API函數(shù)完成紋理映射。

圖1 整體技術(shù)框架
1.2 數(shù)據(jù)通信
1.2.1 C++攝影測量模塊向Ruby傳遞數(shù)據(jù)
攝影測量模塊與Ruby腳本需要分別獲取對方的函數(shù)指針,進而通過參數(shù)傳遞完成通信。Fiddle是Ruby用來包裝其他語言函數(shù)接口的一個擴展,可實現(xiàn)跨語言的調(diào)用[14]。本方法中利用Fiddle::Pointer類來處理C/C++類型的指針。由于C++數(shù)組內(nèi)存空間是連續(xù)的,而Ruby數(shù)組中的各個元素則是隨機存儲在操作系統(tǒng)的堆內(nèi)存(System Heap)中的(對象的引用保存在Ruby Heaps中,它獨立于操作系統(tǒng)的堆之外),兩種數(shù)組結(jié)構(gòu)差異較大,因此Ruby無法直接讀取C++傳進的double或int型數(shù)組[11]。Ruby字符串是一個C語言的RString結(jié)構(gòu)體,包含了一個char*類型的指針,指向字符串的值,該值存儲在連續(xù)內(nèi)存空間中(如圖2所示),結(jié)構(gòu)與C++數(shù)組相似。因此,可以將C++攝影測量模塊的坐標(biāo)數(shù)據(jù)轉(zhuǎn)化為字符數(shù)組后傳入Ruby,再轉(zhuǎn)為相應(yīng)的整型或浮點型即可。

圖2 Ruby數(shù)組、字符串存儲方式
1.2.2 Ruby向C++攝影測量模塊傳遞數(shù)據(jù)
Ruby中的數(shù)組類型為Array,而Array的pack方法可以將數(shù)組的值壓縮為一個二進制序列[15],將所有元素的值存儲在一段連續(xù)的內(nèi)存空間中。壓縮得到的二進制序列對象的引用與C++指針類型相同,作為參數(shù)傳入攝影測量模塊后可以直接根據(jù)下標(biāo)訪問各元素。
1.3 量測與建模
1.3.1 單像量測
除了文獻[9]介紹的雙像立體建模方法之外,本技術(shù)還采用了單像建模方法。流程描述如下:首先在雙像立體建模界面中量測基準(zhǔn)平面,包括水平基準(zhǔn)面、垂直基準(zhǔn)面和任意空間基準(zhǔn)面;然后切換到單像建模界面,通過量測建筑關(guān)鍵點像點坐標(biāo),并利用攝影測量知識確定該像點與投影中心的空間光線;最后,計算空間光線與基準(zhǔn)平面的交點坐標(biāo),該點即為關(guān)鍵點的空間坐標(biāo)。如圖3所示,用戶只需在單張影像上描繪建筑物輪廓線即可完成測量。

圖3 單像量測
1.3.2 模型構(gòu)建
SketchUp API中Entities類的add_face方法可以根據(jù)Point3d數(shù)組、Edge數(shù)組創(chuàng)建一個多邊形,add_edges方法用來創(chuàng)建多個線段,add_arc、add_circle和add_curve方法分別用于創(chuàng)建弧段、圓和曲線實體[16]。SketchUp中沒有“體”的概念,所有的三維立體模型都是由多個面構(gòu)成的。對于Face對象,pushpull(推拉)方法可以沿法向擠出生成棱柱形的多面體。
建筑分為平頂房屋和復(fù)雜房屋兩類進行創(chuàng)建。對于平頂房屋,先測得頂面,然后在單像視圖中推拉出整個建筑模型(如圖4(a)所示)。對于復(fù)雜房屋,則需要進一步測量屋脊線的位置(如圖4(b)所示),然后在SketchUp中構(gòu)面即可。

圖4 平頂、復(fù)雜房屋建模
1.4 紋理自動映射
[9]的方法進行最佳紋理搜索,具體映射流程如下:
(1) 將模型點的三維坐標(biāo)傳入攝影測量模塊,并根據(jù)共線方程和外方位元素選出模型面可見且完整的影像。然后,根據(jù)紋理面積最大原則選出最佳影像,按照最小外包矩形在影像上截取紋理。
(2) 在Ruby腳本中讀取紋理(SketchUp環(huán)境中無需將紋理尺寸歸一化為2n大小),并計算模型點的紋理坐標(biāo),要求坐標(biāo)原點定義在紋理圖片的左下角,大小在[0,1]區(qū)間內(nèi)。
(3) 調(diào)用Model類的materials方法獲取材質(zhì)集合,向其中添加新的材質(zhì),材質(zhì)的紋理(Texture)屬性設(shè)置為截取的紋理圖像。
(4) 調(diào)用Face類中的position_material方法,將模型點的物方坐標(biāo)和對應(yīng)的紋理坐標(biāo)對應(yīng),實現(xiàn)紋理的透視變換,其效果如圖5所示。

圖5 紋理映射效果
1.5 雙視圖協(xié)同建模
為了提高建模效率及獲取最佳建模體驗,實現(xiàn)時需要保證攝影測量模塊與SketchUp的數(shù)據(jù)模型和建模方式一致,形成雙視圖協(xié)同建模、無縫切換。其中,攝影測量建模視圖可以利用矢量數(shù)據(jù)與影像的套合程度進行質(zhì)量控制,使用戶體驗到所見即所得效果(如圖6所示);而SketchUp建模視圖則可以充分利用軟件的靈活視角及豐富的建模工具,對模型的細節(jié)加以完善。

圖6 雙視圖協(xié)同建模
為驗證本技術(shù)的有效性,采用德國某地區(qū)的傾斜影像,對幾種典型建筑和街區(qū)進行建模,影像與模型效果如圖7—圖9所示。

圖7 人字形屋脊房屋建模效果

圖8 尖塔房屋建模效果

圖9 復(fù)雜房屋建模效果
如圖10所示(測區(qū)一角),對于結(jié)構(gòu)比較簡單的平頂和人字形屋脊房屋而言,在保證精度的情況下,建模效率約為每分鐘1~2個模型。由于目前的紋理映射方法需要遍歷較多的原始影像以獲取最佳紋理,并且SketchUp尚不支持多核運算,因此紋理映射的效率仍然有待進一步提高。

圖10 整體建模效果
利用SketchUp Ruby二次開發(fā)技術(shù)與傾斜攝影測量原理,對城市建筑物半自動、快速三維重建進行了技術(shù)研究和實現(xiàn),重點解決了C++開發(fā)的攝影測量模塊與Ruby腳本插件間的通信等關(guān)鍵技術(shù)問題,取得了較好的建模效果。
參考文獻:
[1] 楊建思, 杜志強, 彭正洪, 等. 數(shù)字城市三維景觀模型的建模技術(shù)[J]. 武漢大學(xué)學(xué)報(工學(xué)版), 2003,36(3):37-40.
[2] 李俊超, 李樓. AutoCAD Civil 3D和3ds Max Design在道路建模中的應(yīng)用[J]. 測繪通報, 2013(2):91-94.
[3] 許捍衛(wèi), 房曉亮, 任家勇, 等. 基于SketchUp的城市三維建模技術(shù)[J]. 測繪科學(xué), 2011,36(1):213-214.
[4] 周曉風(fēng). 基于MAYA和VIRTOOLS的虛擬倉儲物流系統(tǒng)的研究與實現(xiàn)[D].上海:上海交通大學(xué), 2011.
[5] 李廣云, 李明磊, 王力, 等. 地面激光掃描點云數(shù)據(jù)預(yù)處理綜述[J]. 測繪通報, 2015(11):1-3.
[6] 劉云峰, 張雪萍, 郭秋燕, 等. 基于Street Factory的城市三維模型構(gòu)建方法研究[J]. 測繪與空間地理信息, 2014(12):67-70.
[7] 張驥, 高釗, 陳容. 基于Leica RCD 30傾斜航攝儀和Smart 3D技術(shù)快速進行城市三維實景生產(chǎn)[J]. 測繪技術(shù)裝備, 2014(3):61-64.
[8] 王慶棟. 新型傾斜航空攝影技術(shù)在城市建模中的應(yīng)用研究[D]. 蘭州:蘭州交通大學(xué), 2013.
[9] 王慶棟, 艾海濱, 張力. 利用傾斜攝影和3ds Max技術(shù)快速實現(xiàn)城市建模[J]. 測繪科學(xué), 2014,39(6):74-78.
[10] 魯英燦, 康玉芳, 方旭,等. 設(shè)計大師SketchUp提高[M].北京: 清華大學(xué)出版社, 2006.
[11] FLANAGAN D, 松本行弘. Ruby編程語言[M]. 北京: 電子工業(yè)出版社, 2009.
[12] 李德仁, 肖雄武, 郭丙軒, 等. 傾斜影像自動空三及其在城市真三維模型重建中的應(yīng)用[J]. 武漢大學(xué)學(xué)報(信息科學(xué)版), 2016,41(6):711-721.
[13] 張春森, 張衛(wèi)龍, 郭丙軒, 等. 傾斜影像的三維紋理快速重建[J]. 測繪學(xué)報, 2015,44(7):782-790.
[14] SEGAL L. Class Module: Fiddle [EB/OL].[2016-08-16]. http:∥www.rubydoc.info/stdlib/fiddle/Fiddle.
[15] BRITT J, NEUROGAMI M. Array [EB/OL].[2015-12-23]. http:∥ruby-doc.org/core-1.9.3/Array.html#method-i-pack.
[16] SCARPINO M. Automatic SketchUp Creating 3-D Models in Ruby[M]. Hanover: Eclipse Engineering LLC, 2010.
Building Reconstruction Based on Oblique Photogrammetry and SketchUp Secondary Development
ZHAN Zongqian,LI Yihui,GUI Xinyuan
(School of Geodesy and Geomatics, Wuhan University, Wuhan 430079, China)
Combining the advantages of SketchUp including flexible modeling, learnability and high precision of photogrammetry, with using the technology of SketchUp Ruby secondary development, this paper studied on single-image modeling, the communication between photogrammetry module and SketchUp Ruby scripts and the refinement of 3D model. Finally, it solved the key technical problem of hybrid programming of C++ and Ruby to develop SketchUp plug-in.
SketchUp Ruby secondary development; oblique photogrammetry; building reconstruction; single-image modeling
詹總謙,李一揮,桂鑫源.傾斜攝影測量與SketchUp二次開發(fā)技術(shù)相結(jié)合的建筑三維重建[J].測繪通報,2017(5):71-74.
10.13474/j.cnki.11-2246.2017.0157.
2016-10-28;
2017-01-20
國家重點研發(fā)計劃項目(2016YFB0501403)
詹總謙(1978—),男,博士,副教授,研究方向為數(shù)字攝影測量與計算機視覺。E-mail:zqzhan@sgg.whu.edu.cn
P23
A
0494-0911(2017)05-0071-04