田壯+聶蕓
摘 要: 針對三維模型標(biāo)簽的顯示,分析已有處理的不足,提出一種基于RTT(Render To Texture)的三維模型標(biāo)簽實時顯示的解決思路:在三維模型上確定顯示標(biāo)簽的目標(biāo)區(qū)域,用RTT相機對標(biāo)簽預(yù)渲染到幀緩存中,從幀緩存中提取出二維紋理映射到三維模型上的目標(biāo)區(qū)域,采用OSG(Open Scene Graph)實現(xiàn)對三維模型標(biāo)簽的實時顯示,具有良好的真實感。
關(guān)鍵詞: OSG; RTT; 三維模型標(biāo)簽; 實時顯示
中圖分類號: TN911.73?34 文獻(xiàn)標(biāo)識碼: 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)實技術(shù)構(gòu)建的某一區(qū)域真實而全面的可視化描述,集成了地形、地貌、河流、海洋、氣象等自然環(huán)境的虛擬展現(xiàn),并提供了相關(guān)態(tài)勢的準(zhǔn)確表現(xiàn),是軍事、公共安全、市政等各種應(yīng)用的重要輔助平臺。
在復(fù)雜的虛擬三維環(huán)境中,因為目標(biāo)繁多,無法對重復(fù)的目標(biāo)建立特有的三維模型[1],所以同一類的虛擬場景的目標(biāo)使用相同的模型,導(dǎo)致了同一類目標(biāo)無法具體區(qū)分,容易造成混淆,如一個飛行編隊中的戰(zhàn)機無法從模型上區(qū)分,而實際中的各種模型在表面都有明確的不同編號及輔助信息。針對這類問題,一般的解決思路有[2?4]:
(1) 在使用3DMax等建模軟件建模時,直接把編號信息建在模型上,固定在一個確定的位置上。其缺點是用戶應(yīng)用中無法改變編號信息的位置和信息內(nèi)容,可用性差。
(2) 在三維建模時,需要預(yù)留位置標(biāo)志,用戶在應(yīng)用中修改模型的相關(guān)信息。其缺點是用戶要對三維模型的內(nèi)部結(jié)構(gòu)預(yù)知,靈活性不足。
(3) 在模型上方加一個獨立的標(biāo)簽用來顯示編號信息,從視覺來看是兩部分,真實感有一定的缺失。
本文通過RTT技術(shù)實現(xiàn)了標(biāo)簽在三維模型上的實時顯示,在視覺上標(biāo)簽與三維模型融為一體,與現(xiàn)實世界真實情況相一致,真實感較強。增強了三維模型的信息承載能力。
1 OSG及RTT
OSG是一個開源的場景圖形管理開發(fā)庫,主要為圖形圖像應(yīng)用程序的開發(fā)提供場景管理和圖形的渲染優(yōu)化功能[5]。使用已經(jīng)成為工業(yè)標(biāo)準(zhǔn)的OpenGL底層渲染API。因此OSG具備跨平臺性,可以在Windows,MAC OS和大多數(shù)類型的Unix和Linux操作系統(tǒng)上運行。在OSG中大部分的操作可以獨立于本地的GUI。與工業(yè)標(biāo)準(zhǔn)和其他圖形庫相比,OSG的優(yōu)點顯而易見,它的封裝并提供了數(shù)量眾多的提升程序運行時性能的算法,針對包括分頁數(shù)據(jù)庫在內(nèi)的幾乎所有的主流數(shù)據(jù)格式之間的數(shù)據(jù)接口。
OSG紋理映射技術(shù)是把紋理圖像映射到物體表面,即在一個平面區(qū)域(紋理空間)上預(yù)先定義出紋理圖案,然后建立物體表面空間和紋理圖案坐標(biāo)之間的映射關(guān)系,當(dāng)物體表面的點確定后,就可以根據(jù)紋理空間對應(yīng)點的值將紋理圖案附到物體的表面上,紋理映射的一般步驟如圖1所示。
圖1 OSG紋理映射技術(shù)
OSG中主要有以下幾種圖形渲染時用到的緩存:Frame Buffer,F(xiàn)rame Buffer object,Pixel Buffer Object,Vertex Buffer object。其中FrameBuffer相當(dāng)于一個本地的緩存集合,包括顏色緩存、深度緩存、模板緩存、累計緩存,用于存放每幀的渲染數(shù)據(jù)。Frame Buffer object是OpenGL的一個高級擴展,提供一種渲染到目標(biāo)的新機制,提供了與Frame Buffer同類型的離屏渲染操作對象,可直接控制管線最終渲染數(shù)據(jù)的去向,分配的空間在顯存中,用Frame Buffer object來對顯存進行實際GPU運算的交互操作效率較高,主要用于顯存內(nèi)部數(shù)據(jù)的轉(zhuǎn)換、交互、操作的場合?;贠SG的RTT(Render To Texture)[6?10]技術(shù)就是通過預(yù)渲染一個子場景。RTT相機用于預(yù)渲染子場景,將子場景渲染結(jié)果(存儲在Frame Buffer中)通過紋理的方式直接讀取,然后可以作為紋理貼圖貼在主場景中的目標(biāo)位置,這樣可以在很大程度上提高渲染的性能,避免從FrameBuffer中拷貝紋理對象。基于OSG的RTT一般步驟如圖2所示。
圖2 基于OSG的RTT技術(shù)
2 三維模型標(biāo)簽處理流程
三維模型標(biāo)簽的處理流程設(shè)計如圖3所示。
圖3 基于RTT的三維模型標(biāo)簽實時顯示系統(tǒng)設(shè)計
從三維模型數(shù)據(jù)庫中讀出三維模型,可以進行鼠標(biāo)交互生成標(biāo)簽或者讀取Json文件生成。
實現(xiàn)三維模型標(biāo)簽實時顯示的步驟如下:
第1步:加載三維模型,如果通過Json文件加載標(biāo)簽執(zhí)行步驟第7步,否則執(zhí)行第2步。
第2步:在三維模型中通過鼠標(biāo)交互選擇標(biāo)簽的目標(biāo)區(qū)域;虛擬了RTT相機,投影到三維模型,方便用戶選擇標(biāo)簽位置。
第3步:輸入標(biāo)簽的信息內(nèi)容,根據(jù)標(biāo)簽內(nèi)容(即:虛擬三維場景中的目標(biāo)編號信息及其他輔助信息)生成二維文字。
第4步:二維文字添加到子場景,使用RTT相機預(yù)渲染子場景生成二維紋理。
第5步:設(shè)置紋理映射。
第6步:顯示三維模型及標(biāo)簽,執(zhí)行第8步。
第7步:讀取Json文件生成。如果不是第一次加載這個模型,那么可以選擇該模型對應(yīng)的Json文件,可對Json文件中的標(biāo)簽內(nèi)容進行更改然后直接進行繪制和顯示,避免了對于模型目標(biāo)區(qū)域的重復(fù)操作。如果要修改標(biāo)簽的位置則轉(zhuǎn)到第2步。
第8步:保存和標(biāo)簽有關(guān)的數(shù)據(jù)(如:虛擬投影攝像機的位置)到Json文件,方便下次調(diào)用時進行直接繪制或輸出到其他三維顯示系統(tǒng)中。
3 基于RTT的三維模型標(biāo)簽實時顯示相關(guān)實現(xiàn)
這里重點介紹基于RTT的三維模型標(biāo)簽實時顯示的相關(guān)實現(xiàn)。
3.1 標(biāo)簽?zāi)繕?biāo)區(qū)域
標(biāo)簽?zāi)繕?biāo)區(qū)域用于顯示三維模型的編號信息。目標(biāo)區(qū)域的選擇:主要為用戶提供目標(biāo)模型的選擇,這里提供了虛擬的RTT相機投影,方便用戶對模型區(qū)域的選擇。用戶可以通過鼠標(biāo)交互調(diào)整虛擬RTT相機的位置選擇用于顯示三維模型編號信息的區(qū)域。如圖4所示。
圖4 虛擬的RTT相機投影
目標(biāo)區(qū)域的生成:在用戶選擇好了目標(biāo)區(qū)域后(即虛擬RTT相機所對應(yīng)的模型位置),需要生成一個與虛擬RTT相機投影區(qū)域大小相同的透明四邊形面片用來標(biāo)明模型的編號信息,并且可以設(shè)置面片的細(xì)分度;在凹凸不平的模型表面,生成細(xì)粒度的四邊形面片;在較為平滑的曲面生成粗粒度的面片以減少運算量。生成方法:通過虛擬RTT相機的視點坐標(biāo)向模型發(fā)射線求交,返回交點作為構(gòu)建四邊形面片的點。
3.2 標(biāo)簽文字
在OSG中,OSGText提供了向場景中添加矢量文字的強大渲染功能,由于第三方插件FreeType的支持,它完全支持TureType字體,實現(xiàn)了文字的無極縮放,良好的抗鋸齒能力等。OSG專門定義了一個命名空間來管理文字的渲染,控制文字各種渲染屬性的設(shè)置。
在OSG中文字顯示的機制:創(chuàng)建一個Font對象讀取字體文件,把Font與對應(yīng)的文字相關(guān)聯(lián),創(chuàng)建繪制字符串圖形的紋理貼圖。
在文字渲染時,文字會根據(jù)字符的形狀生成紋理坐標(biāo),并為每個字符繪制一個已添加紋理的四邊形。本文的文字添加步驟如下:
(1) 創(chuàng)建一個Font對象并讀取字體文件。
(2) 創(chuàng)建一個osgText::Text對象,設(shè)置文字的屬性,同時關(guān)聯(lián)字體,程序為用戶提供了字體的選擇。如果在場景中顯示中文,需要將中文轉(zhuǎn)換為寬字符。
(3) 調(diào)用addDrawable()方法將步驟(2)的osgText::Text實例對象添加到一個Geode實例,然后添加到場景進行渲染。
3.3 RTT相機的OSG節(jié)點組成及設(shè)置
本文通過RTT技術(shù)實現(xiàn)將子場景中的二維文字實時渲染到主場景的二維平面的功能,實現(xiàn)方式是在一個場景上創(chuàng)建一個覆蓋圖,這張覆蓋圖的生成是通過預(yù)渲染一個子場景(已生成的二維文字)到這張貼圖上,最終將紋理貼圖貼到主場景上,而投影的位置是通過三維模型標(biāo)簽的目標(biāo)區(qū)域預(yù)先確定的。
渲染場景樹的節(jié)點組成如圖5所示。
圖5 場景樹
在場景的根節(jié)點下有兩個子節(jié)點:一個是osg::Camera對象用于RTT 相機,在RTT Camera節(jié)點下添加已經(jīng)生成的二維文字作為子場景,然后定義一個二維紋理對象osg::Texture2D用來從子場景中提取二維紋理,最后定義一張二維紋理貼圖osg::Image,作為覆蓋圖用于存儲二維紋理;另一個是場景組節(jié)點,添加了三維模型和承載三維模型標(biāo)簽信息的四邊形面片。
RTT相機設(shè)置如下:
//紋理寬度TextWidth、高度TextHight
camera?>setViewport (0,0,TextWidth,TextHight);
// Image為紋理關(guān)聯(lián)的圖像
camera?>attach(osg::Camera::COLOR_BUFFER,
Image.get());
//Camera投影設(shè)置
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 實驗結(jié)果
實驗?zāi)P鸵皇褂梦溲b直升機模型,根據(jù)真實的裝備編號信息生成二維文字,然后映射到直9武裝直升機模型上(圖6(a)部分來源于互聯(lián)網(wǎng))。效果如圖6所示。
圖6 真實圖片和實時繪制的編號
實驗?zāi)P投褂貌ㄒ?37模型,根據(jù)飛機的飛行速度實時在機身上顯示時速。效果如圖7所示。
圖7 飛機模型時速顯示
5 結(jié) 語
本文采用RTT技術(shù),實現(xiàn)了三維虛擬場景中三維模型的具體編號及相關(guān)數(shù)據(jù)的實時顯示,效果較好。需要進一步完善:多個標(biāo)簽(飛機的雙側(cè))、圖標(biāo)與文字的組合顯示(民航客機)、字的輪廓顯示樣式等問題。
參考文獻(xiàn)
[1] 李劍功,孫延明,賴朝安.基于Java3D的不規(guī)則曲面紋理貼圖的研究[J].現(xiàn)代制造工程,2007(1):41?43.
[2] David F Rogers.計算機圖形學(xué)算法基礎(chǔ)[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].北京:清華大學(xué)出版社,2010.
[6] 楊石興.OpenSceneGraph程序設(shè)計教程[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] 邱飛岳,趙柏樂,張維澤,等.基于投影紋理映射的球面斜投影校正方法研究及其應(yīng)用[J].中國生物醫(yī)學(xué)工程學(xué)報,2012,31(2):687?702.
[10] GOLDMAN R. An integrated introduction to computer graphics and geometric modeling [M]. London, CRC Press, 2011.