摘 要: 為了實(shí)現(xiàn)虛擬圖書(shū)館的可視化仿真,綜合運(yùn)用實(shí)地測(cè)量、參考建筑圖紙、拍攝等方法獲取圖書(shū)館的外形輪廓,通過(guò)數(shù)學(xué)建模得到整個(gè)圖書(shū)館的數(shù)學(xué)建模,再借助基于C++的幾何庫(kù),將圖書(shū)館的數(shù)學(xué)建模轉(zhuǎn)化為圖形實(shí)例,最后結(jié)合OpenGL技術(shù),通過(guò)運(yùn)用光照、材質(zhì)和紋理,渲染出整個(gè)圖書(shū)館,使得圖書(shū)館仿真逼真、自然。仿真結(jié)果表明,構(gòu)建的虛擬圖書(shū)館逼真地展現(xiàn)了圖書(shū)館的形態(tài)特征,真實(shí)感較好,為虛擬建筑的模擬提供了技術(shù)參考。
關(guān)鍵詞: 數(shù)學(xué)建模; 幾何庫(kù); OpenGL; 建筑仿真
中圖分類(lèi)號(hào): TN911.71?34; TP391.41 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)02?0078?04
Visualization research and simulation of OpenGL?based 3D architecture
MIN Fang1, ZHANG Zhixian2, YANG Gongting1
(1. Jincheng College, Nanjing University of Aeronautics and Astronautics, Nanjing 211156, China;
2. College of Automation, Nanjing University of Aeronautics and Astronautics, Nanjing 210016, China)
Abstract: In order to realize the visual simulation of the virtual library, the outline of the library is obtained by comprehensively using the methods of field measurement, architectural drawings reference, photographs, etc. The mathematical modeling of the entire library is obtained by mathematical expression, and converted into the graphic instance by virtue of the geometry library based on C++. In combination with OpenGL technology, the entire library is rendered by illumination, material and texture, which makes the library simulation realistic and natural. The simulation results show that the constructed virtual library can realistically exhibit the morphological characteristics of the library, and has perfect sens of reality, which provides a technical reference for virtual architecture simulation.
Keywords: mathematical modeling; geometry library; OpenGL; building simulation
0 引 言
虛擬三維建筑是虛擬現(xiàn)實(shí)研究領(lǐng)域的熱點(diǎn)課題之一。虛擬建筑由數(shù)學(xué)建模、幾何庫(kù)、紋理和渲染等組成;其中建筑中各構(gòu)件數(shù)學(xué)建模和幾何編程,具有較高的挑戰(zhàn)性。虛擬建筑在大型建筑的早期演示和論證、房地產(chǎn)演示等方面有著廣大的應(yīng)用場(chǎng)景[1]。目前,針對(duì)虛擬建筑仿真,國(guó)內(nèi)外專(zhuān)家學(xué)者開(kāi)展了一系列研究。文獻(xiàn)[2]提出了一種面向?qū)ο蟮闹С秩S圖形可重用的組件層次設(shè)計(jì)方法,分析了組件的性能、設(shè)計(jì)方法和圖元算法,實(shí)現(xiàn)了基于OpenGL的支持三維虛擬場(chǎng)景、建模和運(yùn)動(dòng)仿真的組件設(shè)計(jì),描述了實(shí)體的運(yùn)動(dòng)層次鏈接關(guān)系和數(shù)據(jù)結(jié)構(gòu),并實(shí)現(xiàn)了虛擬環(huán)境的建筑物建模和運(yùn)動(dòng)仿真。文獻(xiàn)[3]采用了2種技術(shù):基于圖像的建模方法和基于幾何網(wǎng)格頂點(diǎn)著色的建模方法,并對(duì)虛擬場(chǎng)景的光照、消隱、紋理影射技術(shù)等作了初步的探索。文獻(xiàn)[4]提出OpenGL的特點(diǎn)和工作原理,詳細(xì)論述了如何建立VC和OpenGL庫(kù)應(yīng)用接口及進(jìn)行三維圖形開(kāi)發(fā)的具體步驟和基本過(guò)程,最后通過(guò)三維地形圖繪制實(shí)例的過(guò)程分析,便于用戶(hù)理解運(yùn)用。本文以南京航空航天大學(xué)金城學(xué)院圖書(shū)館作為研究對(duì)象,實(shí)現(xiàn)特點(diǎn)如下:對(duì)幾何圖形數(shù)學(xué)建模;使用C++語(yǔ)言建立幾何庫(kù);通過(guò)OpenGL編程,添加紋理,渲染虛擬圖書(shū)館模型;驗(yàn)證數(shù)學(xué)模型和幾何庫(kù)在虛擬建筑可視化研究的可行性。
整個(gè)系統(tǒng)模型的實(shí)現(xiàn)如圖1所示。
1 幾何庫(kù)
1.1 點(diǎn)的實(shí)現(xiàn)
點(diǎn)類(lèi)的數(shù)據(jù)成員是雙精度浮點(diǎn)型數(shù)組xyz,以及記錄數(shù)組大小的整型變量dim。點(diǎn)類(lèi)的意義是表示在空間之間坐標(biāo)系中的具體坐標(biāo)。點(diǎn)類(lèi)定義如圖2所示。
圖1 系統(tǒng)模型圖
圖2 點(diǎn)類(lèi)
點(diǎn)作為空間幾何中最基本的單位,對(duì)整個(gè)幾何庫(kù)具有十分重要的意義:幾何庫(kù)中的大部分構(gòu)件計(jì)算與求解,最終要?dú)w結(jié)到點(diǎn)類(lèi)實(shí)現(xiàn)。即當(dāng)確定了點(diǎn)在空間坐標(biāo)系中的位置之后,便可以實(shí)現(xiàn)一些基本構(gòu)件(如線(xiàn)、面等)的計(jì)算與求解[4?5]。OpenGL渲染點(diǎn)的效果圖見(jiàn)圖3。
圖3 渲染點(diǎn)
1.2 線(xiàn)的實(shí)現(xiàn)
直線(xiàn)的實(shí)現(xiàn)是以點(diǎn)為基礎(chǔ)的。在空間直角坐標(biāo)系中,一個(gè)坐標(biāo)有多種含義:它既可以表示空間中的一個(gè)點(diǎn);也可以表示一個(gè)有長(zhǎng)度有方向的向量。因此在直線(xiàn)的定義中,運(yùn)用了坐標(biāo)的這兩種含義。線(xiàn)類(lèi)定義如圖4所示。
圖4 線(xiàn)類(lèi)
直線(xiàn)由2個(gè)點(diǎn)類(lèi)對(duì)象組成:bas表示一個(gè)點(diǎn),為該直線(xiàn)上的一個(gè)點(diǎn),vec表示一個(gè)向量,為該直線(xiàn)的方向。
在幾何庫(kù)中,默認(rèn)直線(xiàn)的長(zhǎng)度是無(wú)限的。這種表示方法的優(yōu)勢(shì)在于,根據(jù)具體應(yīng)用場(chǎng)景的不同,可以理解成直線(xiàn)、射線(xiàn)和線(xiàn)段來(lái)使用。例如:當(dāng)作為射線(xiàn)時(shí),bas便代表它的起點(diǎn),而vec就是它射向的方向;當(dāng)作為線(xiàn)段時(shí),bas便作為線(xiàn)段的一個(gè)點(diǎn),vec的方向是它延伸的方向,vec的長(zhǎng)度則是線(xiàn)段在該方向上的長(zhǎng)度。OpenGL渲染直線(xiàn)的效果圖如圖5所示。
圖5 渲染線(xiàn)
1.3 面的實(shí)現(xiàn)
面的實(shí)現(xiàn)也是以點(diǎn)為基礎(chǔ)。在本系統(tǒng)中的幾何庫(kù),對(duì)于面的表示和直線(xiàn)相同。只是對(duì)平面類(lèi)中,相關(guān)的成員變量的理解和直線(xiàn)略有不同,面類(lèi)定義如圖6所示。
圖6 面的類(lèi)圖
平面也是由2個(gè)點(diǎn)類(lèi)對(duì)象組成。首先需要明確一點(diǎn),就是一個(gè)面類(lèi)的對(duì)象所表示的面是無(wú)限大的。其中bas指所表示的平面上的一個(gè)點(diǎn),而vec則指所表示平面,以bas為起點(diǎn),vec為方向的一條射線(xiàn),這條射線(xiàn)為該平面的法向量。
2 數(shù)學(xué)建模
2.1 空間坐標(biāo)系的構(gòu)建
在建立空間直角坐標(biāo)系時(shí),假設(shè)觀(guān)察者正面對(duì)著圖書(shū)館大門(mén),設(shè)此方向?yàn)閦軸的正方向,其上方為x軸的正方向,而右側(cè)為y軸的正方向。
確立各個(gè)坐標(biāo)軸的方向之后,給坐標(biāo)軸設(shè)置一個(gè)原點(diǎn)。因?yàn)槟M的圖書(shū)館總體上為對(duì)稱(chēng)的結(jié)構(gòu)。所以將圖書(shū)館兩側(cè)的中點(diǎn)設(shè)為y軸的原點(diǎn),圖書(shū)館一樓的地面位置設(shè)為x軸的原點(diǎn),面對(duì)觀(guān)察者最近的臺(tái)階位置為z軸的原點(diǎn)[6],如圖7所示。
2.2 比例尺的構(gòu)建
本系統(tǒng)需要用計(jì)算機(jī)編程渲染模擬圖書(shū)館;虛擬場(chǎng)景中構(gòu)成圖書(shū)館的每一個(gè)柱子每一根梁都必須滿(mǎn)足一定的比例從而讓渲染出的圖書(shū)館顯得更加真實(shí)。因此,就必須用一定的比例對(duì)圖書(shū)館進(jìn)行縮放。
圖7 空間直角坐標(biāo)系圖
參考圖書(shū)館的設(shè)計(jì)圖紙,將其按一定比例縮放到系統(tǒng)中。圖書(shū)館的外墻實(shí)現(xiàn)時(shí),解決思路是全部貼上了規(guī)格一致的磚塊,便可以將一個(gè)磚塊的長(zhǎng)寬設(shè)為一個(gè)基礎(chǔ)單位,而在圖書(shū)館的整體渲染時(shí),也會(huì)對(duì)每一個(gè)磚塊進(jìn)行單獨(dú)的渲染,從而解決比例尺的問(wèn)題[7]。
2.3 構(gòu)件的表示
在完成坐標(biāo)系和比例尺的構(gòu)建之后,便可以表示構(gòu)成圖書(shū)館的各個(gè)構(gòu)件,這里的構(gòu)件則是由虛擬建筑的幾何實(shí)體或幾何實(shí)體經(jīng)過(guò)一系列運(yùn)算所構(gòu)成。
每一個(gè)構(gòu)件都具有兩個(gè)最基本的屬性,即位置和參數(shù)。構(gòu)件數(shù)學(xué)建模如式(1)所示:
[constructionpos,args] (1)
式(1)中construction表示構(gòu)件;pos表示構(gòu)件的位置;args表示構(gòu)件的參數(shù)。
構(gòu)件的位置是一個(gè)坐標(biāo),這個(gè)坐標(biāo)為該構(gòu)件在空間直角坐標(biāo)系,按照z軸、x軸和y軸的優(yōu)先級(jí),選擇值最小的坐標(biāo)點(diǎn)。即所有構(gòu)件上的點(diǎn)中,選出z軸上值最小的點(diǎn),如果不止一個(gè),在當(dāng)中選出x軸上值最小的點(diǎn),若還有重復(fù),再比較y軸,選出y軸上值最小的點(diǎn)。該點(diǎn)即為該構(gòu)件的位置。構(gòu)件的參數(shù)是一系列的值,表示該構(gòu)件的形狀信息,如果一個(gè)構(gòu)件為一個(gè)長(zhǎng)方體,則構(gòu)件的參數(shù)便為構(gòu)件的長(zhǎng)、寬和高。
有了構(gòu)建之后,可以把整個(gè)圖書(shū)館作為對(duì)一系列構(gòu)件進(jìn)行求和操作的結(jié)果。
圖書(shū)館數(shù)學(xué)建模如式(2)所示:
[library=constructionpos,args] (2)
2.4 構(gòu)件建模流程
本文所渲染模擬的建筑場(chǎng)景為南航金城學(xué)院的圖書(shū)館。圖書(shū)館的建筑風(fēng)格方方正正,有棱有角,因此其構(gòu)件基本上都為長(zhǎng)方體的各種組合,這里以圖書(shū)館門(mén)前臺(tái)階為例,介紹對(duì)構(gòu)件建模的大致流程。
臺(tái)階數(shù)學(xué)建模如式(3)所示:
[stairs(pos,len,wid,hei,num)] (3)
其中,pos表示臺(tái)階構(gòu)件的位置坐標(biāo);len表示1節(jié)臺(tái)階的長(zhǎng)度;wid表示1節(jié)臺(tái)階的寬度;hei表示1節(jié)臺(tái)階的高度;num表示臺(tái)階的總級(jí)數(shù)。
這里把臺(tái)階的每一級(jí)都看成為一個(gè)單獨(dú)的長(zhǎng)方體,而整個(gè)臺(tái)階,便是由一個(gè)個(gè)高度不斷增加的長(zhǎng)方體堆積而來(lái)。 根據(jù)上述表達(dá)式不難理解,pos為最初起始矩形的坐標(biāo),該矩形的長(zhǎng)寬高也為輸入的長(zhǎng)寬高的值。而第二個(gè)矩形一直到第num個(gè)矩形,其起始坐標(biāo)的z值加上寬度便為其位置坐標(biāo)。對(duì)于其參數(shù)信息,長(zhǎng)方體的長(zhǎng)和寬不變,高度累加。也可以理解成,臺(tái)階中每一個(gè)長(zhǎng)方體構(gòu)件的坐標(biāo)的z值和參數(shù)的高度值為一個(gè)等差數(shù)列,不斷變化。公式表示如下:
[stairs=inumCubei(posi,len,wid,heii)](4) [posi?z=pos1?z+(i-1)?wid] (5)
[heii=hei+(i-1)?hei] (6)
3 渲 染
對(duì)場(chǎng)景的渲染可以分為四部分,選擇視角、渲染點(diǎn)、光照與材質(zhì)和紋理的設(shè)定[8?9]。
渲染具體算法描述如下:
算法輸入:圖書(shū)館的數(shù)學(xué)模型
算法輸出:渲染成果
算法步驟:
(1) sysinit() //系統(tǒng)初始化
(2) light_on() //光照初始化
(3) texture_on() //紋理初始化
(4) texture_bind() //綁定紋理
(5) while !mod.empty() //當(dāng)渲染模型棧非空
(6) rend = mod.pop() //模型棧彈棧
(7) render(rend) //渲染模型
(8) end
4 實(shí)驗(yàn)結(jié)果與分析
4.1 點(diǎn)線(xiàn)渲染
首先,需要渲染出構(gòu)件的點(diǎn)線(xiàn)模型如圖8所示。
圖8 渲染示例圖1
這樣做既可以檢測(cè)構(gòu)件的幾何空間正確性,同時(shí),這也是選擇視角的基礎(chǔ),只有在有渲染圖形的基礎(chǔ)上,才可以根據(jù)已渲染的圖形對(duì)視角進(jìn)行調(diào)整。但如圖8的渲染結(jié)果明顯偏大,因此需要選擇一個(gè)合適的視角,對(duì)渲染的圖形進(jìn)行觀(guān)察,如圖9所示。
圖9 渲染示例圖2
通過(guò)反復(fù)修改視角,得到一個(gè)較為貼近真實(shí)場(chǎng)景的圖形,之后便可對(duì)圖形進(jìn)行光照和材質(zhì)的加工[10],如圖10所示。
圖10 渲染示例圖3
4.2 圖書(shū)館整體渲染
圖書(shū)館實(shí)物圖如圖11所示。
圖11 圖書(shū)館實(shí)物圖
加入大理石紋理的圖書(shū)館如圖12所示。
圖12 大理石紋理
加入木質(zhì)紋理的圖書(shū)館如圖13所示。
圖13 木質(zhì)紋理
5 結(jié) 語(yǔ)
本文以虛擬圖書(shū)館建模為例,介紹了虛擬建筑建立幾何庫(kù)、數(shù)學(xué)建模過(guò)程以及可視化仿真的過(guò)程和方法。今后希望能從幾何庫(kù)、數(shù)學(xué)建模和渲染這3個(gè)方面入手,提高系統(tǒng)的效率和穩(wěn)定性,同時(shí),通過(guò)完善改進(jìn)對(duì)光線(xiàn)的模擬,以及圖書(shū)館材質(zhì)的反復(fù)試驗(yàn)測(cè)試,使得渲染出的圖書(shū)館更加貼近真實(shí)的觀(guān)測(cè)效果。
參考文獻(xiàn)
[1] 徐旭東,王菁.基于OpenGL的虛擬吊蘭建模與可視化研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,34(12):4304?4309.
[2] 周靜海,宋曉宇,王永會(huì).基于OpenGL的三維建筑設(shè)計(jì)組件的設(shè)計(jì)與實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2002,23(6):766?768.
[3] 牛鳳枝.基于OpenGL的三維場(chǎng)景再現(xiàn)研究[D].天津:河北工業(yè)大學(xué),2006.
[4] 潘忠英.基于OpenGL的三維可視化方法研究[J].計(jì)算機(jī)與數(shù)學(xué)工程,2014,42(3):512?516.
[5] 羅笑南,王若梅.計(jì)算機(jī)圖形學(xué)[M].3版.廣州:中山大學(xué)出版社,2008:110?123.
[6] 楊柏林,陳根浪,徐靜.OpenGL編程精粹[M].北京:機(jī)械工業(yè)出版社,2010:278?300.
[7] 朱煒.在Windows環(huán)境下設(shè)置基于VC++的OpenGL圖形接口[J].計(jì)算機(jī)與網(wǎng)絡(luò),2007(8):173?174.
[8] 周揚(yáng),劉永濤.基于OpenGL的事故三維綜合演示平臺(tái)[J].重慶理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2015(4):77?80.
[9] 鄧軍勇,李濤,蔣林,等.面向OpenGL的圖形加速器設(shè)計(jì)與實(shí)現(xiàn)[J].西安電子科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2015(3):143?149.
[10] 鄭佳榮,王強(qiáng),占文鋒.三維建模方法研究現(xiàn)狀綜述[J].北京工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào),2013,12(4):5?7.
[11] 史俊,富剛.基于OpenGL的語(yǔ)音控制數(shù)控加工仿真的研究[J].現(xiàn)代電子技術(shù),2010,33(11):121?124.
[12] 王承祥,鞠建波,陶晨辰.基于VC++和OpenGL聲納浮標(biāo)系統(tǒng)模擬器操作界面設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2012,35(14):137?139.