田壯+聶蕓
摘 要: 針對三維模型標簽的顯示,分析已有處理的不足,提出一種基于RTT(Render To Texture)的三維模型標簽實時顯示的解決思路:在三維模型上確定顯示標簽的目標區(qū)域,用RTT相機對標簽預渲染到幀緩存中,從幀緩存中提取出二維紋理映射到三維模型上的目標區(qū)域,采用OSG(Open Scene Graph)實現(xiàn)對三維模型標簽的實時顯示,具有良好的真實感。
關鍵詞: OSG; RTT; 三維模型標簽; 實時顯示
中圖分類號: TN911.73?34 文獻標識碼: A 文章編號: 1004?373X(2015)20?0055?04
RTT?based real?time display technology of 3D model label
TIAN Zhuang, NIE Yun
(North China Institute of Computer Technology, Beijing 100083, China)
Abstract: For the display of 3D model label, the insufficient of the existing processing is analyzed, and a new solution of 3D model label real?time display based on render to texture (RTT) is proposed. The target area of display label is determined on the 3D model, and the label is pre?rendered into the frame?buffer by RTT camera. The 2D texture extracted from frame?buffer is mapped to the target area on 3D model. The real?time display of 3D model label was realized by using open scene graph (OSG), and has good reality sense.
Keywords: OSG; RTT; 3D model label; real?time display
0 引 言
三維虛擬環(huán)境是利用虛擬現(xiàn)實技術構建的某一區(qū)域真實而全面的可視化描述,集成了地形、地貌、河流、海洋、氣象等自然環(huán)境的虛擬展現(xiàn),并提供了相關態(tài)勢的準確表現(xiàn),是軍事、公共安全、市政等各種應用的重要輔助平臺。
在復雜的虛擬三維環(huán)境中,因為目標繁多,無法對重復的目標建立特有的三維模型[1],所以同一類的虛擬場景的目標使用相同的模型,導致了同一類目標無法具體區(qū)分,容易造成混淆,如一個飛行編隊中的戰(zhàn)機無法從模型上區(qū)分,而實際中的各種模型在表面都有明確的不同編號及輔助信息。針對這類問題,一般的解決思路有[2?4]:
(1) 在使用3DMax等建模軟件建模時,直接把編號信息建在模型上,固定在一個確定的位置上。其缺點是用戶應用中無法改變編號信息的位置和信息內容,可用性差。
(2) 在三維建模時,需要預留位置標志,用戶在應用中修改模型的相關信息。其缺點是用戶要對三維模型的內部結構預知,靈活性不足。
(3) 在模型上方加一個獨立的標簽用來顯示編號信息,從視覺來看是兩部分,真實感有一定的缺失。
本文通過RTT技術實現(xiàn)了標簽在三維模型上的實時顯示,在視覺上標簽與三維模型融為一體,與現(xiàn)實世界真實情況相一致,真實感較強。增強了三維模型的信息承載能力。
1 OSG及RTT
OSG是一個開源的場景圖形管理開發(fā)庫,主要為圖形圖像應用程序的開發(fā)提供場景管理和圖形的渲染優(yōu)化功能[5]。使用已經成為工業(yè)標準的OpenGL底層渲染API。因此OSG具備跨平臺性,可以在Windows,MAC OS和大多數(shù)類型的Unix和Linux操作系統(tǒng)上運行。在OSG中大部分的操作可以獨立于本地的GUI。與工業(yè)標準和其他圖形庫相比,OSG的優(yōu)點顯而易見,它的封裝并提供了數(shù)量眾多的提升程序運行時性能的算法,針對包括分頁數(shù)據庫在內的幾乎所有的主流數(shù)據格式之間的數(shù)據接口。
OSG紋理映射技術是把紋理圖像映射到物體表面,即在一個平面區(qū)域(紋理空間)上預先定義出紋理圖案,然后建立物體表面空間和紋理圖案坐標之間的映射關系,當物體表面的點確定后,就可以根據紋理空間對應點的值將紋理圖案附到物體的表面上,紋理映射的一般步驟如圖1所示。
圖1 OSG紋理映射技術
OSG中主要有以下幾種圖形渲染時用到的緩存:Frame Buffer,F(xiàn)rame Buffer object,Pixel Buffer Object,Vertex Buffer object。其中FrameBuffer相當于一個本地的緩存集合,包括顏色緩存、深度緩存、模板緩存、累計緩存,用于存放每幀的渲染數(shù)據。Frame Buffer object是OpenGL的一個高級擴展,提供一種渲染到目標的新機制,提供了與Frame Buffer同類型的離屏渲染操作對象,可直接控制管線最終渲染數(shù)據的去向,分配的空間在顯存中,用Frame Buffer object來對顯存進行實際GPU運算的交互操作效率較高,主要用于顯存內部數(shù)據的轉換、交互、操作的場合?;贠SG的RTT(Render To Texture)[6?10]技術就是通過預渲染一個子場景。RTT相機用于預渲染子場景,將子場景渲染結果(存儲在Frame Buffer中)通過紋理的方式直接讀取,然后可以作為紋理貼圖貼在主場景中的目標位置,這樣可以在很大程度上提高渲染的性能,避免從FrameBuffer中拷貝紋理對象?;贠SG的RTT一般步驟如圖2所示。
圖2 基于OSG的RTT技術
2 三維模型標簽處理流程
三維模型標簽的處理流程設計如圖3所示。
圖3 基于RTT的三維模型標簽實時顯示系統(tǒng)設計
從三維模型數(shù)據庫中讀出三維模型,可以進行鼠標交互生成標簽或者讀取Json文件生成。
實現(xiàn)三維模型標簽實時顯示的步驟如下:
第1步:加載三維模型,如果通過Json文件加載標簽執(zhí)行步驟第7步,否則執(zhí)行第2步。
第2步:在三維模型中通過鼠標交互選擇標簽的目標區(qū)域;虛擬了RTT相機,投影到三維模型,方便用戶選擇標簽位置。
第3步:輸入標簽的信息內容,根據標簽內容(即:虛擬三維場景中的目標編號信息及其他輔助信息)生成二維文字。
第4步:二維文字添加到子場景,使用RTT相機預渲染子場景生成二維紋理。
第5步:設置紋理映射。
第6步:顯示三維模型及標簽,執(zhí)行第8步。
第7步:讀取Json文件生成。如果不是第一次加載這個模型,那么可以選擇該模型對應的Json文件,可對Json文件中的標簽內容進行更改然后直接進行繪制和顯示,避免了對于模型目標區(qū)域的重復操作。如果要修改標簽的位置則轉到第2步。
第8步:保存和標簽有關的數(shù)據(如:虛擬投影攝像機的位置)到Json文件,方便下次調用時進行直接繪制或輸出到其他三維顯示系統(tǒng)中。
3 基于RTT的三維模型標簽實時顯示相關實現(xiàn)
這里重點介紹基于RTT的三維模型標簽實時顯示的相關實現(xiàn)。
3.1 標簽目標區(qū)域
標簽目標區(qū)域用于顯示三維模型的編號信息。目標區(qū)域的選擇:主要為用戶提供目標模型的選擇,這里提供了虛擬的RTT相機投影,方便用戶對模型區(qū)域的選擇。用戶可以通過鼠標交互調整虛擬RTT相機的位置選擇用于顯示三維模型編號信息的區(qū)域。如圖4所示。
圖4 虛擬的RTT相機投影
目標區(qū)域的生成:在用戶選擇好了目標區(qū)域后(即虛擬RTT相機所對應的模型位置),需要生成一個與虛擬RTT相機投影區(qū)域大小相同的透明四邊形面片用來標明模型的編號信息,并且可以設置面片的細分度;在凹凸不平的模型表面,生成細粒度的四邊形面片;在較為平滑的曲面生成粗粒度的面片以減少運算量。生成方法:通過虛擬RTT相機的視點坐標向模型發(fā)射線求交,返回交點作為構建四邊形面片的點。
3.2 標簽文字
在OSG中,OSGText提供了向場景中添加矢量文字的強大渲染功能,由于第三方插件FreeType的支持,它完全支持TureType字體,實現(xiàn)了文字的無極縮放,良好的抗鋸齒能力等。OSG專門定義了一個命名空間來管理文字的渲染,控制文字各種渲染屬性的設置。
在OSG中文字顯示的機制:創(chuàng)建一個Font對象讀取字體文件,把Font與對應的文字相關聯(lián),創(chuàng)建繪制字符串圖形的紋理貼圖。
在文字渲染時,文字會根據字符的形狀生成紋理坐標,并為每個字符繪制一個已添加紋理的四邊形。本文的文字添加步驟如下:
(1) 創(chuàng)建一個Font對象并讀取字體文件。
(2) 創(chuàng)建一個osgText::Text對象,設置文字的屬性,同時關聯(lián)字體,程序為用戶提供了字體的選擇。如果在場景中顯示中文,需要將中文轉換為寬字符。
(3) 調用addDrawable()方法將步驟(2)的osgText::Text實例對象添加到一個Geode實例,然后添加到場景進行渲染。
3.3 RTT相機的OSG節(jié)點組成及設置
本文通過RTT技術實現(xiàn)將子場景中的二維文字實時渲染到主場景的二維平面的功能,實現(xiàn)方式是在一個場景上創(chuàng)建一個覆蓋圖,這張覆蓋圖的生成是通過預渲染一個子場景(已生成的二維文字)到這張貼圖上,最終將紋理貼圖貼到主場景上,而投影的位置是通過三維模型標簽的目標區(qū)域預先確定的。
渲染場景樹的節(jié)點組成如圖5所示。
圖5 場景樹
在場景的根節(jié)點下有兩個子節(jié)點:一個是osg::Camera對象用于RTT 相機,在RTT Camera節(jié)點下添加已經生成的二維文字作為子場景,然后定義一個二維紋理對象osg::Texture2D用來從子場景中提取二維紋理,最后定義一張二維紋理貼圖osg::Image,作為覆蓋圖用于存儲二維紋理;另一個是場景組節(jié)點,添加了三維模型和承載三維模型標簽信息的四邊形面片。
RTT相機設置如下:
//紋理寬度TextWidth、高度TextHight
camera?>setViewport (0,0,TextWidth,TextHight);
// Image為紋理關聯(lián)的圖像
camera?>attach(osg::Camera::COLOR_BUFFER,
Image.get());
//Camera投影設置
camera?>setProjectionMatrixAsOrtho2D(?TextWidth,TextWidth,?TextHight,TextHight);
camera?>setReferenceFrame(osg::Transform::ABSOLUTE_RF);
//bs為三維模型的包圍球
Camera?>setViewMatrixAsLookAt(bs.center()?osg::Vec3(0.0f,2.0f,0.0f)
*bs.radius(),bs.center(), osg::Vec3(0.0f,0.0f,1.0f));
camera?>setClearMask(GL_DEPTH_BUFFER_BIT);
camera?>setRenderOrder(osg::Camera::PRE_RENDER);
camera?>setRenderTargetImplementation(osg::Camera::PIXEL_BUFFER_RTT);
4 實驗結果
實驗模型一使用武裝直升機模型,根據真實的裝備編號信息生成二維文字,然后映射到直9武裝直升機模型上(圖6(a)部分來源于互聯(lián)網)。效果如圖6所示。
圖6 真實圖片和實時繪制的編號
實驗模型二使用波音737模型,根據飛機的飛行速度實時在機身上顯示時速。效果如圖7所示。
圖7 飛機模型時速顯示
5 結 語
本文采用RTT技術,實現(xiàn)了三維虛擬場景中三維模型的具體編號及相關數(shù)據的實時顯示,效果較好。需要進一步完善:多個標簽(飛機的雙側)、圖標與文字的組合顯示(民航客機)、字的輪廓顯示樣式等問題。
參考文獻
[1] 李劍功,孫延明,賴朝安.基于Java3D的不規(guī)則曲面紋理貼圖的研究[J].現(xiàn)代制造工程,2007(1):41?43.
[2] David F Rogers.計算機圖形學算法基礎[M].北京:機械工業(yè)出版社,2002.
[3] 程曉箏,李震霄.一種基于表面積比例的地形紋理貼圖算法[J].計算機仿真,2007,24(8):174?177.
[4] CATMULL E. A subdivision algorithm for computer display of curved surfaces [D]. Salt Lake City, University of Utah,1974.
[5] 肖鵬,劉更代,徐明亮.OpenSceneGraph三維渲染引擎編程指南[M].北京:清華大學出版社,2010.
[6] 楊石興.OpenSceneGraph程序設計教程[EB/OL].[2008?10?26]. http://www.docin.com/p?1055452878.html.
[7] OpenSceneGraph. User guide [EB/OL]. [2011?03?15]. http://www.opemsceneGraph.net.
[8] SHREINER D. Open GL編程指南[M].李軍,譯.北京:機械工程出版社,2010.
[9] 邱飛岳,趙柏樂,張維澤,等.基于投影紋理映射的球面斜投影校正方法研究及其應用[J].中國生物醫(yī)學工程學報,2012,31(2):687?702.
[10] GOLDMAN R. An integrated introduction to computer graphics and geometric modeling [M]. London, CRC Press, 2011.