摘 要:探討在當前網絡環境下可滿足網絡可視化要求的虛擬漫游技術,剖析虛擬漫游控制技術即視點變換情況,給出一種科學有效的視點變換關系,保存當前的視點坐標和方位,利用鍵盤來控制漫游方向和行進。結合Java 3D的代碼可傳輸特性,基于Java 3D構建了可滿足網絡可視化要求的虛擬建筑物漫游,效果較好。
關鍵詞: Java 3D; 虛擬漫游; 視點坐標; 網絡環境
中圖分類號:TN911; TP391 文獻標識碼:A
文章編號:1004-373X(2010)14-0084-02
Investigation of Virtual Ramble Technology Based on Java 3D
LIN Lü-ping, WANG Ru
(Xi’an University of Architecture Technology, Xi’an 710055, China)
Abstract: The virtual ramble technology which can meet the request of the network visualiztion under the current network environment is discussed. The virtual ramble control technology (variation of view point) is analyzed. A variation relation of view point which is scientific and effective is given. The virtual ramble which can meet the request of network visualization based on Java 3D is built by preserving the current eye coordinate and azimuth, utilizing the keyset to control the ramble direction and movement, and combining the code transmission charicteristic of Java 3D.
Keywords: Java 3D; virtual ramble; eye coordinate; network visalization
虛擬漫游技術是虛擬現實(virtual reality)技術的重要組成部分,在各個領域,尤其是旅游、航天航空、醫學、建筑等行業有著巨大的發展空間[1]。傳統的編程工具如OpenGL和DirectX,能夠有效的進行三維開發,從而實現虛擬漫游,但是,隨著Internet的快速發展,B/S(Browse/Server)系統擁有傳統的C/S(Client/Server)系統所沒有的巨大優勢,在B/S系統中,如果采用OpenGL等傳統的編程工具,只能在Web服務器端生成圖像,然后再一幅幅地傳給客戶端顯示,在當前的Internet傳輸能力下,是不可能滿足網絡可視化要求的。而Java 3D卻可以很好地解決Internet傳輸能力所帶來的問題,因為它具有代碼可傳輸性,這使得用來生成復雜三維圖像的程序可以方便地從服務器端傳送到客戶端,然后在客戶端本地運行,進而生成三維圖像。因為傳輸的不是圖像本身,而是控制圖像生成的程序和數據,所以大大縮減了網絡傳輸的數據量[2]。
1 Java 3D
Java 3D是SUN公司繼Java的火爆成功后,于1997年推出的面向網絡的交互式三維圖形應用程序接口(API)[3]。Java 3D有純粹的面向對象結構,其基本數據結構(場景圖)是一些具有方向性的不對稱圖形組成的樹狀結構[4],涵蓋了整個視景和立體空間的完整描述[5];Java 3D封裝了流行的3D開發工具OpenGL和DirectX,提高了編寫三維圖形程序的層次——編程時不需要考慮光照、著色、碰撞檢查等復雜的圖形學問題;Java 3D來自于Java,所以它擁有了一切Java所擁有的優點,比如一次編寫,就可以跨平臺運行,而且還可以充分借用Java的各種功能,如交互式用戶接口、圖像處理、字體、繪制二維圖形等;并且,Java 3D能并行著色,能自動利用硬件的加速功能來快速生成圖像,還能對場景進行預編譯以提高效率[6]。
2 視點變化
虛擬漫游的實質與現實中的漫游一樣,物體在三維世界中是不變的,通過改變觀察者的視點,以及視角,來獲得不同的感官效果,從而實現漫游[7]。
Java 3D虛擬空間的坐標系統是右手坐標系的。x軸的正方向是水平向右,y軸的正方向是垂直向上,z軸正方向指向觀察者[8]。在實現虛擬漫游的時候,物體與所處虛擬空間坐標系的相對位置關系是不變的,改變的是觀察者的位置[9]。
在現實世界中,人觀察事物有前進、后退、左走、右走等行為,相應的,觀察者在世界坐標系中的坐標也發生改變,當觀察者改變視線的方向和角度時,所看到的景物也不一樣,虛擬世界中的漫游也采用同樣的道理[10]。這里可以模擬向前走和向左走的行為。構造一個這樣的坐標系,如圖1所示,正南方向為z軸正方向,正東方向為x軸正方向,O為原點,再標志2個點A和D,其中,OA垂直于OD;設定OA為視線的方向,則OD即為向左走時的方向。由點A做一條直線垂直于x軸并交于點B,另做一條直線垂直于z軸并交于點C;同理過D做x軸、z軸的垂線,垂足分別為E,F。可以發現,|OB|即為向前走時在x軸移動的距離,|OC|即為向前走時在z軸移動的距離;|OE|即為向左走時在x軸移動的距離,|OF|即為向左走時在z軸移動的距離。
圖1 視點的坐標位置
如圖1所示,視線與z軸負方向的角度θ在[0,90°]中,當觀察者從點O向前移動到點A,即觀察者的坐標從點O移動到點A時,相當于觀察者先從點O沿x軸負方向移動到點B,再由點B沿z軸負方向移動到點A。其中|OB|=|OA|sin θ,|OC|=|OA|cos θ。假定觀察者的原始坐標為(x1,z1),向前移動s,到達新的坐標點(x2,z2);則可以得到如下公式:
x2=x1-ssin θ,z2=z1-scos θ
當觀察者從點O向左移動到點D,由于OD垂直于OA,所以∠DOE=θ。由此可知|OE|=|OD|cos θ,|OF|=|OD|sin θ。假定觀察者的原始坐標為(x1,z1),向左移動s,到達新的坐標點(x2,z2);則可以得到如下公式:
x2=x1-scos θ,z2=z1+ssin θ
同樣的,θ在其他3個象限中時,當觀察者從坐標(x1,z1)向前移動s到坐標(x2,z2),均可以得出以下公式:
x2=x1-ssin θ (1)
z2=z1-scos θ (2)
當觀察者從坐標(x1,z1)向左移動s到坐標(x2,z2),均可以得出以下公式:
x2=x1-scos θ (3)
z2=z1+ssin θ (4)
同理可推出,當觀察者由坐標(x1,z1)向后移動s到坐標點(x2,z2)時,兩個坐標點之間的關系如下:
x2=x1+ssin θ (5)
z2=z1+scos θ (6)
當觀察者由坐標(x1,z1)向右移動s到坐標點(x2,z2)時,兩個坐標點之間的關系如下:
x2=x1+scos θ (7)
z2=z1-ssin θ (8)
當觀察者的坐標發生改變時,相應的,視點的坐標也在改變,而且變化的方向與距離跟觀察者移動的方向與距離一致。
3 建筑物漫游
利用上述的視點變換公式并結合Java 3D的知識,可以得出以下算法:
private TransformGroup targetTG; /*聲明一個TransformGroup對象*/
private double angle = 0.0; /*水平方向的角度*/
private double[]people={0.0,0.0,0.0}; /*觀察者的坐標位置*/
private double[]point={0.0,0.0,0.0}; /*觀察目標的坐標位置*/
Transform3D t=new Transform3D(); /*新建一個Transform3D對象*/
If(press up key){
/*根據式(1)和式(2)重新設定觀察者的坐標以及觀察目標的坐標*/
people[0] -= getCos(angle);
people[2] -= getSin(angle);
point[0] -= getCos(angle);
point[2] -= getSin(angle);
t.lookAt(new Point3d(people),new Point3d(point),
new Vector3d({0,1,0}));
this.targetTG.setTransform(t);
}
If(press left key){
/*根據式(3)和式(4)重新設定觀察者的坐標以及觀察目標的坐標*/
}
If(press down key){
/*根據式(5)和式(6)重新設定觀察者的坐標以及觀察目標的坐標*/
}
If(press right key){
/*根據公式(7)和公式(8)重新設定觀察者的坐標以及觀察目標的坐標;*/
}
將wrl格式的建筑物三維圖形文件導入到Java 3D中,并直接在瀏覽器中對它進行虛擬漫游,運行效果如圖2和圖3所示。
圖2 建筑物虛擬漫游(一)
圖3 建筑物虛擬漫游(二)
其中,圖2為觀察者在(0.2,0.0,10.2)位置對(0.2,0.0,0.6)位置進行觀察的畫面,圖3是觀察者在(0.1,0.0,10.7)位置對(0.1,0.0,0.7)位置進行觀察的畫面。
利用Java 3D的代碼可傳輸特性,可直接在瀏覽器中對建筑物進行虛擬漫游,很好地解決了網絡可視化的要求。
4 結 語
本文主要研究了在虛擬漫游中視點的變換關系,并基于Java 3D構建了可滿足網絡可視化要求的建筑物虛擬漫游;但對于碰撞檢測方面并沒有進行深入的研究,最后的效果不是非常理想,有待進一步的改進。
參考文獻
[1]周演,陳天滋.三維虛擬漫游技術的研究[J].計算機工程與設計,2009,30(5):1207-1211.
[2]都志輝.Java 3D編程實踐——網絡上的三維動畫[M].北京:清華大學出版社,2002.
[3]鮑彥如.Java 3D 創建虛擬現實世界探析[J].微計算機應用,2003,24(6):378-381.
[4]侯哲威,王青山,程輝.基于Java 3D的網絡地理信息可視化[J].測繪學院學報,2004,21(4):302-304.
[5]張緒冰,關澤群,張鐵良.基于Java 3D虛擬場景的關鍵技術[J].安徽農業科學,2007(34):11328-11330.
[6]丁國棟,楊雪.用Java 3D實現Web虛擬現實的研究與實踐[J].中國教育技術裝備,2006(2):29-31.
[7]何同林,張緒冰.基于Java 3D三維虛擬場景的研究[J].計算機應用,2007,28(6):291-292.
[8]僧德文,李仲學,王紅霞.基于OpenGL的虛擬漫游技術研究及應用[J].金屬礦山,2007(9):84-86.
[9]陳光華,鄧奕,王京文,等.基于OpenGL可漫游虛擬場景的設計[J].微計算機信息,2008,24(24):310-311.
[10]劉海霞,李仁旺,楊貴,等.基于VRML與Java 3D的交互式虛擬物流系統[J].計算機工程,2008,34(21):259-261.