楊安祺, 喬海超, 張杜娟, 賈偉光, 唐 軍
(1.陜西科技大學(xué)電氣與信息工程學(xué)院, 陜西 西安 710021; 2.西安醫(yī)學(xué)院公共課部, 陜西 西安 710021)
隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,網(wǎng)頁上一些文本、圖片等二維展示途徑已經(jīng)滿足不了人們的需要,三維建模語言的出現(xiàn)則滿足了人們的這一要求.目前,在房地產(chǎn)開發(fā)等諸多領(lǐng)域,國內(nèi)外不少公司都已經(jīng)開始了三維展示的應(yīng)用,通過三維實(shí)體構(gòu)建模型,將產(chǎn)品的特點(diǎn)生動(dòng)直觀地展現(xiàn)給用戶,獲得了巨大的成功.以三維建模技術(shù)構(gòu)建的虛擬展廳、虛擬社區(qū),不僅能給出模型的色彩、外觀、結(jié)構(gòu)、紋理等靜態(tài)信息,還能給出模型在運(yùn)動(dòng)狀態(tài)所擁有的一些特性,而且用戶可以在其中進(jìn)行交互式操作,了解到更多的模型在真實(shí)世界中的信息[1].
VRML(Virtual Reality Modeling Language,虛擬現(xiàn)實(shí)建模語言)是一種開發(fā)于上世紀(jì)90年代的三維建模語言,起初只能創(chuàng)建靜態(tài)的三維模型,但隨著計(jì)算機(jī)圖形學(xué)技術(shù)和用戶要求的不斷發(fā)展,VRML從2.0版本起支持動(dòng)態(tài)模型的建立,并且可以添加聲音、腳本,使得它所建立的模型更加生動(dòng)形象.由于VRML是一種面向WEB、面向?qū)ο蟮娜S建模語言,再加上它具有平臺(tái)無關(guān)性,用戶可以在任意操作系統(tǒng)上瀏覽,所以飛速成為了目前因特網(wǎng)上三維網(wǎng)站制作的主流語言.
在現(xiàn)在的三維圖形建模體系中,存在不少的佼佼者,比如以文件小、交互功能強(qiáng)而著稱的VRML建模,有著高畫質(zhì)、生動(dòng)的模型形態(tài)的3D MAX建模,以及純C++或者其他支持圖形繪制的計(jì)算機(jī)語言建模方式.其中VRML和3D MAX建模比較簡單易學(xué),而純計(jì)算機(jī)語言比如C++等的建模方式復(fù)雜程度較高,掌握起來困難度比較大.3D MAX渲染出來的動(dòng)畫效果很絢麗,可是僅僅能讓模型按照事先設(shè)置的路徑和方式運(yùn)動(dòng)起來,雖然也自帶有MAX Script腳本,但不能很好地支持多用戶交互操作.
相對而言,VRML不僅從語言結(jié)構(gòu)上來說比較簡單,而且支持多種不同種類的交互,能夠充分滿足編寫者的設(shè)計(jì)需要.VRML97標(biāo)準(zhǔn)的建立,使得VRML可以使用諸多的內(nèi)建傳感器節(jié)點(diǎn),而且支持VRML Script腳本編程,更令人欣喜的是,VRML還支持引入JAVA、JAVA Script等語言編制的腳本,這些腳本編程交互的加入,將會(huì)發(fā)揮編程靈活、控制手段多樣、實(shí)現(xiàn)范圍更廣泛的特點(diǎn),設(shè)計(jì)出更生動(dòng)、復(fù)雜的場景[2].
從編程的復(fù)雜程度上來說,大致可以分為兩類:一類是需要復(fù)雜編程的,比如利用VRML Script等腳本語言編寫交互程序;另一類是不需要復(fù)雜編程的,比如利用VRML自帶的各種傳感器節(jié)點(diǎn)進(jìn)行交互.從交互對象上看,又可以分為VRML內(nèi)部模型編程交互(如上面舉到的兩個(gè)例子)和VRML引入對象自帶交互功能,也就是在VRML引入的對象里自己帶有一定的交互功能.
根據(jù)以上區(qū)別,我們把VRML內(nèi)支持的交互功能分為3類:基于VRML內(nèi)建傳感器的交互、基于腳本語言的交互、引入可交互對象[3,4].
VRML內(nèi)建了時(shí)間傳感器(TimeSensor)、觸摸傳感器(TouchSensor)、接近傳感器(ProximitySensor)、碰撞傳感器(Collision)等多種傳感器節(jié)點(diǎn).這些傳感器節(jié)點(diǎn)功能不同,分工明確,可以完成最基本的交互功能,滿足用戶最基本的交互需要.VRML當(dāng)中還內(nèi)建有多種插值器,這些插值器主要用于實(shí)現(xiàn)動(dòng)畫效果.綜合運(yùn)用傳感器節(jié)點(diǎn)和插值器節(jié)點(diǎn),可以使用戶在執(zhí)行某一操作時(shí)觸發(fā)某個(gè)量變或者形變的動(dòng)畫,使場景更加生動(dòng).
舉個(gè)例子,假如我們目前想要設(shè)置一個(gè)這樣的功能:當(dāng)用戶走近某個(gè)對象時(shí),就可以聽到這個(gè)對象的相關(guān)介紹,當(dāng)離開一段距離后聲音就會(huì)漸漸減弱到消失.這個(gè)功能可以通過接近傳感器(ProximitySensor)節(jié)點(diǎn)去實(shí)現(xiàn).ProximitySensor節(jié)點(diǎn)用來感知某一個(gè)坐標(biāo)區(qū)域內(nèi)是否有用戶進(jìn)入和離開,并對用戶的進(jìn)入和離開還有在該區(qū)域內(nèi)的停留事件做出響應(yīng),其節(jié)點(diǎn)語法如下 :
ProximitySensor {
Enabled TRUE
Center x,y,z
Size a,b,c
isActive
enterTime
exitTime
Position_changed
Orientation_changed
}
其中,Enable域用來控制傳感器的開關(guān),是一個(gè)布爾型變量,當(dāng)它的值為TURE時(shí),傳感器處于打開狀態(tài),才能感知用戶的行為;center域用來設(shè)定用于感應(yīng)的長方體區(qū)域中心點(diǎn)的坐標(biāo)值;size用來設(shè)定用于感應(yīng)的長方體區(qū)域的大小,a、b、c分別為該區(qū)域在X軸、Y軸、Z軸方向的長度;isActive域是一個(gè)布爾型變量,用于標(biāo)記感應(yīng)區(qū)域內(nèi)有沒有用戶存在,如果有,那么它的值為TURE;enterTime域和exitTime域分別用于記錄用戶進(jìn)入和離開感應(yīng)區(qū)域的時(shí)間;Position_changed域用來記錄用戶在感應(yīng)區(qū)域內(nèi)的位置;Orientation_changed域用于記錄用戶在感應(yīng)區(qū)域內(nèi)的空間坐標(biāo)方向.
由于我們需要觸發(fā)的事件是音頻的播放,所以完成該感應(yīng)機(jī)制,還需要設(shè)置音響剪輯(AudioClip)節(jié)點(diǎn).音響剪輯節(jié)點(diǎn)主要用于引入音源信息,它的域值url可以鏈接到網(wǎng)上任意一段音頻,但是僅限于WAV和MIDI格式的文件.該節(jié)點(diǎn)中還包含有startTime域和stopTime域,分別用于設(shè)置聲音文件的播放和停止時(shí)間.
首先設(shè)置接近傳感器節(jié)點(diǎn)的感知區(qū)域,當(dāng)用戶進(jìn)入虛擬展廳當(dāng)中設(shè)定好的感知區(qū)域后,接近傳感器的isActive域?qū)?huì)輸出布爾值TRUE,同時(shí)接近傳感器enterTime域會(huì)把用戶進(jìn)入感應(yīng)區(qū)域的事件記錄下來,把接近傳感器enterTime域的時(shí)間值傳送到音響剪輯節(jié)點(diǎn)的startTime域,將其激活,這樣在用戶進(jìn)入感知區(qū)域時(shí),音響剪輯節(jié)點(diǎn)就開始播放聲音;當(dāng)用戶退出感知區(qū)域時(shí),接近傳感器的isActive域輸出FALSE,關(guān)閉該傳感器,同時(shí)接近傳感器的exitTime域記錄用戶退出感知區(qū)域的時(shí)間,把exitTime域記錄的時(shí)間值送到音響剪輯節(jié)點(diǎn)內(nèi)stopTime域,在這一時(shí)刻關(guān)閉聲音.這樣,一個(gè)感應(yīng)用戶是否接近對象的交互功能就完成了.
從以上例子可以看出,用戶的一般交互行為,用VRML的內(nèi)建傳感器節(jié)點(diǎn)綜合其他常用節(jié)點(diǎn)是很容易實(shí)現(xiàn)的.由于VRML內(nèi)建傳感器僅支持一些簡單的交互行為響應(yīng),所以基于傳感器節(jié)點(diǎn)的交互技術(shù)適用于處理一般情況下常用的用戶交互行為.
用戶在進(jìn)入虛擬場景之后,有時(shí)往往想要進(jìn)行一些比較復(fù)雜的交互,這些交互僅僅利用VRML內(nèi)建的傳感器節(jié)點(diǎn)是無法滿足的,這時(shí)候我們就需要使用腳本編程方式來解決.
腳本編程交互技術(shù)是指引入用其他腳本語言比如Java Script或者VRML Script等編寫的程序腳本去執(zhí)行某一項(xiàng)交互操作.由于VRML允許引用的腳本語言種類繁多,而且功能強(qiáng)大,所以利用這一機(jī)制基本上可以完成用戶所需要的所有交互行為.
在VRML當(dāng)中,需要使用腳本節(jié)點(diǎn)(Script)來引入其他語言編寫的腳本.腳本節(jié)點(diǎn)的語法格式如下:
DEF <節(jié)點(diǎn)名稱> Script{
field <域類型> <域名>
eventIn <入事件類型> <入事件名>
eventOut <出事件類型> <出事件名>
url ”<腳本語言聲明>:
腳本語言程序” }
這里的域、入事件、出事件是為了后面腳本語言程序的運(yùn)行做準(zhǔn)備工作的,用于建立腳本程序和VRML場景之間的聯(lián)系,沒有個(gè)數(shù)的限制,也就是說同一事件可以產(chǎn)生多個(gè)結(jié)果.
下面我們通過一段程序來介紹腳本編程與傳感器節(jié)點(diǎn)相結(jié)合使用完成的一項(xiàng)交互功能.在這里,我們制作了一個(gè)轉(zhuǎn)椅,當(dāng)人們用鼠標(biāo)點(diǎn)住轉(zhuǎn)椅的上部時(shí),可以拖動(dòng)轉(zhuǎn)椅轉(zhuǎn)向任意方向.為了實(shí)現(xiàn)交互,在轉(zhuǎn)椅的椅墊以上部分定義了一個(gè)繞軸旋轉(zhuǎn)的圓柱體傳感器(CylinderSensor)節(jié)點(diǎn),通過將傳感器節(jié)點(diǎn)的輸出路由到Script節(jié)點(diǎn)來引起轉(zhuǎn)椅的旋轉(zhuǎn).當(dāng)鼠標(biāo)停在轉(zhuǎn)椅上就會(huì)變成手的形狀可以隨鼠標(biāo)的轉(zhuǎn)動(dòng)而使轉(zhuǎn)椅繞Y軸進(jìn)行旋轉(zhuǎn).以下是實(shí)現(xiàn)該功能的代碼:
DEF SCR Script #定義Script節(jié)點(diǎn)
{
url ”javascript:
function initialize () {
ps = sp.site._parent_site_;
if (ps) {
geom = tr.children [1].children [0];
geom.children = ps.children;
ps.children = new MFNode (tr);
setAxis (axis);
center = ps.center;
tr.translation = center;
geom.translation = geom.rotation.multVec (center.negate ( ));
cortona = Browser.getName ().indexOf (‘Cortona’)! = -1;
}
}
function setAxis (val) {
geom = tr.children [1].children [0];
v = geom.rotation.multVec (axisVectors [val]);
tr.rotation = new SFRotation (axisVectors [1], v);
tr.children [1].rotation = tr.rotation.inverse ();
tr.children [0].offset = 0;
offset = geom.rotation;
}
function rotation (value) {
geom = tr.children [1].children [0];
v = tr.rotation.multVec (axisVectors [1]);
r = new SFRotation (v, value [3]);
geom.rotation = cortona? r.multiply (offset): offset.multiply(r);
geom.translation = geom.rotation.multVec (center.negate ( ));
}
function enable (val) {
tr.children [0].enabled = val;
}”
directOutput TRUE # Script節(jié)點(diǎn)可以將事件出直接傳給它能聯(lián)系上的任意節(jié)點(diǎn)
field SFNode tr Transform
{
children
[
DEF CS CylinderSensor #定義接觸型傳感器(轉(zhuǎn)椅繞下面軸旋轉(zhuǎn))
{
enabled IS Enabled
maxAngle IS $MaxAngle
minAngle IS $MinAngle
isActive IS isActive
}
Transform
{
children
[
Transform
{
rotation IS rotation_changed
}]}]}
field SFNode sp SiteProvider
{
site IS _object_site_}
eventIn SFBool enable IS enable
field SFInt32 axis IS $Axis
eventIn SFInt32 setAxis IS setAxis
eventIn SFRotation rotation
field SFRotation offset 0 1 0 0
field MFVec3f axisVectors [1 0 0, 0 1 0, 0 0 1]
field SFVec3f center 0 0 0
field SFBool cortona TRUE}
ROUTE CS.rotation_changed TO SCR.rotation
}
引入可交互對象的機(jī)制,是綜合運(yùn)用其他外部對象的交互資源完成VRML場景內(nèi)交互功能的方法.從VRML2.0版本開始,有兩種方法可以引用外部的.wrl或者其他格式的文件,其中內(nèi)建(InLine)節(jié)點(diǎn)允許包含存儲(chǔ)在網(wǎng)頁上的任何VRML文件,外部原型(EXTERNPROTO)節(jié)點(diǎn)允許調(diào)用來自互聯(lián)網(wǎng)任意地方的資源來定義新節(jié)點(diǎn).更一般的情況是,EXTERNPROTO語句使節(jié)點(diǎn)在VRML文件之外定義,這也是VRML最基本的可擴(kuò)展機(jī)制.
目前,基于以上兩種機(jī)制,已經(jīng)有很多種類的的對象可以插入到VRML場景中,而且其中一些對象本身就具有一定的交互性,部分對象還支持腳本編程.在使用VRML構(gòu)建的虛擬場景中引入這些對象,不僅可以使虛擬場景更加豐富多彩,而且能夠在一定程度上增強(qiáng)虛擬場景的交互性.
以Flash為例,在三維建模語言出現(xiàn)之前,F(xiàn)lash就曾經(jīng)一度被用于網(wǎng)頁仿三維展示.Flash本身具有強(qiáng)大的動(dòng)畫功能,而且支持Action Script腳本編輯語言,這些使得Flash在平面表示和交互上具有很大的優(yōu)勢.現(xiàn)在雖然有三維建模語言的支持,但是Flash文件體積小、表現(xiàn)方式多種多樣、交互功能強(qiáng)大的優(yōu)勢依然可以發(fā)揮在目前的三維建模領(lǐng)域.如果我們想在制作的VRML虛擬場景中加入Flash文件,那么在VRML文件的頭文件之后,加入如下代碼就可以支持對Flash文件的調(diào)用:
EXTERNPROTO FlashMovie [...]
中間被省略的部分用于設(shè)置外部節(jié)點(diǎn)的域和事件,其中域、事件的類型和名稱必須與引用的外部節(jié)點(diǎn)中的定義一樣.
使用外部原型節(jié)點(diǎn)引用的外部對象,其外部節(jié)點(diǎn)的資源定位格式為:
"URL/URN"或["URL/URN","URL/URN",…]
資源定位可以為URL或URN格式,當(dāng)使用"URL/URN"或["URL/URN","URL/URN",…]的數(shù)組形式時(shí),瀏覽器使用數(shù)組中第一個(gè)正確尋獲的資源.資源的形式也可以寫為:
URL/URN # externProtytypeName
externProtytypeName為引用的外部節(jié)點(diǎn)的名稱,這時(shí)候,可以使用與外部節(jié)點(diǎn)定義的名稱不同的節(jié)點(diǎn)名稱.
VRML支持的多種交互技術(shù)各有千秋,傳感器交互適用于處理簡單的用戶交互,腳本編程交互適用于處理復(fù)雜的用戶交互行為,在VRML中引入具有交互功能的對象更可以為虛擬場景增色不少.如果能在VRML構(gòu)建的場景中綜合運(yùn)用這些交互功能,則可以把VRML的交互能力發(fā)揮到極致.
[1] 劉 怡,張洪定,崔 欣.虛擬現(xiàn)實(shí)VRML程序設(shè)計(jì)[M]. 天津:南開大學(xué)出版社,2007:1-3.
[2] 翁 蓉,廖小平. 基于VRML和Java的交互式虛擬產(chǎn)品設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,12:59-60.
[3] 李曉玲,陸長德,李小莉. 基于網(wǎng)絡(luò)的交互式虛擬展示技術(shù)研究[J]. 計(jì)算機(jī)工程與應(yīng)用, 2007,43(3):90-92.
[4] 汪 華,李 瑩. VRML與JavaScript結(jié)合實(shí)現(xiàn)交互式動(dòng)畫[J].福建電腦,2008(3):187.