周徐熠,郎誠廉
(同濟(jì)大學(xué) 電子與信息工程學(xué)院,上海 200331)
目前,三維視景技術(shù)在我國軌道交通領(lǐng)域的應(yīng)用愈加廣泛,列車運行控制、人員培訓(xùn)等都結(jié)合該技術(shù)開發(fā)了新型仿真系統(tǒng)[1-3]。但構(gòu)建三維視景,通常需要利用建模軟件搭建出線路的三維模型,再導(dǎo)入至Unity3D 等場景驅(qū)動引擎中進(jìn)行操作,其過程復(fù)雜、耗時較長。
為滿足快速構(gòu)建地鐵線路三維視景的需求,本文研究了地鐵線路三維模型的自動生成方法,并利用基于Unity3D 和 C#開發(fā)的程序?qū)崿F(xiàn)線路生成與場景驅(qū)動,可有效簡化人工建模過程,降低三維視景搭建難度,縮減工作量。
線路路徑是生成地鐵線路三維模型的基礎(chǔ),為將線路盡可能完整地還原至三維視景當(dāng)中,本文結(jié)合線路平面和縱斷面數(shù)據(jù),計算獲得平面路徑并將其映射為空間路徑。
線路平面由直線、圓曲線和緩和曲線組成,縱斷面設(shè)計線由直線和豎曲線組成[4]。由于線路參數(shù)較多,為便于讀取數(shù)據(jù),本文利用數(shù)據(jù)庫對各類線路數(shù)據(jù)進(jìn)行存儲和管理,并運用面向?qū)ο蠓椒ㄟM(jìn)行路徑坐標(biāo)計算。為此,定義了直線類、曲線類和坡道類,它們具有部分相同字段,可繼承自同一基類,如圖1 所示。同時,采用路徑點列表描述路徑定義了路徑點類,其字段包括Vector 3 類型的空間坐標(biāo)和double 類型的里程信息,相應(yīng)的路徑點對象存入泛型列表中,由此構(gòu)成線路路徑。此外,還定義了道岔類、信號機(jī)類和車站類,便于生成和定位相應(yīng)的模型。
圖1 線路數(shù)據(jù)類示意
(1)直線部分:根據(jù)始端坐標(biāo)、長度和方位角數(shù)據(jù),可計算出直線段末端的路徑點坐標(biāo)。(2)曲線部分:可按照第一緩和曲線、圓曲線、第二緩和曲線的順序計算路徑點。由于緩和曲線的曲率是變化的,而圓曲線的曲率固定,為使得路徑平滑和計算簡便,本文采用按長度分段計算的方法得到緩和曲線上的路徑點坐標(biāo),間隔取1 m,采用按圓心角分段計算的方法得到圓曲線上的路徑點坐標(biāo),間隔取0.01 rad,相比其他間隔取值,該取值可得到精度較高且視覺效果良好的平曲線。
1.2.1 緩和曲線路徑點坐標(biāo)計算
在如圖2 所示的對稱基本型平曲線中,J點為兩側(cè)緩和曲線切線交點,ZH點為直緩點,HY點為緩圓點,YH點為圓緩點,HZ點為緩直點,O點為圓曲線圓心,線段OM垂直于左側(cè)緩和曲線的切線。圓曲線半徑R、緩和曲線長LS和路線偏轉(zhuǎn)角α通常由線路平面圖給出,ZH點到J點之間的緩和曲線切線長T、內(nèi)移距p、切垂距q和緩和曲線角β0的求解過程涉及到曲線要素計算,本文不再贅述。
圖2 對稱基本型平曲線示意
計算緩和曲線上的路徑點坐標(biāo)時,以ZH點(或HZ點)為原點,以曲線切線里程增加方向為x軸正方向,建立局部平面直角坐標(biāo)系,將待求路徑點到原點的里程長度l代入三次拋物線型緩和曲線的參數(shù)方程,求得路徑點在該坐標(biāo)系下的坐標(biāo)(x,y),再通過坐標(biāo)系變換,得到路徑點在全局坐標(biāo)系下的坐標(biāo)(X,Y)。
1.2.2 圓曲線路徑點坐標(biāo)計算
計算J點至ZH點的單位向量,將該向量逆時針旋轉(zhuǎn)γ并乘以J點至O點的距離,得到,進(jìn)而求出O點的坐標(biāo)。將從O點指向HY點的向量繞O點旋轉(zhuǎn)至YH點,計算并記錄圓曲線上的一組路徑點坐標(biāo)。
緩和曲線對稱時,計算較為簡單,但在非對稱基本型平曲線中,兩側(cè)緩和曲線的長度LS不同,需分別計算第一、第二緩和曲線的內(nèi)移距p1、p2和切垂距q1、q2,并按公式(2)[5]計算第一緩和曲線切線長T1,為
非對稱情況下圓心坐標(biāo) (XO,YO)的求解表達(dá)式為
式中
最后將所有直線、緩和曲線和圓曲線上的路徑點按里程遞增的順序依次存入列表,構(gòu)成線路的平面路徑。
本文結(jié)合縱斷面數(shù)據(jù),計算各變坡點的平面坐標(biāo),并更新平面路徑上各路徑點的高度值,為提高豎曲線的平滑度,在變坡點的兩側(cè)通過線性插值增補多個路徑點,并進(jìn)行縱距修正,獲得線路的空間路徑。
1.3.1 路徑點高度值計算
根據(jù)變坡點里程,查找平面路徑中與變坡點里程最接近的前后兩點,并通過線性插值確定變坡點的平面坐標(biāo)。如圖3 所示,點P、B'為兩個變坡點,其中,B'的高度值尚未得出,點B為B'在水平面上的投影,根據(jù)P至B的里程長度 Δm和坡度i,計算出B'相對于B的高度 Δh,進(jìn)而得到B'的高度值。采用同樣的方法計算并更新該坡段上的所有路徑點的高度值,可得到P、B'間的空間路徑。將B之后所有路徑點的高度值增加 Δh,使之與B'處于同一水平面上,以便后續(xù)坡段上各路徑點高度值的計算。遍歷各坡段,重復(fù)上述過程,可得到不帶有豎曲線的線路空間路徑。
圖3 路徑點高度計算示意
1.3.2 路徑點增補
在如圖4 所示的半徑為RS的凹形豎曲線中,前后兩坡段的坡度分別為i1和i2,點P為變坡點,點A、B分別為豎曲線的起點和終點,豎曲線切線長TS[6]的計算公式為
圖4 豎曲線示意
根據(jù)TS在水平面上的投影長度可以確定A、B的里程,并進(jìn)一步得到A、B的空間坐標(biāo)。當(dāng)A、P間路徑點較少時,經(jīng)縱距修正后無法得到平滑的豎曲線,因此,需在A、P間通過線性插值增補n個等距的路徑點,并分別進(jìn)行修正,以獲得平滑豎曲線。B、P之間同理,n的大小取決于線性插值的間隔步長,考慮精度和視覺效果,本文中該間隔取1 m。
1.3.3 縱距修正
圖4 中,根據(jù)點A、P間各路徑點至A的距離f計算縱距z,并對高度值進(jìn)行修正。在P、B間進(jìn)行相同操作,可得到較為平滑的完整豎曲線路徑。各點處縱距z的近似公式為
Unity3D 集成了DirectX 和OpenGL,可快速創(chuàng)建模型并進(jìn)行圖形渲染。本文利用Unity3D 完成線路模型的創(chuàng)建,采用Douglas–Peucker 算法對模型進(jìn)行簡化,減少了模型的三角面數(shù)。
2.1.1 軌道模型創(chuàng)建
本文通過Unity3D 中的線渲染器(Line Renderer)組件實現(xiàn)路徑的可視化,并調(diào)用該組件的BakeMesh方法,得到帶有網(wǎng)格碰撞體的路徑實體模型。為提高三維視景的真實感,需給線渲染器添加PNG 格式的枕木貼圖,紋理模式為Tile,可達(dá)到根據(jù)線路長度自適應(yīng)重復(fù)貼圖的效果,將路徑實體模型作為簡易道床面,添加道砟貼圖。若不將枕木與道砟進(jìn)行圖層分離,則道岔處會發(fā)生貼圖重疊,顯示效果不好,分離圖層后,可有效改善顯示效果。
本文采用生成Mesh 網(wǎng)格的方法對鋼軌進(jìn)行建模。選取60 kg/m 鋼軌截面上的部分關(guān)鍵點作為模型的輪廓節(jié)點,計算各路徑點處的輪廓節(jié)點坐標(biāo)并存入Vector 3 類型的頂點數(shù)組vertexes 中,計算出每個三角面各頂點在頂點數(shù)組vertexes 中的索引,并存入int 類型數(shù)組indices 中,將這兩個數(shù)組賦值給Mesh網(wǎng)格對象的相應(yīng)字段“vertices”“triangles”,完成生成鋼軌的三維網(wǎng)格輪廓,配合相應(yīng)的材質(zhì)即可渲染出鋼軌模型,如圖5 所示。
圖5 鋼軌模型
2.1.2 站臺模型生成
考慮到線路中的部分站臺可能位于曲線上,因此需要沿著線路路徑來生成站臺模型。在確定了車站中心里程并設(shè)計站臺部分的線路路徑后,創(chuàng)建站臺的Mesh 網(wǎng)格并進(jìn)行渲染。根據(jù)屏蔽門平面布置圖,結(jié)合站臺形式,將各類屏蔽門的預(yù)制體定位至具體位置,如圖6 所示。
圖6 站臺模型
2.1.3 道岔模型創(chuàng)建
本文根據(jù)道岔的型號和參數(shù)計算各關(guān)鍵節(jié)點坐標(biāo),并以岔心坐標(biāo)為基準(zhǔn),對尖軌和非尖軌部分采用生成Mesh 網(wǎng)格的方法分段建模,構(gòu)造出道岔模型。尖軌單獨建模,通過模型旋轉(zhuǎn)動畫可模擬道岔開通位置的切換。本文以上海地鐵14 號線正線采用的60 kg/m 鋼軌9 號道岔[7]為例實現(xiàn)了道岔建模,如圖7 所示。此外,在生成模型前將道岔前后路徑進(jìn)行了分段,有效避免了轍叉部分與前后鋼軌重疊。
圖7 道岔模型
2.1.4 信號機(jī)模型定位
本文將信號機(jī)模型作為預(yù)制體,根據(jù)里程位置確定坐標(biāo)并實時加載、定位模型。預(yù)制體帶有燈光控制腳本,可根據(jù)仿真信號切換燈光顯示。
當(dāng)線路較長時,計算得出的路徑點數(shù)量龐大,用于列車運行模擬或路徑漫游時效果較好,但如果采用未簡化的路徑點來生成鋼軌、道床面等整體長度較大的模型,得到的模型里將包含大量冗余的三角面,增加了內(nèi)存消耗,同時,在進(jìn)行視野縮放后,若視野內(nèi)模型面數(shù)過多,會導(dǎo)致GPU 渲染速度下降和畫面幀率降低。減少部分路徑點后再生成軌道模型,對視覺效果的影響較小,且能夠降低模型三角面數(shù),提高渲染速度和幀率。
本文采用Douglas–Peucker 算法對路徑點的數(shù)量進(jìn)行適當(dāng)壓縮。該算法的優(yōu)點是具有平移和旋轉(zhuǎn)不變性,基本思路為:對路徑的起點和終點虛連一條直線,求各點至該直線的距離,找出最大距離值dmax,給定誤差上限ε,若dmax<ε,則該段路徑上的中間點全部舍去;若dmax≥ε,則保留dmax對應(yīng)的點,并以該點為界,把路徑分為兩部分,分別遞歸調(diào)用該方法,最終保留下來的點即為簡化結(jié)果[8]。
以上海地鐵14 號線上行線作為算例,線路長度為39.1 km,緩和曲線路徑點間隔取1 m,圓曲線路徑點間隔取0.01 rad,對簡化前的路徑應(yīng)用Douglas–Peucker 算法,得出不同ε取值時道床面模型參數(shù),如表1 所示。ε取0.05 時,原始路徑點至簡化路徑的垂直距離不超過5 cm,模型簡化后可以保持原有路徑形狀,視覺效果與簡化前差距較小,且模型的點、面數(shù)和內(nèi)存占用得到顯著降低,簡化效果較好。
表1 ε 不同取值對應(yīng)的道床面模型參數(shù)
此外,本文對各類三角面數(shù)量較多的模型采用多層次細(xì)節(jié)(LOD,Levels of Detail)技術(shù)提高了渲染速度,采用Mip 映射(Mip-mapping)技術(shù)降低了遠(yuǎn)距離情況下的貼圖失真程度,改善了視覺效果,提升了渲染速度。
Unity3D 作為一款場景驅(qū)動引擎,還包括了三維視景所需要的其他元素,如物理引擎、網(wǎng)絡(luò)通信、輸入輸出模塊等。本文采用Unity3D 開發(fā)的三維視景軟件實現(xiàn)了對線路數(shù)據(jù)庫的訪問,并在生成線路三維模型的基礎(chǔ)上,實現(xiàn)了虛擬場景漫游和列車運行模擬。
本文采用MySQL 數(shù)據(jù)庫對線路數(shù)據(jù)進(jìn)行管理,采用客戶端—服務(wù)器架構(gòu)實現(xiàn)三維視景軟件對線路數(shù)據(jù)的獲取。三維視景軟件客戶端采用Unity3D 結(jié)合C#程序進(jìn)行開發(fā),通過Unity3D 內(nèi)置的UGUI 系統(tǒng)完成人機(jī)交互界面設(shè)計,通過C#程序響應(yīng)UI 事件,完成模型生成與場景驅(qū)動。服務(wù)器主要負(fù)責(zé)數(shù)據(jù)管理,客戶端向服務(wù)器發(fā)送數(shù)據(jù)請求后,服務(wù)器通過SQL 語句獲取數(shù)據(jù)庫內(nèi)線路數(shù)據(jù),通過JSON 格式數(shù)據(jù)返回給客戶端,客戶端接收并處理數(shù)據(jù)后生成對應(yīng)的模型。
虛擬場景漫游可通過角色控制器(Character Controller)組件和攝像機(jī)(Camera)來實現(xiàn)。采用膠囊體充當(dāng)角色模型,綁定角色控制器組件,并將攝像機(jī)置于角色父物體下,用于獲得角色前方視野。通過監(jiān)聽輸入設(shè)備事件,借助鍵盤按鍵獲取角色移動方向向量,由角色控制器的Move 函數(shù)更新角色位置;角色模型和攝像機(jī)帶有Transform 組件,該組件包含了用于模型旋轉(zhuǎn)的Rotate 函數(shù),程序在每一幀內(nèi)獲取鼠標(biāo)移動方向,并調(diào)用Rotate 函數(shù)調(diào)整角色朝向和視野范圍。
3.3.1 車輛模型控制
本文以8 編組列車為例,通過C#程序控制列車每節(jié)車輛模型的運行路徑、位置和朝向,以路徑點列表作為各節(jié)車輛的運行路徑,控制車輛朝著當(dāng)前追蹤的路徑點行駛,各節(jié)車輛速度保持一致,實現(xiàn)了列車在軌道上的運行。
在畫面的每一幀內(nèi),計算出車輛當(dāng)前位置到下一路徑點的距離a,同時根據(jù)運行速度計算該幀內(nèi)車輛的行駛距離b。根據(jù)a和b的大小關(guān)系判斷車輛是否會到達(dá)或超越當(dāng)前正在追蹤的路徑點,若不能到達(dá),即b 3.3.2 道岔功能實現(xiàn) 在創(chuàng)建道岔模型時,根據(jù)數(shù)據(jù)庫提供的道岔鏈路信息,將道岔各開通方向與相應(yīng)的路徑點列表進(jìn)行綁定,道岔的開通狀態(tài)決定了車輛通過岔心后的運行路徑。在岔心處設(shè)有虛擬球體作為車輛通過時的觸發(fā)器(Trigger),該球體位于道岔父物體下,且對攝像機(jī)不可見。車輛經(jīng)過道岔時會穿過該球體,通過碰撞檢測技術(shù)結(jié)合觸發(fā)器的OnTriggerEnter 函數(shù),獲取道岔的實際開通方向,根據(jù)開通方向所對應(yīng)的路徑點列表對車輛運行路徑進(jìn)行調(diào)整。 3.3.3 車門、屏蔽門模型控制 列車到站停車后,利用“消息廣播”機(jī)制結(jié)合模型動畫實現(xiàn)了圖8 所示的車門和屏蔽門的開閉。模型動畫可通過Unity3D 的Animation 制作并綁定在模型預(yù)制體上,也可以通過導(dǎo)入iTween 插件編寫代碼實現(xiàn)平移動畫,并通過BroadcastMessage 函數(shù)對多個門體對象進(jìn)行消息廣播,觸發(fā)模型動畫。 圖8 車門與屏蔽門控制 本文對地鐵線路的三維模型自動生成方法進(jìn)行了研究,采用數(shù)據(jù)庫存儲線路數(shù)據(jù),利用Unity3D和C#完成對線路數(shù)據(jù)的讀取,實現(xiàn)了路徑生成、模型創(chuàng)建與簡化,在此基礎(chǔ)上通過角色控制器、碰撞檢測等技術(shù)實現(xiàn)了虛擬場景漫游和列車運行模擬。研究得出的方法具有通用性和拓展性,可應(yīng)用于地鐵三維視景仿真,以較高的精度還原地鐵線路場景,簡化建模過程,加快虛擬場景搭建進(jìn)度。4 結(jié)束語