黎國進(jìn),陳 杰,李 佳,陳定方
(武漢理工大學(xué)智能制造與控制研究所,湖北 武漢 430063)
虛擬漫游技術(shù)作為虛擬現(xiàn)實(shí)(VR)技術(shù)的重要分支,在建筑、觀光旅游、游戲、航空航天、醫(yī)學(xué),軍事演練等多種行業(yè)中得到廣泛應(yīng)用.在漫游場景中加入圖像、聲音、視頻等多媒體,其強(qiáng)烈的沉浸感、交互性和構(gòu)想性給用戶一種身臨其境的感覺.JOGL對(duì)OpenGL 2.0規(guī)范中的API提供全面的支持,而且還集成了Java AWT和Java Swing界面組件[1].由于得到Sun公司和SGI的大力支持,以及Java平臺(tái)自身的優(yōu)勢(shì),JOGL作為3D圖形開發(fā)庫得到了廣泛的運(yùn)用.
根據(jù)所用的操作系統(tǒng)平臺(tái),下載與之匹配的最新JDK.
對(duì)于Windows用戶,下載 JOGLl-1.1.1-windows-i586.zip;環(huán)境配置(以 Windows用戶為例)過程如下:首先解壓JOGLl-1.1.1-windows-i586.zip,得到ext和lib.然后將lib文件夾中的DLL文件復(fù)制并存放于C: JAVA WORKSPACE JOGL1DLL中.將lib文件夾添加到系統(tǒng)PATH環(huán)境變量中,例如:C: JAVA WORKSPACE lib;將 lib文件夾中的jogl.jar,gluegen-rt.jar這兩個(gè)Jar包的絕對(duì)路徑添加到系統(tǒng)CLASSPATH環(huán)境變量中.
本文采用MyEclipse8.6版本作為軟件開發(fā)環(huán)境.項(xiàng)目環(huán)境配置(以Windows用戶為例)如下.
1)新建一個(gè)工程:File※new※Java Project※在Project Name文本框中輸入工程名.
2)點(diǎn)擊Next,對(duì)Java編譯環(huán)境進(jìn)行設(shè)置.Libraries※Add External JARS※打開C: JAVA WORKSPACE jar1文件夾中的二個(gè)Jar包※Order and Export※點(diǎn)擊Select All※點(diǎn)擊Finished.
3)點(diǎn)擊工程名,右鍵※Properties※Java Build Path※Source※點(diǎn)擊工程名/src※選中Native library location※Link Source※Browse※選中 C:JAVA WORKSPACE JOGL1DLL文件夾※OK.
Opengl由兩個(gè)庫組成——GL和GLU(Opengl Utility Library).GL庫包含了提供基本圖形特征的核心函數(shù);GLU庫包含了高級(jí)別的基于GL函數(shù)的應(yīng)用函數(shù)[2].
JOGL提供GL和GLU兩個(gè)類來封裝Opengl的GL和GLU函數(shù).組件GLCanvas和GLJPanel為Opengl函數(shù)調(diào)用提供繪制表面.GLCanvas是重量級(jí)組件,能夠啟動(dòng)使用硬件加速功能.GLJPanel是在系統(tǒng)內(nèi)存中實(shí)現(xiàn)的輕量級(jí)組件,不能使用硬件加速功能[2].在此采用GLCanvas畫布組件.實(shí)現(xiàn)過程如下:1)在Applet的init方法中聲明一個(gè)GLCanvas畫布實(shí)例對(duì)象并設(shè)置其相關(guān)屬性;2)為畫布對(duì)象添加GLEventListener監(jiān)聽器;3)新建一個(gè)類,實(shí)現(xiàn)GLEventListener接口中的init,display,reshape,displayChange等4個(gè)方法,在init方法中獲取gl,glu等實(shí)例對(duì)象并設(shè)置場景渲染的相關(guān)屬性,在display方法中繪制場景和顯示模型.
采用類似于OSG中的包圍體來實(shí)現(xiàn)漫游的范圍.包圍體的6個(gè)面分別為6張紋理圖片.裝載紋理圖片的核心代碼如下:
人機(jī)交互技術(shù)是虛擬現(xiàn)實(shí)技術(shù)的一個(gè)重要分支,在漫游場景中,可以實(shí)現(xiàn)虛攝像機(jī)的前進(jìn)、后退、旋轉(zhuǎn)、仰視、俯視等操作.
通過調(diào)用GLU類的gluLookAt(
double eyeX,double eyeY,double eyeZ,
double atX,double atY,double atZ,
double upX,double upY,double upZ)方法設(shè)置虛擬攝像機(jī)的屬性.
其中:eyeX,eyeY,eyeZ表示虛擬攝像機(jī)的位置;atX,atY,atZ表示虛擬像機(jī)所“看”的點(diǎn)的坐標(biāo);upX,upY,upZ表示虛擬攝像機(jī)的觀察方向——倒立,正立或者從某一個(gè)角度進(jìn)行觀察.其示意圖如圖
圖1 gluLookAt函數(shù)示意圖
與gluLookAt函數(shù)共同作用于虛擬像機(jī)的還有g(shù)luPerspective(
GLdouble fovy,//設(shè)置虛擬像機(jī)的視界范圍
GLdouble aspect,//窗體的縱橫比
GLdouble zNear,//視野近點(diǎn)透視深度
GLdouble zFar//視野遠(yuǎn)點(diǎn)透視深度
)方法.
通過實(shí)現(xiàn)KeyListener接口,對(duì)窗體添加鍵盤監(jiān)聽事件,即可通過鍵盤對(duì)虛擬攝像機(jī)的位置、視點(diǎn)、觀察角度予以變換,實(shí)現(xiàn)交互式虛擬漫游.
圖2 gluPerspective函數(shù)示意圖
Java Applet即Java小應(yīng)用程序,在瀏覽器中運(yùn)行,能處理圖像、聲音、動(dòng)畫等多媒體數(shù)據(jù).當(dāng)用戶訪問這樣的網(wǎng)頁時(shí),Applet被自動(dòng)下載到本機(jī).采用Java Applet技術(shù),將Opengl所渲染的場景在瀏覽器中顯示(圖3).其設(shè)置如下:1)編譯源程序;2)將所有的字節(jié)碼文件生成一個(gè)Jar包;3)對(duì)程序中用到的兩個(gè)Jar包以及生成的joglApplet.jar包進(jìn)行數(shù)字簽名;4)在字節(jié)碼文件中新建一個(gè)Html文件,將applet標(biāo)簽加入到文件中,代碼如下
.
圖3 程序在瀏覽器中運(yùn)行示意圖
[1]李貽斌,牟龍芳.基于JOGL的關(guān)節(jié)機(jī)器人仿真[J].蘇州市職業(yè)大學(xué)學(xué)報(bào),2008,19(1):53-56.
[2]Liang Y D,Zhang H.計(jì)算機(jī)圖形學(xué)應(yīng)用Java 2D和3D[M].孫正興,張 巖,蔣 維,等譯.北京:機(jī)械工業(yè)出版社,2008.
[3]Davis G.Learning Java Binding for Opengl[EB/OL][2011-03-03].http://alvarestech.com/temp/capp/0steptools/0booksmaio-20-2011/Learning% 20Java%20Bindings%20for%20OpenGL%20-%20Gene%20Davis.pdf.