摘要 VRML是開發虛擬實驗的主流語言。介紹如何利用Java與VRML的結合,實現數據通信功能,實現黑板板書的虛擬實驗。
關鍵詞 VRML;Java;板書;虛擬實驗
中圖分類號 G434 文獻標識碼 B 文章編號 1671-489X(2008)12-0077-02
1 前言
隨著計算機技術的迅速發展,虛擬現實技術已很成熟,廣泛應用于各行各業。虛擬現實技術憑借其強大的交互功能,在教育領域中應用也很廣泛。虛擬現實技術在教育中的應用之一就是開發虛擬實驗。VRML是開發虛擬實驗的主流語言,能夠構建逼真的實驗環境。將VRML與Java相結合,通過EAI接口實現VRML場景與網頁中各個嵌入式對象之間互相方便地通信,使VRML場景成為網絡表現的一部分[1]。同時,也使用戶能夠動態地改變VRML場景。
黑板是教學中最常用的教具之一,也是在虛擬實驗中虛擬教室的一個重要組成部分。筆者主要探討黑板板書功能的設計以及實現方法。
2 黑板板書實驗的設計
2.1 實驗環境的設計實驗的環境比較簡單,就是一間教室,里面包括黑板、桌椅、燈、多媒體柜等。為了實現黑板的板書功能,這里只需做一個黑板就可以。制作的方法主要有2種:一是用3DMAX制作完后,再轉化成VRML格式的文件,以便在VRML環境中對各種交互進行編程;二是直接用VRML語言來編寫。2種方法各有長處。用3DMAX制作的實驗器材比較精細、逼真,但在轉換成VRML格式的時候會有一些小錯誤,需要人工修改;直接用VRML編寫,做出來的器材的逼真度不如3DMAX,但編寫起來方便。這里采用第2種方法。
2.2 交互功能的設計一般的交互功能都能通過JavaScript腳本來實現,但是如果VRML程序較大,運行起來就會影響速度。為了實現較好的交互功能,最好將VRML虛擬場景和交互的控制區分開,這就需要用到Java小程序Applet。
教學中一般的黑板板書功能就是能夠在上面書寫,能用各種顏色的粉筆,能寫大小不等的字,還能用黑板擦擦掉。在這個虛擬實驗中,這些功能都能實現。這就用到了EAI接口。在Applet小程序中設置字體的顏色、大小,將數據傳遞到VRML場景中,改變虛擬場景,就可以用設置好的顏色和大小來板書了。
2.3 網頁布局的設計本實驗的組成主要是虛擬場景和控制字體顏色大小的Applet小程序區。它們在屏幕上的分布設計如圖1所示。

3 黑板板書實驗的實現
3.1 字體顏色、大小的控制
1)方法介紹。板書功能的實現主要用JavaScript腳本來實現。由于EAI接口傳遞的數據不能直接傳到JavaScript腳本中,需要一個中間變量,這個中間變量其實就是一個節點。由這個中間變量接收EAI傳遞的數據,那么這個節點的域就會發生變化。再通過一個路由將中間節點的域變化傳到JavaScript腳本的相應事件中,進而間接地實現參數的傳遞。方法如圖2所示。

板書功能的實現關鍵是用createVRMLFromString()動態控制函數。由于板書是非常靈活的,所以寫出來的字應該是圓滑的。擠壓造型Extrusion節點可以來創建彎曲的管道,板書寫的字和管道有相似之處。因此,可以用這個節點來實現具體的板書功能。
2)關鍵代碼。
①VRML程序。JavaScript腳本部分代碼:
function yanse(){ziyanse=mmm.diffuseColor ; } //獲取字體顏色值
function zitidaxiao(){zidaxiao=daxiaobianhua.translation; } //獲取字體大小值
function isActive (val) {
……
zideyanse=new SFColor(ziyanse.r,ziyanse.g,ziyanse.b); //給字體賦顏色值
scale=new SFVec2f(zidaxiao.x,zidaxiao.x); //給字體賦大小值
string=xian1+'diffuseColor '+zideyanse+xian2+'spine '+spine+' scale '+scale+xian3;
node=Browser.createVRMLFromString(string);//生成節點
……
}
function hitpoint(val){
weix=val[0]; weiy=val[1];weiz=val[2];……
spine[q]=new SFVec3f(weix,weiy,weiz);
}
②Java程序。Java程序主要實現程序的界面布局以及獲取滾動條當前值。控制字體顏色、大小的滾動條的處理程序如下:
public boolean handleEvent(Event event){//控制字體大小的滾動條
if (event.id == Event. SCROLL_LINE_UP event.target ==scale){
setScale(event);……}//控制字體顏色的滾動條
for(int i=0;i<3;i++){
if (event.id == Event. SCROLL_LINE_UP event.target ==scrBar[i]){
setColorLabel(event,i);……
}……}
除了以上工作,還需要獲得滾動條實時變化的值,以進一步對場景中相應的VRML節點的域進行賦值,進而觸發腳本事件,實現板書功能。主要代碼如下:
public void setColorLabel(Event ev,int i){……
EventInSFColor newColor=(EventInSFColor)myMaterial.getEventIn(\"set_diffuseColor\");
for(i=0;i<3;i++)
value[i]=(float) (scrBar[i].getValue()/255f); //獲取顏色值
newColor.setValue(value);
}//控制文字大小
public void setScale(Event e){
EventInSFVec3f newtr=(EventInSFVec3f)ztdx.getEventIn(\"set_translation\");
va[0]=(float)(scale.getValue()/10f);
va[1]=(float)(scale.getValue()/10f);
va[2]=(float)(scale.getValue()/10f);
newtr.setValue(va);
}
3.2 擦除功能的實現這里所說的擦除并不是用鼠標一點一點地抹掉,不是真正意義上的擦除;而是在Applet中引入一個按鈕,做一個超鏈接,重新打開這個網頁,看上去好像剛才寫的字不存在了,從而實現“擦除”效果。
所用到的函數是showDocument()[2],使用它來實現超鏈接。
Public void actionPerformed ( ActionEvent ae) {
if (ae.getSource()==b) {
try{
getAppletContext().showDocument(new URL(getDocumentBase()+\"changecolor.htm\"),\"_self\");
}
catch (Exception e) { } } }
至此,黑板板書功能設計完成,程序運行結果如圖3所示。

參考文獻
[1]陸昌輝.使用VRML與JAVA創建網絡虛擬環境[M].北京:北京大學出版社,2003
[2]如何在Java applet.class中實現超鏈接[EB/OL].[2008-3-20].http://www.readygo.com.cn/it-845520.html