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