商業(yè)化的設計平臺雖好,但自主研發(fā)的平臺有不可替代的優(yōu)點
商業(yè)化平臺技術成熟、模型渲染美觀,特別是在空間幾何計算方面的優(yōu)勢非常突出,但同時也存在一些問題:(1)專業(yè)性設計功能完全需要二次開發(fā);(2)不掌握核心代碼,無法修改其核心用戶界面(ui)以及固有的操作模式,為操作帶來不便;(3)純英文的開發(fā)接口程序庫,為二次開發(fā)帶來極大困難。
因此,如果僅僅是進行三維仿真建模的話尚且可行,但如果要利用其開發(fā)長大橋梁的正向設計功能,將無法繞開上述問題,另外,商業(yè)化平臺的前期購買以及后期升級維護成本較高。
相反,如果自主開發(fā)橋梁bim設計程序,因為涉及到空間幾何計算、坐標系統(tǒng)、劃網(wǎng)建模、3d 渲染、長大場景調度等前沿性技術,在開發(fā)難度、開發(fā)成本、開發(fā)周期方面都有較大風險和阻力。但優(yōu)勢在于掌握核心代碼,其設計模式及顯示界面均可根據(jù)使用者需求量身定制,并且程序升級改造靈活、維護成本低。
本文從opengl圖形渲染的底層功能著手,自主研發(fā)bim建模平臺,介紹一款兼具二維交互設計和三維顯示功能的鐵路橋梁bim程序。并從鐵路橋梁設計的專業(yè)角度出發(fā),在程序的開發(fā)思路、設計模式比選,以及在視圖顯示的關鍵性技術方面做出探索。
程序設計模式
三維橋梁設計程序的特點
(1)在橋梁設計計算方面,需要結合梁縫計算、結構計算等自身的專業(yè)性軟件,進行協(xié)同設計。
(2)在圖形類型方面,橋梁工程相對于路基、站場等專業(yè),以及對空間曲面建模方面有更多需求。
(3)在建模方式方面,鐵路橋涵設計除了需要建立標準圖庫來滿足標準化結構部件建模以外,橋址范圍內(nèi)的邊坡防護、涵洞順溝等,還需要根據(jù)設計參數(shù)及三維地形,進行自動化的自適應性建模。
(4)特大型鐵路橋梁在國內(nèi)高速鐵路橋梁設計中非常普及,單座橋梁長度突破幾百公里以上的情況已形成常態(tài),而橋梁孔跨布置是由精密計算而來,對bim中任意一處孔跨的更改,都將牽動整座橋數(shù)百公里梁跨的重新設計和圖形重構。因此,bim設計程序不僅要求高性能的計算機硬件,對程序數(shù)據(jù)結構的合理性及算法的高效性也都有較高要求。
二維、三維視圖并存的設計模式
目前,國內(nèi)鐵路項目采用的主要bim設計平臺,如:revit、bently、達索等,都是在純?nèi)S模式下開展設計,顛覆性地取締了傳統(tǒng)二維設計方法,設計成果也為純?nèi)S鐵路模型,仿真程度高;但鐵路橋涵因其自身特點,在設計過程中,對里程、高程、凈空、梁縫等外部數(shù)據(jù),以及梁、墩臺、基礎的結構尺寸等內(nèi)部數(shù)據(jù)的依賴程度很高,純?nèi)S設計模式無法直接將這些數(shù)據(jù)展現(xiàn)在設計者眼前,設計者若想查看,必須先經(jīng)過三維成果向二維成果轉換或手動調出數(shù)據(jù)窗口才可以得到上述數(shù)據(jù)。
因此對于bim橋梁設計,不宜完全摒棄二維設計方法。bim鐵路橋梁程序開發(fā)能夠兼?zhèn)淙S理念和傳統(tǒng)二維設計方法,同步生成二維設計成果以及進行三維建模展示或成為更加合理的設計模式。
另外,從程序開發(fā)角度來講,bim程序若能涵蓋二維設計模式,可以更方便地與傳統(tǒng)二維設計軟件進行銜接,減少bim程序開發(fā)工作量及開發(fā)難度。
而且二維、三維結合的設計模式,也可以使設計人員在新型的bim設計環(huán)境下,能夠利用自己熟悉的傳統(tǒng)設計思路來迅速適應程序,從而提高程序應用效率,否則純?nèi)S模式在鐵路橋梁勘察設計領域的推廣阻力和成本將會較大。本程序采用了二維視圖交互設計,及三維視圖顯示的設計模式。
程序主界面
程序框架
mvc框架模式概述
程序以c++ mfc為開發(fā)工具,以mvc框架模式開發(fā)基于opengl的二維、三維視圖顯示功能。模型- 視圖- 控制(mvc,model-view-controller)框架是圖形用戶界面(gui,graphic user interface)程序的一種普遍的設計框架。采用mvc框架模式的優(yōu)勢是使得opengl渲染函數(shù)的調用從普遍的消息路由中完全脫離開來。
模型層
模型層是應用程序的核心部分,所有應用程序中的數(shù)據(jù)和定義應用程序行為的實現(xiàn)都被包含在內(nèi)。最重要的是,任何指向視圖層和控制層功能都沒有被模型層引用,這意味著模型層是完全獨立的。它完全無須關心視圖層和控制層的行為,從而它只是簡單地對視圖層和控制層的請求進行加工操作。本程序中模型層負責全部的opengl頂點數(shù)據(jù)管理、頂點緩沖區(qū)對象(vbo,vertex buffer object)繪圖和圖形更新。
視圖層
視圖層負責根據(jù)窗口設備環(huán)境創(chuàng)建渲染設備環(huán)境,最后將可視化的內(nèi)容渲染到屏幕之上。視圖層不含有指向控制層的引用(與控制層獨立)。只有當控制層發(fā)送更新請求時,它才會執(zhí)行渲染操作。然而,視圖層需要有指向模型層的引用,因為它需要從模型層得到頂點、法向量、顏色等數(shù)據(jù),這樣才能將數(shù)據(jù)渲染到屏幕上。
控制層
控制層負責創(chuàng)建獨立渲染線程,并對用戶事件作出最直接的響應,它接受和處理所有的用戶在窗體或視口中的操作,如鼠標和鍵盤輸入等。為了處理用戶事件,控制層需要訪問具體的模型層組件和視圖層組件??刂茖咏M件通知模型層處理數(shù)據(jù),同時告訴視圖層更新顯示的數(shù)據(jù)。另外,在本程序中,控制層還負責對用戶事件相關的圖元數(shù)據(jù),如點、線、面、文字等,向opengl渲染數(shù)據(jù)進行轉換。
顯示功能關鍵技術
二維視圖開發(fā)
十字靶標相對鼠標的同步定位
交互式設計視圖開發(fā)中,如何將鼠標在屏幕窗體中的像素坐標(v)轉換為視圖中的世界坐標(w),是開發(fā)圖形定位、圖形選擇的前提。轉換公式的關鍵為計算窗體尺寸與視口所代表的世界坐標尺寸的比例vscale,當渲染視口與窗體邊緣完全重合時,當前鼠標所在的視圖世界坐標計算公式為:v = w • vscale,當視口與窗體不重合時,還要計入視口相對窗體的起點偏移量(d),則視圖世界坐標計算公式為:v = d + w • vscale。
基于vbo的圖形渲染
任何一個3d應用程序開發(fā)的最大的目標之一就是渲染速度,需要自始至終的將實際渲染圖形的數(shù)量限制在最小范圍內(nèi)。除此之外,想簡單提高多邊形的提交速度的話,通??梢岳胦pengl提供的優(yōu)化方法,頂點數(shù)組是一個比較好的方法。加上vbo的擴展,提高了渲染效率。使用頂點數(shù)組可以減少函數(shù)調用的次數(shù)和共享頂點的冗余使用,但其缺點是頂點數(shù)組中的函數(shù)位于客戶端并且數(shù)組中的數(shù)據(jù)在它每次被引用時都需要發(fā)送到服務器端一次。而vbo在服務器端的高性能內(nèi)存中為頂點屬性創(chuàng)造了一個“緩沖區(qū)對象”,也就是說,vbo能夠把數(shù)據(jù)加載到顯卡的高性能顯存中。因此當用戶對橋梁方案編輯時,只要不改變頂點數(shù)量,如修改墩高、拉伸或縮短結構尺寸等,便可降低渲染時間。
cad式的圖形拾取效果
opengl提供了豐富的圖形交互操作功能,可利用選擇模式完成圖形的拾取操作。對于拾取后如何標記顯示,進而通知用戶當前被選中圖形的拾取狀態(tài),在程序開發(fā)中嘗試了2種方法:(1)采用cad的方式,將備選中圖形顯示成點狀線狀態(tài);(2)采用達索系統(tǒng)的catia程序的方式,將被選中圖形顯示成高亮狀態(tài)。
經(jīng)過實際開發(fā)對比,前者可以非常好的利用vbo可提取并編輯頂點坐標的特點,只需要根據(jù)備選圖形的vbo名稱提取出相關頂點數(shù)組,之后無需跳出vbo模式渲染,直接以視口背景顏色按點狀線樣式重繪一次,即可達到與cad完全一樣的選中顯示狀態(tài)。而后者因為需要修改材質和光照狀態(tài),必須脫離vbo模式渲染,而且不易實現(xiàn)僅針對備選圖形的opengl狀態(tài)修改,所以程序選擇了cad式的點狀線圖形拾取處理方法。
三維場景空間索引
三維場景包括三維地形、橋梁結構、橋梁附屬設施等模型,鐵路三維地形為大型條帶狀模型,要求有比較高的交互性幀率來保證交互瀏覽操作時的渲染流暢性。因此,在渲染每一幀屏幕前,都需要對當前視景體所包含模型數(shù)據(jù)進行篩選,而且還要對無限視野下的模型數(shù)據(jù)進行分級簡化,所以,只有采用合適的空間索引數(shù)據(jù)結構,才能提高渲染效率。
本程序采用的是比較適合于呈片狀均布數(shù)據(jù)的四叉樹空間索引。四叉樹索引的基本思想是對空間數(shù)據(jù)遞歸劃分為樹結構,具體流程是,將當前空間數(shù)據(jù)等分成4個子空間,之后每個子空間遞歸劃分下去,直到樹的層次達到一定深度或者滿足某種要求后停止分割。
4叉樹索引比較簡單,但是存在以下不足:(1)當空間數(shù)據(jù)對象分布不均勻時,會生成嚴重不平衡樹,導致索引深度增加;(2)同一數(shù)據(jù)有可能被重復存儲到樹中多個不同節(jié)點之中,浪費存儲空間。
因此,對四叉樹模型做出以下改進:(1)規(guī)定空間數(shù)據(jù)僅保存在完全包含它的最小分割節(jié)點中,并且每個數(shù)據(jù)只能在樹中存儲一次,避免存儲空間的浪費;(2)在創(chuàng)建樹時,首先生成滿四叉樹,并限制四叉樹深度,從而避免分配數(shù)據(jù)時臨時插入節(jié)點而導致的內(nèi)存重新分配損耗;(3)一次性將樹的空節(jié)點所占內(nèi)存釋放掉。經(jīng)過以上改進便可生成較為平衡的四叉樹,改進后的四叉樹模型。
改進后的四叉樹模型示意圖
橋梁設計系統(tǒng)
通用圖管理
鐵路橋梁工點一般是基于通用圖開展設計的,如何建立界面操作簡潔、錄入及讀寫方便的圖庫管理系統(tǒng),是鐵路橋梁設計程序開發(fā)的重要環(huán)節(jié)。本程序的圖庫系統(tǒng)以c++語言對excel文件的讀取操作,以及對access文件的寫入操作為主要技術手段,開發(fā)獨立的顯示操作窗口。
通用圖庫管理窗口
提供使用者在開展bim橋梁設計前,預先對鐵路項目所用的結構通用圖及其對應工程數(shù)量進行錄入管理。主要功能為:(1)梁、墩、臺、基礎的excel 通用圖數(shù)據(jù)文件錄入;(2)各通用圖的匹配使用原則錄入;(3)圖庫界面中的排序、篩選顯示;(4)橋梁工點設計時,根據(jù)跨度、墩高等信息的圖庫自動匹配。
上下序資料管理
上下序資料獲得類型,按照“獲取 提供” 方式分為3種。
(1)在程序內(nèi)部利用開發(fā)專業(yè)之間的接口函數(shù),自動傳遞上下序數(shù)據(jù),如:鉆孔地層、地質縱斷、路基斷面、線位資料和地模坐標。
(2)利用圖形瀏覽窗口,手動調用瀏覽,如:路基斷面圖、地質柱狀圖。
(3)利用資料互提菜單,在程序中手動點擊并以文件形式獲取,如:線路資料表、隧道表、橋涵表和墩臺里程表等。
上序資料管理窗口
橋梁設計功能
(1)利用gridctrl 控件制作基于橋梁孔跨布置的表格式設計窗口,表格中以橋梁單位孔跨為單位按行排列。每行顯示其做代表孔跨的小里程側墩臺里程、跨度、梁縫、墩高、相關高程以及本跨度內(nèi)所采用的結構通用圖信息,從而通過編輯表格的方式完成全橋孔跨設計;
孔跨設計窗口
(2)基于橋梁彎道計算,完成整橋平移、孔跨調整、梁型變換等編輯操作后的,實時計算曲線段落內(nèi)的梁縫增值,更新全橋墩臺里程;
(3)根據(jù)墩臺里程,截取地模數(shù)據(jù),更新地面高程后重新計算墩身高度,并根據(jù)墩身高度更新匹配橋墩、橋臺、基礎通用圖;
(4)提取墩臺中心里程處的地層數(shù)據(jù)檢算基礎;
(5)設計文件輸出:dwg圖紙文件,包括:橋址平面圖、全橋布置圖、橫斷面布置圖、彎道布置圖;excel算單、工程量清單文件;基礎檢算結果文件。