魏遠航 朱錢洪 李曉俊



摘要:CityEngine在高效迅速生成大規模三維場景模型方面具有較大的技術優勢,然而在建模完成后導出為obj模型常發生扭曲變形的情況。本文從OBJ模型數據結構和存儲的角度進行分析,探究其形成原因并提出了相應的解決方案。
關鍵詞:CityEngine,obj,扭曲變形
中圖分類號:TP391 文獻標識碼:A
文章編號:1009-3044(2020)18-00010-02
開放科學(資源服務)標識碼(OSID):
1 引言
CityEngine建模是一種基于規則的快速三維建模方法,能調用建筑物底面矢量數據中屬性字段,進行程序批量快速建模,充分利用了已有的數據,同時提高了效率,為大場景三維建模提供了一種新的方法[1-3]。CityEngine高效迅速生成大場景模型的秘訣是其采用了CGA語言(Computer Generated Architec-ture)作為設計語言,通過預定義各類規則并將其賦予對應的矢量面,迅速生成模型。這種批量建模技術非常適合對模型本身精細度要求不高但場景很大的工作(如規劃三維效果展示)。
OBJ文件是一種標準的3D模型文件格式,很適合用于3D軟件模型之間的互導,作為一種文本文件格式,采用單純的字典狀結構,易于存儲[4-5]。然而在實際應用中,經常出現Citven-gine建模完成后導出為obj模型發生扭曲變形的情況,在其他三維平臺(如3Dmax)無法正常顯示。這對于Cityengine建模的后續分析和應用造成了困難。本文擬從OBJ模型數據結構和存儲的角度進行分析,探究其形成原因并提出相應的解決方案。
2 OBJ模型數據結構
OBJ模型文件是Alias公司開發的一種標準三維模型文件格式[6],主流的軟件平臺(如Maya、3D max)一般都支持OBJ格式。OBJ模型以文本文件存儲,構成模型的點、矢量、模型坐標是明碼標記,非常利用用戶對其進行查看和編輯。
OBJ模型文件一般包括obj文件和mtl文件組成,mtl是材質索引庫文件,本文不作討論。Obj文件是由一行行的文本構成,可以隨意加入空行和注釋行[7-9]。有效內容部分由關鍵字(Key-word)開頭,關鍵字標記了該行的含義和作用[10]。obj常用的關鍵字及含義如下所示。
3 變形原因分析
使用規則文件在Cityengine中構建的模型以及導出的obj模型對比如圖1所示(左側為obj模型,右側為cityengine軟件顯示模型),對比兩者可以發現obj模型變形較為嚴重,幾乎所有面都發生不同程度的變形,進一步分析可知:(1)變形的方向在于平面方向,垂直方向幾乎沒有發生位移;(2)貼圖的方向都屬正常,面的朝向大致也正常。
根據上文對obj文件數據結構的剖析,貼圖方向和面朝向正常可以判斷vn、vt、f參數應該屬于正常,變形的方向可以初步判斷v參數的x和z值可能存在問題。為了進一步分析其頂點坐標值存在的誤差,檢查了obj文件中存在變形的某一面的頂點坐標的情況,如下所示。
# mesh 'cut_mesh_2from geometry ' cut_mesh_2'
v 35614275.632 341.446 -3221109.749
v 35614275.632 345.446 -3221109.749
v 35614281.306 341.446 -3221111.697
v 35614281.306 345.446 -3221111.697
#4 vertices
vt 0.0000 0.0000
vt l.0000 0.0000
vt l.0000 1.0000
vt 0.0000 1.0000
#4 texture coordinates
g cut_mesh_2
s off
usemtl CityEngineMaterial_4
f 43/33 45/34 46/35 44/36
#1 face
所選分析面是obj模型中屋頂部分,從obj模型的側視圖可以看出該面為不規則四邊形,而從obj文件頂點坐標來看屬于矩形,坐標值與模型顯示效果明顯不符合(如圖2所示)。因此可以判斷obj文件中頂點坐標值是正確的,扭曲的原因應當發生在軟件讀取或顯示的過程中。
進一步研究發現,obj文件頂點坐標值是以float類型讀寫的,而obj文件是以文本文件存儲的,理論上可以存儲double型的數值。上文中的v參數中x坐標值繼承了Cityengine中底面矢量數據的平面坐標系x值(double類型)。由于float類型最大只能保留7位有效數字,而平面x坐標整數位有8位,y坐標整數位有7位,因此在讀寫時精度必然受到損失。
4 解決方案及驗證
在三維GIS研究和工作中,不可避免的會使用到高斯平面坐標等數值較大的底面矢量數據,在此基礎上使用Cityengine生成模型通常都會遇到變形扭曲的問題。經過上文分析,發現扭曲變形的主要原因是位數較大的x、z軸坐標值,而v值(對應于高程)一般整數不超過4位數,不存在變形問題。
本文提出兩種解決方法解決上述問題:(1)在建模前對矢量文件進行坐標轉換,轉換為不加代號坐標,即可將精度至少提升到小數位后1位,滿足一般的建模精度;(2)在建模前將矢量中心平移至坐標0點,建模后反向平移,精度至少提升至厘米級,但建模范圍大致必須在以中心點lOkm范圍內。
將建模前建筑物地面矢量數據進行坐標轉換,由Xian_1980_3_Degree_GK_20ne_35轉換為Xian_1980_3_De-gree_GK_CM_105E,同步將矢量數據平移至坐標0點,將兩者分別導入Cityengine進行規則建模,導出的obj模型如下所示。
通過最終導出obj模型效果的對比可以發現,兩種解決方案得到的obj模型均不存在明顯變形扭曲,但是坐標轉換的方法在細節處依然存在輕微的變形,這是由于平面坐標只能精確到小數點后1位導致的,而將矢量平移至0點的方法則不存在任何變形問題,精度較高。5總結
Obj模型具有文件組織結構簡單,易于存儲的特點,是三維模型的通用格式之一,非常利于軟件平臺之間的銜接,然而對于三維GIS應用,特別是大場景的模型構建存在坐標讀寫精度的缺陷。測繪行業的高斯平面坐標一般都是數位較高的雙精度值,對于obj單精度讀寫的特性會產生頂點坐標精度降低,模型扭曲變形的風險,本質上是由傳統三維建模行業和測繪行業研究對象差異引起的。
本文對于上述問題提出了兩種解決方案,第一種方法操作簡單但是精度略低,第二種方法精度高但操作步驟更復雜,很好地解決了Cityengine導出模型扭曲變形的問題。近年來,三維建模以及三維空間分析技術快速發展,對于三維模型數據通用性提出了更高的要求,作者也期待在測繪行業盡早形成相應的三維數據規范,以促進三維技術應用更快的發展。 參考文獻:
[1]謝衍憶,黃良平,陳元增,等,基于CityEngine的城市三維快速建模方法及應用[J].地理空間信息,2016,14(2):39-40,62,8.
[2]鄒倩.CityEngine在不動產登記三維建模與數據庫設計研究[D].合肥:合肥工業大學,2016.
[3]王璐,朱小燕,谷中仁.基于CityEngine的校園三維模型建模研究[J].電子世界,2015(21):30-32.
[4]肖健,魏雄,王仁波.基于OpenGL的大型建筑三維場景模擬的實現與意義[J].電子質量,2016(11):88-92.
[5]李寧,段國林,許紅靜.Pro/E與ADAMS之間的數據交換方式的研究[Jl‘機械設計,2012,29(9):36-40.
[6]趙艷松.基于gITF的三維模型服務關鍵技術研究與實現[D].西安:西安電子科技大學,2017.
[7]王金峰,姚國清.三維模型文件中的OBJ格式在OpenGL中的輸入與處理[Jl.電腦知識與技術,2011,7(10):2393-2396。2399.
[8]謝利明.基于OpenGL的自動化立體倉庫仿真平臺設計[D].河北:河北大學,2012.
[9]王清,張必蘭.基于增強現實的安卓英語單詞識記軟件的設計與實現[J].電腦知識與技術(學術交流),2014(9X): 6431-6433,6435.
【通聯編輯:唐一東】
基金項目:重慶市國土房管科技項目(KJ-2019010):傾斜攝影實景三維模型在村鎮規劃中的應用研究
作者簡介:魏遠航(1989-),男,重慶人,助理工程師,工學學士,主要研究方向為三維建模和無人機遙感。