摘要 VRML是開發(fā)虛擬實(shí)驗(yàn)的主流語言。介紹如何利用Java與VRML的結(jié)合,實(shí)現(xiàn)數(shù)據(jù)通信功能,實(shí)現(xiàn)黑板板書的虛擬實(shí)驗(yàn)。
關(guān)鍵詞 VRML;Java;板書;虛擬實(shí)驗(yàn)
中圖分類號 G434 文獻(xiàn)標(biāo)識(shí)碼 B 文章編號 1671-489X(2008)12-0077-02
1 前言
隨著計(jì)算機(jī)技術(shù)的迅速發(fā)展,虛擬現(xiàn)實(shí)技術(shù)已很成熟,廣泛應(yīng)用于各行各業(yè)。虛擬現(xiàn)實(shí)技術(shù)憑借其強(qiáng)大的交互功能,在教育領(lǐng)域中應(yīng)用也很廣泛。虛擬現(xiàn)實(shí)技術(shù)在教育中的應(yīng)用之一就是開發(fā)虛擬實(shí)驗(yàn)。VRML是開發(fā)虛擬實(shí)驗(yàn)的主流語言,能夠構(gòu)建逼真的實(shí)驗(yàn)環(huán)境。將VRML與Java相結(jié)合,通過EAI接口實(shí)現(xiàn)VRML場景與網(wǎng)頁中各個(gè)嵌入式對象之間互相方便地通信,使VRML場景成為網(wǎng)絡(luò)表現(xiàn)的一部分[1]。同時(shí),也使用戶能夠動(dòng)態(tài)地改變VRML場景。
黑板是教學(xué)中最常用的教具之一,也是在虛擬實(shí)驗(yàn)中虛擬教室的一個(gè)重要組成部分。筆者主要探討黑板板書功能的設(shè)計(jì)以及實(shí)現(xiàn)方法。
2 黑板板書實(shí)驗(yàn)的設(shè)計(jì)
2.1 實(shí)驗(yàn)環(huán)境的設(shè)計(jì)實(shí)驗(yàn)的環(huán)境比較簡單,就是一間教室,里面包括黑板、桌椅、燈、多媒體柜等。為了實(shí)現(xiàn)黑板的板書功能,這里只需做一個(gè)黑板就可以。制作的方法主要有2種:一是用3DMAX制作完后,再轉(zhuǎn)化成VRML格式的文件,以便在VRML環(huán)境中對各種交互進(jìn)行編程;二是直接用VRML語言來編寫。2種方法各有長處。用3DMAX制作的實(shí)驗(yàn)器材比較精細(xì)、逼真,但在轉(zhuǎn)換成VRML格式的時(shí)候會(huì)有一些小錯(cuò)誤,需要人工修改;直接用VRML編寫,做出來的器材的逼真度不如3DMAX,但編寫起來方便。這里采用第2種方法。
2.2 交互功能的設(shè)計(jì)一般的交互功能都能通過JavaScript腳本來實(shí)現(xiàn),但是如果VRML程序較大,運(yùn)行起來就會(huì)影響速度。為了實(shí)現(xiàn)較好的交互功能,最好將VRML虛擬場景和交互的控制區(qū)分開,這就需要用到Java小程序Applet。
教學(xué)中一般的黑板板書功能就是能夠在上面書寫,能用各種顏色的粉筆,能寫大小不等的字,還能用黑板擦擦掉。在這個(gè)虛擬實(shí)驗(yàn)中,這些功能都能實(shí)現(xiàn)。這就用到了EAI接口。在Applet小程序中設(shè)置字體的顏色、大小,將數(shù)據(jù)傳遞到VRML場景中,改變虛擬場景,就可以用設(shè)置好的顏色和大小來板書了。
2.3 網(wǎng)頁布局的設(shè)計(jì)本實(shí)驗(yàn)的組成主要是虛擬場景和控制字體顏色大小的Applet小程序區(qū)。它們在屏幕上的分布設(shè)計(jì)如圖1所示。
3 黑板板書實(shí)驗(yàn)的實(shí)現(xiàn)
3.1 字體顏色、大小的控制
1)方法介紹。板書功能的實(shí)現(xiàn)主要用JavaScript腳本來實(shí)現(xiàn)。由于EAI接口傳遞的數(shù)據(jù)不能直接傳到JavaScript腳本中,需要一個(gè)中間變量,這個(gè)中間變量其實(shí)就是一個(gè)節(jié)點(diǎn)。由這個(gè)中間變量接收EAI傳遞的數(shù)據(jù),那么這個(gè)節(jié)點(diǎn)的域就會(huì)發(fā)生變化。再通過一個(gè)路由將中間節(jié)點(diǎn)的域變化傳到JavaScript腳本的相應(yīng)事件中,進(jìn)而間接地實(shí)現(xiàn)參數(shù)的傳遞。方法如圖2所示。
板書功能的實(shí)現(xiàn)關(guān)鍵是用createVRMLFromString()動(dòng)態(tài)控制函數(shù)。由于板書是非常靈活的,所以寫出來的字應(yīng)該是圓滑的。擠壓造型Extrusion節(jié)點(diǎn)可以來創(chuàng)建彎曲的管道,板書寫的字和管道有相似之處。因此,可以用這個(gè)節(jié)點(diǎn)來實(shí)現(xiàn)具體的板書功能。
2)關(guān)鍵代碼。
①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);//生成節(jié)點(diǎn)
……
}
function hitpoint(val){
weix=val[0]; weiy=val[1];weiz=val[2];……
spine[q]=new SFVec3f(weix,weiy,weiz);
}
②Java程序。Java程序主要實(shí)現(xiàn)程序的界面布局以及獲取滾動(dòng)條當(dāng)前值。控制字體顏色、大小的滾動(dòng)條的處理程序如下:
public boolean handleEvent(Event event){//控制字體大小的滾動(dòng)條
if (event.id == Event. SCROLL_LINE_UP event.target ==scale){
setScale(event);……}//控制字體顏色的滾動(dòng)條
for(int i=0;i<3;i++){
if (event.id == Event. SCROLL_LINE_UP event.target ==scrBar[i]){
setColorLabel(event,i);……
}……}
除了以上工作,還需要獲得滾動(dòng)條實(shí)時(shí)變化的值,以進(jìn)一步對場景中相應(yīng)的VRML節(jié)點(diǎn)的域進(jìn)行賦值,進(jìn)而觸發(fā)腳本事件,實(shí)現(xiàn)板書功能。主要代碼如下:
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 擦除功能的實(shí)現(xiàn)這里所說的擦除并不是用鼠標(biāo)一點(diǎn)一點(diǎn)地抹掉,不是真正意義上的擦除;而是在Applet中引入一個(gè)按鈕,做一個(gè)超鏈接,重新打開這個(gè)網(wǎng)頁,看上去好像剛才寫的字不存在了,從而實(shí)現(xiàn)“擦除”效果。
所用到的函數(shù)是showDocument()[2],使用它來實(shí)現(xiàn)超鏈接。
Public void actionPerformed ( ActionEvent ae) {
if (ae.getSource()==b) {
try{
getAppletContext().showDocument(new URL(getDocumentBase()+\"changecolor.htm\"),\"_self\");
}
catch (Exception e) { } } }
至此,黑板板書功能設(shè)計(jì)完成,程序運(yùn)行結(jié)果如圖3所示。
參考文獻(xiàn)
[1]陸昌輝.使用VRML與JAVA創(chuàng)建網(wǎng)絡(luò)虛擬環(huán)境[M].北京:北京大學(xué)出版社,2003
[2]如何在Java applet.class中實(shí)現(xiàn)超鏈接[EB/OL].[2008-3-20].http://www.readygo.com.cn/it-845520.html