近年來(lái),虛擬現(xiàn)實(shí)在生態(tài)信息可視化方面的應(yīng)用正成為生態(tài)學(xué)者和計(jì)算機(jī)研究者共同感興趣的課題。水族館是一個(gè)展示海洋生態(tài)資源的場(chǎng)所, 一座水族館通常造價(jià)昂貴而在中國(guó)每個(gè)城市中并不普及, 采用虛擬現(xiàn)實(shí)來(lái)實(shí)現(xiàn)水族館生態(tài)信息的可視化具有重要的現(xiàn)實(shí)意義。本文在分析國(guó)內(nèi)外水族館景觀(guān)要素的基礎(chǔ)上,提出了建立網(wǎng)上三維虛擬水族館的方法。使用VRML97和3DSMAX共同建立網(wǎng)上虛擬水族館景觀(guān),利用VRML強(qiáng)大的交互功能,在微機(jī)上實(shí)現(xiàn)了虛擬水族館的三維漫游和水族生物的動(dòng)畫(huà)。本文的方法可以應(yīng)用到水族館的景觀(guān)規(guī)劃和網(wǎng)上展示中。
1、引言
自然生態(tài)資源的合理開(kāi)發(fā)和利用是社會(huì)可持續(xù)發(fā)展的重要組成部分,如何利用新技術(shù)開(kāi)發(fā)生態(tài)資源是人們普遍關(guān)注的話(huà)題。近年來(lái),虛擬現(xiàn)實(shí)技術(shù)在生態(tài)信息可視化方面正不斷取得新的應(yīng)用成果。以生態(tài)旅游信息資源的利用為例,生態(tài)旅游強(qiáng)調(diào)對(duì)自然景觀(guān)的保護(hù),是可持續(xù)發(fā)展的旅游。并且在生態(tài)旅游的全過(guò)程中,必須使旅游者受到生動(dòng)具體的生態(tài)教育。把虛擬現(xiàn)實(shí)技術(shù)引入到生態(tài)旅游可以有效地克服旅游信息時(shí)間和空間的限制,從而達(dá)到更好的教育效果。
傳統(tǒng)旅游的局限性主要表現(xiàn)為:
(1)從空間角度來(lái)講。由于地域限制,很多地方?jīng)]有條件或空間開(kāi)發(fā)旅游資源。特別在人口稠密地區(qū),土地資源少,政府不易去開(kāi)發(fā)較多的大型森林公園或是動(dòng)物園,不居住在公園附近的人們很少有機(jī)會(huì)能利用到這些旅游資源。另外,也有很多旅游地不是常人能涉足的,但是又能引起人們興趣,如太空漫步、極地探險(xiǎn)、海底尋寶等等。都市化生活使人們更加留戀大自然,但是由于時(shí)間、金錢(qián)、地理位置等的局限,有些人就不能經(jīng)常親臨諸多旅游勝地進(jìn)行實(shí)地游覽,也需要通過(guò)其他渠道獲得這一方面的旅游體驗(yàn)。
(2)從時(shí)間角度來(lái)看,有些已經(jīng)滅絕的物種和那些瀕臨滅絕要特別保護(hù)的物種,同樣有觀(guān)賞和學(xué)習(xí)的價(jià)值,也能引起人們廣泛的興趣和好奇心(如:恐龍時(shí)代)。但是,我們卻很難獲取相關(guān)的知識(shí)。近年來(lái),虛擬現(xiàn)實(shí)技術(shù)的發(fā)展為人類(lèi)觀(guān)察自然提供了新的技術(shù)手段,利用虛擬現(xiàn)實(shí)技術(shù),可以構(gòu)造各種虛擬旅游資源,在一定程度上彌補(bǔ)了現(xiàn)實(shí)生態(tài)旅游的不足,更能實(shí)現(xiàn)場(chǎng)景與人之間的互動(dòng),對(duì)旅游資源的開(kāi)發(fā)具有重要意義,值得推廣研究。作為一種嘗試,本文提出了構(gòu)造虛擬水族館的方法。水族館是一個(gè)展示水生生物的場(chǎng)所,集科普、教育、自然保護(hù)、觀(guān)光與一體。水族館具有很高的科技含量(如:水質(zhì)處理、人工海水配置、水生生物的飼養(yǎng)、水族館的建造材料、照明、布景等)。水族館的發(fā)展始于18世紀(jì)后葉,1789年,法國(guó)建立了世界上第一個(gè)水族館,其后,日本、英國(guó)、美國(guó)也相繼建立。水族館在國(guó)外大致經(jīng)歷了三個(gè)發(fā)展階段,即火車(chē)窗式,洄游槽式和大型綜合式。我國(guó)海域跨越熱帶、亞熱帶、溫帶三大氣候帶,海洋生物資源豐富,人們很早就意識(shí)到利用水族館來(lái)提高人們對(duì)保護(hù)海洋資源的認(rèn)識(shí)。1932年,我國(guó)建立了近代第一個(gè)水族館--青島水族館,在當(dāng)時(shí)屬亞洲一流水平。近年來(lái),隨著經(jīng)濟(jì)的發(fā)展,我國(guó)很多城市開(kāi)始興建水族館,投資規(guī)模也不斷增加。
如果置身于水族館中,就可以感受五光十色的海底世界,觀(guān)賞飄動(dòng)搖曳的各種海草以及各類(lèi)悠閑游弋的魚(yú)類(lèi),傾聽(tīng)海流的低吟,這些會(huì)帶給人們美的享受。通常,水族館的造價(jià)昂貴,遠(yuǎn)未普及,一般都是建在沿海城市或省城里,門(mén)票的價(jià)格也很貴。水族館建設(shè)也存在一些局限性,如資金、氣候、場(chǎng)地等的限制,在許多情況下,很多地方?jīng)]有條件建立水族館,如在我國(guó)北方嚴(yán)寒地區(qū)就不適合開(kāi)發(fā)露天水族館。另外,即使有些城市建立了水族館,城市里的大多數(shù)人很少有機(jī)會(huì)享受水族館的資源,如何讓更多的人(特別是青少年)參觀(guān)利用水族館是人們感興趣的一個(gè)話(huà)題。本文在借鑒國(guó)內(nèi)外水族館資源開(kāi)發(fā)工作的基礎(chǔ)上,提出了虛擬水族館的概念。所謂虛擬水族館就是采用虛擬現(xiàn)實(shí)技術(shù),通過(guò)在計(jì)算機(jī)上建立一個(gè)類(lèi)似于真實(shí)水族館的虛擬環(huán)境,讓游覽者實(shí)現(xiàn)虛擬觀(guān)賞效果。虛擬水族館不僅能夠模擬真實(shí)水族館的景觀(guān),還能夠保護(hù)珍貴的水生生物,因?yàn)樗屦^里所有的生物都是虛擬的。同樣,在虛擬水族館中,我們可以編制更多種類(lèi)的生物,避免了由于地理位置、氣候等因素帶來(lái)的不同生物生存環(huán)境的限制。這項(xiàng)技術(shù)對(duì)于由于地域限制而無(wú)法開(kāi)發(fā)水族館的地區(qū)是十分值得提倡的。虛擬水族館的組成主要包括:魚(yú)箱、各種魚(yú)的模型、各種海底生物、山石的模型等。還要包括背景、燈光的設(shè)置以及各種生物的行為設(shè)置等等。虛擬水族館目前在國(guó)外雖然已經(jīng)得到初步開(kāi)發(fā),但價(jià)格也很昂貴,不利于普及。例如,葡萄牙里斯本海洋水族館,作為在葡萄牙第98屆世界博覽會(huì)上的一部分,一個(gè)超級(jí)圖形計(jì)算機(jī)模擬這個(gè)海洋水族館的外表和其周?chē)沫h(huán)境以及它的內(nèi)景,包括生活在海平面上下的海洋生物[7]。從觀(guān)賞的角度上分析,如果為海底生物建立類(lèi)似于人工魚(yú)的行為模型,必然要增加很大的計(jì)算量,為此,可以考慮簡(jiǎn)化海底生物的運(yùn)動(dòng),從而達(dá)到可以在普通微機(jī)上開(kāi)發(fā)的目標(biāo)。
本文在對(duì)虛擬水族館景觀(guān)要素分析的基礎(chǔ)上,以普通微機(jī)作為開(kāi)發(fā)工具,采用虛擬現(xiàn)實(shí)造型語(yǔ)言VRML97和 3DS MAX實(shí)現(xiàn)了某虛擬水族館的場(chǎng)景,利用VRML強(qiáng)大的交互功能,實(shí)現(xiàn)了虛擬水族館中生命體的動(dòng)畫(huà),本文的方法為開(kāi)發(fā)水族館資源提供一種新的手段,水族館的游覽者不再受時(shí)空的限制,更好地實(shí)現(xiàn)了人與水族館的互動(dòng)。本文的方法可以應(yīng)用到水族館的景觀(guān)規(guī)劃和網(wǎng)上展示中。
2、虛擬水族館的場(chǎng)景設(shè)計(jì)
虛擬水族館具有透明的玻璃幕,里面有許多浮游的虛擬魚(yú)、虛擬海草、虛擬礁石和虛擬燈光。本文采用3DS MAX作為三維建模的工具,虛擬水族館的所有景觀(guān)物體均事先在3DS MAX中繪制好(紋理通過(guò)預(yù)先拍照獲取),然后再將三維模型導(dǎo)成VRML97的格式。具體繪制步驟概括如下:
(1)在3DS MAX繪制虛擬水族館的水箱和建筑模型:
虛擬水族館3DMAX編輯界面
虛擬水族館
虛擬水族箱模型
(2)繪制不規(guī)則形狀的靜態(tài)物體:不規(guī)則形狀物體包括海底和礁石,可先繪制一個(gè)規(guī)則形狀的物體,然后通過(guò)在編輯過(guò)程中添加噪聲來(lái)實(shí)現(xiàn)不規(guī)則的效果。最后,選擇合適的貼圖來(lái)實(shí)現(xiàn)表面視覺(jué)效果。
(3)繪制海草:可以有多種方法繪制海草的幾何造型,為了表現(xiàn)海草的運(yùn)動(dòng),可以設(shè)定波浪空間扭曲物體,將其扭曲影響施加給海草,實(shí)現(xiàn)海草的運(yùn)動(dòng)效果。
(4)海底生物的繪制:主要是包括虛擬海星和虛擬魚(yú),可采用多種方式實(shí)現(xiàn)。虛擬魚(yú)的模型完成后,可以為其設(shè)定骨骼系統(tǒng)來(lái)實(shí)現(xiàn)運(yùn)動(dòng)。虛擬魚(yú)的運(yùn)動(dòng)包括魚(yú)尾的擺動(dòng)和身體的前進(jìn)。其中,魚(yú)尾的擺動(dòng)通過(guò)創(chuàng)建骨骼、設(shè)置骨骼的運(yùn)動(dòng),將魚(yú)的身體作為骨骼的蒙皮來(lái)實(shí)現(xiàn)。身體的前進(jìn)通過(guò)路徑約束并在此基礎(chǔ)上調(diào)整魚(yú)的位置(設(shè)置關(guān)鍵幀)實(shí)現(xiàn)。如圖所示。
虛擬水族館魚(yú)的骨骼
虛擬水族館編輯魚(yú)的表皮
虛擬水族箱路徑約束
3、虛擬水族館動(dòng)態(tài)效果編程
虛擬水族館的動(dòng)態(tài)效果包括以下幾個(gè)方面:
(1)設(shè)定不同的漫游視點(diǎn):利用VRML的ViewPoint視點(diǎn)說(shuō)明語(yǔ)句,實(shí)現(xiàn)不同視點(diǎn)的漫游效果。其中,從魚(yú)的視角觀(guān)察周?chē)澜缧枰褂脛?dòng)畫(huà)視點(diǎn)的方法,即將一個(gè)視點(diǎn)綁定于魚(yú)的頭部,作為魚(yú)的眼睛來(lái)觀(guān)察周?chē)木拔铩H绻~(yú)的運(yùn)動(dòng)路徑已經(jīng)在3ds max中設(shè)置好,可以將攝像機(jī)鏈接到魚(yú)頭部。為了提高漫游的效果,需要設(shè)置自動(dòng)漫游,可以通過(guò)在3ds max設(shè)置攝像機(jī)動(dòng)畫(huà)來(lái)實(shí)現(xiàn)。
(2)虛擬魚(yú)的動(dòng)畫(huà):在3DSMAX中預(yù)先設(shè)置魚(yú)的游動(dòng)動(dòng)畫(huà),然后可以直接轉(zhuǎn)換成轉(zhuǎn)化為VRML動(dòng)畫(huà)文件,可以用文本編輯器打開(kāi)此文件,對(duì)其中的關(guān)鍵語(yǔ)句(如傳感器TimeSensor、位置插值PositionInterpolator、朝向插值OrientationInterpolator、坐標(biāo)插值CoordinateInterpolator等)的參數(shù)進(jìn)行修改調(diào)整。
虛擬魚(yú)和環(huán)境的碰撞檢測(cè)可以利用VRML中節(jié)點(diǎn)Collision來(lái)實(shí)現(xiàn),但當(dāng)魚(yú)的數(shù)量很多時(shí),需要進(jìn)行大量的碰撞檢測(cè)。在本文實(shí)現(xiàn)的原型中,出于視覺(jué)觀(guān)賞的考慮,不追求虛擬魚(yú)行為的真實(shí)感。為避免魚(yú)在水中游動(dòng)時(shí)與障礙物發(fā)生碰撞,采取了比較簡(jiǎn)單的方法,即為每一種魚(yú)設(shè)置好運(yùn)動(dòng)路徑,這些路徑避開(kāi)靜態(tài)的障礙物,并在空間上盡量避開(kāi)其他魚(yú)的運(yùn)動(dòng)路徑。
(3)光線(xiàn)的動(dòng)態(tài)效果:虛擬水族館可以利用光線(xiàn)的變化來(lái)烘托氣氛,調(diào)動(dòng)用戶(hù)的情緒。使用時(shí)間傳感器和顏色插補(bǔ)器來(lái)實(shí)現(xiàn)不同環(huán)境背景的轉(zhuǎn)換動(dòng)畫(huà)。方法是在場(chǎng)景中選擇需要變色的光源,用顏色插補(bǔ)器控制光源的顏色屬性來(lái)實(shí)現(xiàn)不同燈光背景的顏色轉(zhuǎn)換。主要代碼為:
DEF clock TimeSensor { #時(shí)間傳感器
cycleInterval 100
loop TRUE}
DEF inter ColorInterpolator {
#顏色插補(bǔ)器
key [
0.0 0.33 0.67 1.0
]
keyValue [
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
1.0 0.0 0.0
]
}
ROUTE clock.fraction_changed TO inter.set_fraction
ROUTE inter.value_changed TO plr-LIGHT.set_color
ROUTE inter.value_changed TO sp. set_diffuseColor
其中,clock是定義的時(shí)間傳感器節(jié)點(diǎn)名,inter是定義的顏色插補(bǔ)器節(jié)點(diǎn)名,plr-LIGHT是定義過(guò)的光源節(jié)點(diǎn)名,sp是定義過(guò)的一個(gè)長(zhǎng)方體(水族館)節(jié)點(diǎn)名。通過(guò)路由語(yǔ)句創(chuàng)建事件傳播體系,隨著時(shí)間的推移,光源和水族館表面的顏色根據(jù)顏色插補(bǔ)器中設(shè)置的顏色值不斷發(fā)生變化。
(4)動(dòng)態(tài)交互:VRML的Script節(jié)點(diǎn)可以實(shí)現(xiàn)動(dòng)態(tài)交互功能,Script節(jié)點(diǎn)的定義如下:
Script {
url []
directOutput FALSE
mustEvaluate FALSE
eventIn eventTypeName eventName #多個(gè)入事件、出事件和域
eventOut eventTypeName eventName
fieldTypeName fieldName initialValue
}
其中url域的值設(shè)置一個(gè)url列表,列表中的url域值可調(diào)用Java、JavaScript等腳本語(yǔ)言。
mustEvaluate域的值設(shè)置腳本程序何時(shí)進(jìn)行處理。若該值為T(mén)RUE,則當(dāng)Script節(jié)點(diǎn)的某個(gè)eventIn入事件接收到一個(gè)新值,瀏覽器將立即對(duì)相應(yīng)的腳本程序進(jìn)行處理。若為FALSE,則可推遲對(duì)該腳本程序的處理。directOutput域的值設(shè)置腳本程序的輸出是否受限制。默認(rèn)情況下為FALSE,即腳本不能直接進(jìn)行寫(xiě)操作或?qū)θ魏喂?jié)點(diǎn)發(fā)送入事件,但可以訪(fǎng)問(wèn)。例如,在虛擬水族館中可以實(shí)現(xiàn)開(kāi)啟燈和音樂(lè)的動(dòng)畫(huà)。具體實(shí)現(xiàn)是:從3ds max導(dǎo)出的VRML文件中插入所需要設(shè)置的聲音節(jié)點(diǎn)s和光源節(jié)點(diǎn)center-LIGHT,并在觸發(fā)對(duì)象(一個(gè)綠色小球key0)節(jié)點(diǎn)代碼中插入名為mouse的接觸傳感器節(jié)點(diǎn),即在小球key0上捆綁了接觸傳感器使之成為一個(gè)可交互的造型,當(dāng)鼠標(biāo)單擊綠色小球時(shí)即可實(shí)現(xiàn)開(kāi)啟燈和音樂(lè)的動(dòng)畫(huà)。主要代碼如下
DEF s Sound { #聲音節(jié)點(diǎn)
source AudioClip {
url "sea.wav"
loop TRUE
}
direction 1 0 0
intensity 0.0 #表示靜音
maxBack 300
maxFront 300
minBack 150
minFront 150
spatialize FALSE #作為環(huán)境音
}
DEF center-LIGHT PointLight { #光源節(jié)點(diǎn)
intensity 1
color 1 1 1
location -18.72 105.4 0
on FALSE #表示燈關(guān)
radius 204.9
}
DEF key0 Transform { #開(kāi)關(guān)(綠色小球)
translation -28.75 16.38 -13.41
children [
Shape { …… }
DEF mouse TouchSensor { }
]
}
接下來(lái)在VRML文件的末尾插入Script節(jié)點(diǎn)和路由語(yǔ)句,代碼如下:
DEF path Script { #Script節(jié)點(diǎn)
eventIn SFTime time
eventOut SFBool light
eventOut SFFloat loudsound
url "javascript:
function time(){
light = TRUE ;
loudsound = 0.5;
}"
}
ROUTE mouse.touchTime TO path.time
ROUTE path.light TO center-LIGHT.on
ROUTE path.loudsound TO s.intensity
以上Script節(jié)點(diǎn)共定義了一個(gè)SFTime類(lèi)型的入事件time、一個(gè)SFBool類(lèi)型的出事件light來(lái)控制燈的開(kāi)啟、一個(gè)SFFloat類(lèi)型的出事件loudsound來(lái)控制音樂(lè)的響起。通過(guò)JavaScript腳本程序?yàn)閠ime入事件定義了一個(gè)同名函數(shù)time( ),并使用賦值語(yǔ)句為出事件light和loudsound賦值,從而改變場(chǎng)景節(jié)點(diǎn)的相關(guān)參數(shù)。由于場(chǎng)景中綠色小球捆綁了接觸傳感器,一旦使用鼠標(biāo)單擊小球,傳感器就輸出touchTime事件,而Script節(jié)點(diǎn)的time入事件通過(guò)路由接收到傳感器輸出的事件后將自動(dòng)調(diào)用time()函數(shù)進(jìn)行處理,處理結(jié)果是將改變后的light和loudsound值分別通過(guò)路由輸出到光源center-LIGHT和聲音s的相關(guān)域上,使得燈開(kāi)啟、音樂(lè)也隨之響起。
(5)Lod技術(shù):Lod是一個(gè)VRML的節(jié)點(diǎn),它能夠根據(jù)物體與觀(guān)察者之間的距離選擇同一對(duì)象的不同細(xì)節(jié)的版本來(lái)控制場(chǎng)景的復(fù)雜度。如果一個(gè)物體是接近觀(guān)察者的,那么該物體是高度細(xì)節(jié)化的,觀(guān)察者能較清楚地看到物體表面特征,越靠近越清晰;如果物體是遠(yuǎn)離觀(guān)察者的,那么觀(guān)察者將不會(huì)發(fā)覺(jué)小的細(xì)節(jié)。Lod技術(shù)的作用能夠保證了在不降低瀏覽效果的同時(shí)提高系統(tǒng)的交互性和圖像繪制速度。
可以在3DSMAX中直接插入VRML節(jié)點(diǎn)的方式來(lái)使用Lod技術(shù),也可以在VRML文件中直接編輯。LOD節(jié)點(diǎn)的語(yǔ)法格式為:
LOD {level []
center 0.0 0.0 0.0
range [] }
其中l(wèi)evel域的值設(shè)置細(xì)節(jié)層次節(jié)點(diǎn)列表。一般將第一個(gè)層次節(jié)點(diǎn)設(shè)置為高細(xì)節(jié)造型,其后的層次節(jié)點(diǎn)程度依次降低。center域的值表示LOD節(jié)點(diǎn)內(nèi)建立的模型中心在當(dāng)前坐標(biāo)系中的三維坐標(biāo)。range域的值設(shè)置瀏覽者與造型間的距離列表。瀏覽器根據(jù)距離列表選定需要渲染的level域中的就節(jié)點(diǎn)造型。range域的值須大于等于零,且必須遞增排列。
在本文,主要針對(duì)虛擬魚(yú)造型紋理清晰度的變化來(lái)實(shí)現(xiàn)細(xì)節(jié)層次。即分別創(chuàng)建兩個(gè)VRML文件(通過(guò)3ds max導(dǎo)出),一個(gè)是清晰度較強(qiáng)的高細(xì)節(jié)造型,命名為near.wrl;另一個(gè)是缺少魚(yú)的紋理的造型文件far.wrl。再在LOD編組節(jié)點(diǎn)的level域中通過(guò)Inline加以引用,將兩個(gè)文件組織在一起,通過(guò)range域中合理的設(shè)置達(dá)到瀏覽效果。代碼如下:
#VRML V2.0 utf8
LOD {level [
Inline {url "near.wrl"}
Inline {url "far.wrl"}
]
range [150] }
當(dāng)瀏覽者與造型的距離小于150時(shí),看到的場(chǎng)景是高細(xì)節(jié)的;當(dāng)這個(gè)距離值大于150時(shí),看到的場(chǎng)景是相對(duì)低細(xì)節(jié)的。
4、原型系統(tǒng)
虛擬水族館的演示效果見(jiàn)圖。
虛擬水族館
虛擬水族館
虛擬水族館虛擬魚(yú)在游動(dòng)
5、結(jié) 論
本文提出了建立虛擬水族館的方法,實(shí)現(xiàn)用瀏覽器觀(guān)看虛擬水族館的效果,利用3DSMAX和VRML的功能,初步實(shí)現(xiàn)了虛擬水族館的多媒體互動(dòng)演示功能,游覽者可以在普通的微機(jī)上感受虛擬水族館的場(chǎng)景。本文提出的方法為今后水族館資源的開(kāi)發(fā)提供了一種新的技術(shù)手段。