版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、虛擬現(xiàn)實(shí)技術(shù)VRML篇一、VRML介紹1.什么是VRML?VRML是“Virtual Reality Modeling Language”的縮寫形式,意思是“虛擬現(xiàn)實(shí)造型語言”。 第一代Web是以HTML為核心的二維瀏覽技術(shù),受HTML語言的局限性,VRML之前的網(wǎng)頁只能是簡單的平面結(jié)構(gòu),而且實(shí)現(xiàn)環(huán)境與參與者的動態(tài)交互是非常煩瑣的。第二代Web是以VRML為核心的三維瀏覽技術(shù)。第二代Web把VRML與HTML、Java、媒體信息流等技術(shù)有機(jī)地結(jié)合起來,形成一種新的三維超媒體Web。 VRML是用來描述三維物體及其行為的,可以構(gòu)建虛擬境界(Virtural World), 可以集成文本、圖像、音
2、響、MPEG影像等多種媒體類型,還可以內(nèi)嵌用Java、ECMAScript等語言編寫的程序代碼。以VRML為核心構(gòu)建的虛擬世界中用戶如身處真實(shí)世界,可以和虛擬物體交互,人們可以以習(xí)慣的自然方式訪問各種場所,在虛擬社區(qū)中“直接”交談和交往。事實(shí)上,目前采用VRML技術(shù)取得成功的案例已經(jīng)很多,例如探路者到達(dá)火星后的信息就是利用VRML在因特網(wǎng)上即時(shí)發(fā)布的,網(wǎng)絡(luò)用戶可以以三維方式隨探路者探索火星。 2.VRML的工作原理VRML定義了一種把3D圖形和多媒體集成在一起的文件格式。從語法角度看,VRML文件是顯式地定義和組織起來的3D多媒體對象集合;從語義角度看,VRML文件描述的是基于時(shí)間的交互式3D
3、多媒體信息的抽象功能行為。VRML文件描述的基于時(shí)間的3D空間稱為虛擬境界(Virtual World),簡稱境界,所包含的圖形對象和聽覺對象可通過多種機(jī)制動態(tài)修改。 VRML文件可以包含對其他標(biāo)準(zhǔn)格式文件的引用??梢园袹PEG、PNG和MPEG文件用于對象紋理映射,把WAV和MIDI文件用于在境界中播放的聲音。另外,還可以引用包含Java或ECMAScript代碼的文件,從而實(shí)現(xiàn)對象的編程行為。 VRML使用場景圖(Scene Graph)數(shù)據(jù)結(jié)構(gòu)來建立3D實(shí)境,VRML的場景圖是一種代表所有3D世界靜態(tài)特征的節(jié)點(diǎn)等級:幾何關(guān)系、質(zhì)材、紋理、幾何轉(zhuǎn)換、光線、視點(diǎn)以及嵌套結(jié)構(gòu)。幾乎所有生產(chǎn)廠商
4、,無論是CAD、建模、動畫、VR,還是VRML,他們的結(jié)構(gòu)核心都有場景圖。 境界中的對象及其屬性用節(jié)點(diǎn)(Node)描述,節(jié)點(diǎn)按照一定規(guī)則構(gòu)成場景圖(Scene Graph),也就是說,場景圖是境界的內(nèi)部表示。場景圖中的第一類節(jié)點(diǎn)用于從視覺和聽覺角度表現(xiàn)對象,它們按照層次體系組織起來,反映了境界的空間結(jié)構(gòu)。另一類節(jié)點(diǎn)參與事件產(chǎn)生和路由機(jī)制,形成路由圖(Route Graph),確定境界隨時(shí)間的推移如何動態(tài)變化。 VRML文件的解釋、執(zhí)行和呈現(xiàn)通過瀏覽器實(shí)現(xiàn),這與利用瀏覽器顯示HTML文件的機(jī)制完全相同。瀏覽器把場景圖中的形態(tài)和聲音呈現(xiàn)給用戶,這種視聽覺呈現(xiàn)即所謂的虛擬世界(境界)。用戶通過瀏覽器
5、獲得的視聽覺效果如同從某個特定方位體驗(yàn)到的,境界中的這種位置和朝向稱為取景器(Viewer)。 3.VRML的應(yīng)用VRML在電子商務(wù)、教育、工程技術(shù)、建筑、娛樂、藝術(shù)等領(lǐng)域有廣泛的應(yīng)用。 例如在教育上,VRML不僅僅是HTML功能更強(qiáng)的替代品,其潛在意義在于突破上述基于WWW的教學(xué)模型建立更自然、更真實(shí)的虛擬教育環(huán)境。在這種環(huán)境中學(xué)生可以以瀏覽探索的方式汲取知識,如進(jìn)入虛擬太空學(xué)習(xí)天文知識,利用虛擬地球?qū)W習(xí)地理知識,穿過歷史長廊與歷史人物交流,進(jìn)入分子世界游歷化學(xué)殿堂等等,這些曾經(jīng)是夢想中的學(xué)習(xí)方式都可以逐步實(shí)現(xiàn)。在這個虛擬教育世界中,甚至可以有利用VRML制作的動畫人物扮演教師,其面部表情和
6、形體動作利用動作跟蹤系統(tǒng)捕捉下來,這樣得到的講課節(jié)目將是三維的。如果把這種方式擴(kuò)大到教學(xué)雙方,則可實(shí)現(xiàn)具有實(shí)時(shí)交互性的虛擬教學(xué)教師控制的虛擬教師和學(xué)生控制的虛擬學(xué)生就可以在一個虛擬教室中相互交流。 4.VRML的工作組及其研究目標(biāo) 為了推動VRML技術(shù)的發(fā)展,VRML協(xié)會組織了很多工作組,每個工作組都是自愿組織、自我約束、并經(jīng)VRML協(xié)會認(rèn)可的技術(shù)委員會,負(fù)責(zé)某個與VRML有關(guān)的專題技術(shù)的研究和實(shí)現(xiàn)工作。人性動畫工作組(Humanoid Animation WG)利用VRML表現(xiàn)人類行為特性。 色彩保真工作組(Color Fidelity WG)確保采用任何平臺的觀眾所看到的效果都和創(chuàng)作者的原
7、始作品一樣,顏色應(yīng)相當(dāng)一致。 元形式工作組(Meta Forms WG)針對利用形式文法生成的作品,提出一般性的方法論和一般性規(guī)范,使之能夠映射為某種特定形式。首要目標(biāo)是能夠表示"數(shù)字生命格式"( Digital Life-Forms)結(jié)構(gòu)和增長。 面向?qū)ο髷U(kuò)展工作組(Object-Oriented Extensions WG)探討和推動對VRML進(jìn)行面向?qū)ο髷U(kuò)展的方法。 數(shù)據(jù)庫工作組(Database WG)推進(jìn)基于VRML商業(yè)應(yīng)用的創(chuàng)建,利用數(shù)據(jù)庫維護(hù)VRML 內(nèi)容的持久性、升級能力和安全傳輸能力。 外部創(chuàng)作接口工作組(External Authoring Interf
8、ace WG)在VRML境界和外部環(huán)境之間建立標(biāo)準(zhǔn)接口。 界面組件工作組(Widgets WG)為開發(fā)者和用戶提供一套基礎(chǔ)性的、可自由使用的標(biāo)準(zhǔn)用戶界面組件集,并提供支持基本組件集和所有VRML組件的理論框架。 二進(jìn)制壓縮格式工作組(Compressed Binary Format WG)探討并開發(fā)VRML文件的二進(jìn)制編碼方法,重點(diǎn)是研究為了快速傳送目的而盡量縮小文件尺寸,同時(shí)為了快速解碼目的而盡量簡化文件結(jié)構(gòu)。 通用媒體庫工作組(Universal Media Libraries WG)為了提高VRML境界的真實(shí)感,同時(shí)減少網(wǎng)絡(luò)的下載量,而定義一種由駐留本地的媒體元件(紋理、聲音和VRML對
9、象)組成的小型跨平臺媒體庫。同時(shí)定義一種統(tǒng)一機(jī)制,通過這種機(jī)制,VRML內(nèi)容創(chuàng)作者可以在自己的境界中使用這些媒體元件。 活動境界工作組(Living Worlds WG)為多用戶(包括多個開發(fā)者)應(yīng)用的產(chǎn)生和進(jìn)化定義概念框架,并確定一組界面。 鍵盤輸入工作組(Keyboard Input WG)為了使內(nèi)容創(chuàng)作者能夠在自己的境界中訪問鍵盤輸入,定義一個或多個擴(kuò)充節(jié)點(diǎn)。 一致性工作組(Conformance WG)為與一致性測試有關(guān)的問題提供一個討論場所,特別地,本組將辨別VRML實(shí)現(xiàn)發(fā)生分歧的地方以及相應(yīng)的動作序列。 生物圈工作組(Biota WG)為生命系統(tǒng)(Living System)的研究
10、和學(xué)習(xí)建立、配備數(shù)字式工具和環(huán)境。 分布式交互仿真工作組(Distributed Interactive Simulation WG)為建立有多廣播能力(Multicast-Capable)的大規(guī)模虛擬環(huán)境(Large-Scale Virtual Environments,LSVEs)確立初始網(wǎng)絡(luò)約定。 VRML腳本工作組(VRML Script WG)向VRML監(jiān)查組(VRML Review Board,VRB)提供有關(guān)Java和JavaScript的問題列表、修改建議和評論。 自然語言處理和動畫工作組(NLP & Animations WG)為了使用戶能使用自然語言和VRML動畫形
11、象進(jìn)行交流,從而使交互更自然,增強(qiáng)用戶和動畫形象之間的信息流動,研究如何使用“問題/回答”、“命令/響應(yīng)”式的對話以及基于操作系統(tǒng)命令和字符控制的自然語言。 VRML-DHTML集成工作組(VRML-DHTML Integration WG)為VRML和DHTML在文檔對象模型、組件(Component)接口和繪制等三個層次的緊密集成開發(fā)一種概念模型。 6.研究現(xiàn)狀VRML97發(fā)布后,互聯(lián)網(wǎng)上的3D圖形幾乎都使用了VRML。由于技術(shù)的局限性,如帶寬不夠,需要下栽插件瀏覽,文件量大,真實(shí)感、交互性需要進(jìn)一步加強(qiáng)等原因,最近一二年,許多制作Web3D圖形的軟件公司的產(chǎn)品,并沒有完全遵循VRML97
12、標(biāo)準(zhǔn),而是使用了專用的文件格式和瀏覽器插件,開發(fā)了比較實(shí)用的VR軟件。這些軟件有些比VRML有了進(jìn)步,在渲染速度、圖像質(zhì)量、造型技術(shù)、交互性以及數(shù)據(jù)的壓縮與優(yōu)化上,都有勝過VRML之處。比如,Cult3D、Viewpoint、GL4Java、Pulse3D、Flatland、Flash、JPEG2000等。 CULT3D、VIEWPOINT、360度環(huán)視等技術(shù)正被應(yīng)用。以Blaxxun和ParallelGraphics公司為代表,它們都有各自的VR瀏覽器插件,并各自開發(fā)基于VRML標(biāo)準(zhǔn)的擴(kuò)展節(jié)點(diǎn)功能(X3D),使3D的效果,交互性能更加完美;支持MPEG,Mov、Avi等視頻文件,Rm等流媒體
13、文件,Wav、Midi、Mp3、Aiff等多種音頻文件,F(xiàn)lash動畫文件,多種材質(zhì)效果,支持Nurbs曲線,粒子效果,霧化效果;支持多人的交互環(huán)境,VR眼鏡等硬件設(shè)備;在娛樂、電子商務(wù)等領(lǐng)域都有成功的應(yīng)用,并各自為適應(yīng)X3D的發(fā)展,以X3D為核心,有Blaxxun3D等相關(guān)產(chǎn)品。在虛擬場景,尤其是大場景的應(yīng)用方面,以VRML標(biāo)準(zhǔn)為核心的技術(shù)具有獨(dú)特的優(yōu)勢。二、初識VRML(一)VRML的文件結(jié)構(gòu)1.文件頭VRML2.0(VRML97)開頭如下:# VRML V2.0 utf8VRML是大小寫敏感的,utf8是指一種純文本編碼方式2.場景圖(Scene Graph)由描述“對象及其屬性”的節(jié)點(diǎn)
14、組成,節(jié)點(diǎn)是VRML的基本單元,場景圖的第一類節(jié)點(diǎn)用于從視覺和聽覺角度表現(xiàn)對象,它們是按照層次體系結(jié)構(gòu)組織的;另一類節(jié)點(diǎn),則參與事件產(chǎn)生和路由機(jī)制。3.原型(Prototype)用戶可以通過原型擴(kuò)充VRML的節(jié)點(diǎn)類型集。原型的定義可以包含在使用該原型的文件中,也可以在外部定義。4.事件路由(Route)有些VRML節(jié)點(diǎn)能通過產(chǎn)生事件響應(yīng)環(huán)境變化或用戶交互。事件一旦產(chǎn)生,就按時(shí)間順序向路由目標(biāo)節(jié)點(diǎn)發(fā)送。目標(biāo)節(jié)點(diǎn)接收后進(jìn)行相應(yīng)處理,可改變節(jié)點(diǎn)狀態(tài),產(chǎn)生其他事件,或者修改場景圖的結(jié)構(gòu)。利用腳本節(jié)點(diǎn)Script,作者可以Java或JavaScript語言自定義任意事件處理。(二)VRKL節(jié)點(diǎn)和數(shù)據(jù)類型
15、虛擬場景由對象構(gòu)成,對象及其屬性用節(jié)點(diǎn)(Node)描述,節(jié)點(diǎn)是構(gòu)成VRML文件的基本單元。VRML97定義了54種基本節(jié)點(diǎn)類型(內(nèi)部節(jié)點(diǎn)類型),用戶也可以通過原型機(jī)制定義自己的節(jié)點(diǎn)類型。節(jié)點(diǎn)由域和事件組成:1.域(field) 描述了節(jié)點(diǎn)的當(dāng)前狀態(tài)。其中外露域(exposedField)是域和事件的統(tǒng)一體,它既作為域描述節(jié)點(diǎn),又隱含著形如“set_域名”的入事件和“域名_changed”的出事件。2.事件(event)分為入事件和出事件,入事件將導(dǎo)致節(jié)點(diǎn)狀態(tài)的改變;出事件向外報(bào)告自身狀態(tài)的變化。(三)VRML瀏覽器 Blaxxun Contact 3DCosmo PlayerVisvape等M
16、icrosoft VRML2.0 Viewer(四)編寫VRML境界1.制作第一個虛擬境界#VRML V2.0 utf8Group children Shape geometry Box 將它保存為SimpleWorld.wrl文件,則可以用瀏覽器看到它。 2.定義外觀第二場景再定義立方體的外觀,即改變Shape節(jié)點(diǎn)的appearance域(外觀),appearance域是一個節(jié)點(diǎn),此節(jié)點(diǎn)的material域定義為一個Material節(jié)點(diǎn): 則Shape節(jié)點(diǎn)變成了:Shape appearance Appearance material Material geometry Box 修改它的di
17、ffuseColor域(漫射色),應(yīng)該是 1 0 0 ,3個數(shù)字分別表示紅色、綠色和藍(lán)色,取值范圍是0到1:material Material diffuseColor 1 0 0 這樣,生成了第二個場景文件:#VRML V2.0 utf8Group children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 3.定義變換第三個場景若想移動這個紅色的立方體,可以通過為它外套一個Transform節(jié)點(diǎn)來實(shí)現(xiàn): Transform translation 5 0 0 children
18、Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box Transform節(jié)點(diǎn)的translation 5 0 0表示x軸向上右移5個單位(米)則第三個場景完整代碼如下:# VRML V2.0 utf8Group children Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 4.復(fù)制節(jié)點(diǎn)第四個場景 復(fù)制節(jié)點(diǎn),并將
19、各自的幾何形狀定義為方塊、球體和圓椎Group children Transform translation 5 0 0 children Shape . . . geometry Box Transform translation 0 0 0 children Shape . . . geometry Sphere Transform translation -5 0 0 children Shape . . . geometry Cone # end of Group children 為了以后引用方便,分別給這3個Transform節(jié)點(diǎn)指定一個名稱: DEF box Transform
20、. . . DEF Sphere Transform . . . DEF cone Transform . . . 則第四個場景的完整代碼是:# VRML V2.0 utf8Group children DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF sphere Transform translation 0 0 0 children Shape appearance Appearance
21、 material Material diffuseColor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone # end of Group children將此文件保存為FirstWorld.wrl,用瀏覽器觀看,可從多個方位瀏覽自己的作品。(五)交互能力的加入1.傳感器 是交互能力的基礎(chǔ),共9種。在場景中,傳感器節(jié)點(diǎn)一般是以其他節(jié)點(diǎn)的子節(jié)點(diǎn)的身份
22、存在的,它的父節(jié)點(diǎn)稱為可觸發(fā)節(jié)點(diǎn),觸發(fā)條件和時(shí)機(jī)由傳感器節(jié)點(diǎn)類型確定。 接觸傳感器(TouchSensor)是最常用的傳感器,先了解一下開關(guān)節(jié)點(diǎn)lightSwitch(組節(jié)點(diǎn)),并定義一個接觸傳感器作為它的子節(jié)點(diǎn): DEF lightSwitch Group children 各幾何造型節(jié)點(diǎn) DEF touchSensor TouchSensor 傳感器能引起某種變化,下面看場景變化。2.視點(diǎn)當(dāng)你拖動鼠標(biāo)或按動箭頭鍵時(shí)(按照VRML術(shù)語,稱為航行),虛擬境界就會旋轉(zhuǎn)或縮放,這實(shí)際上是在調(diào)整你的視點(diǎn)位置或視角。在虛擬場景的重要位置可以定義視點(diǎn)節(jié)點(diǎn)(ViewPoint),它們是境界作者給用戶推薦的
23、上佳觀賞方位,在CosmoPlayer瀏覽器中,用戶就可以通過鼠標(biāo)右鍵選擇作者推薦的各個視點(diǎn)。這里我們定義兩個視點(diǎn)節(jié)點(diǎn):DEF view1 Viewpoint “view1”是編程時(shí)引用的名字position 0 0 20 description "View1" “View1”是瀏覽器上顯示的名字 DEF view2 Viewpoint position 5 0 20 description "view2" 目的是使用戶可以通過觸發(fā)開關(guān)節(jié)點(diǎn)來切換視點(diǎn)。視點(diǎn)節(jié)點(diǎn)中的坐標(biāo)表示視點(diǎn)在場景中的位置,坐標(biāo)的單位是米,視點(diǎn)的名稱將會在瀏覽器菜單中提示出來供用戶選擇。
24、把上述視點(diǎn)說明加入helloworld2.wrl中(放在Group節(jié)點(diǎn)之前),并把其中的方塊節(jié)點(diǎn)修改成可觸發(fā)節(jié)點(diǎn): DEF box Tranform children Shape . Box . DEF touchBox TouchSensor 定義觸發(fā)節(jié)點(diǎn) 把修改過的文件另存為“touchme.wrl”。3.事件傳遞下面把觸發(fā)(用鼠標(biāo)箭頭按動方塊)和場景變化(視點(diǎn)切換)這兩件事情聯(lián)系起來,在場景圖中,除節(jié)點(diǎn)構(gòu)成的層次體系外,還有一個“事件體系”,事件體系由相互通訊的節(jié)點(diǎn)組成。能夠接收事件的節(jié)點(diǎn)都應(yīng)具有事件入口(eventIn),如果它要接收多種類型的事件(稱為入事件),它就應(yīng)該具有多個事件入
25、口,也就是說,事件入口象節(jié)點(diǎn)的域一樣是有類型的。同樣,發(fā)送事件的節(jié)點(diǎn)應(yīng)有事件出口(eventOut),事件出口也是有類型的。例如ViewPoint節(jié)點(diǎn)就有一個事件入口set_bind,當(dāng)向此事件送入一個值“TRUE”(即所謂的入事件)時(shí),該viewpoint節(jié)點(diǎn)成為當(dāng)前視點(diǎn)。又如,接觸檢測器TouchSensor有一個事件出口isActive,當(dāng)受到用戶觸發(fā)后它就從此出口送出一個“TRUE”(即所謂的出事件),在下一個事件發(fā)送之前,此事件一直保存在事件出口中(作為記錄)。 事件出口和事件入口通過路徑相連,這就是VRML文件中除節(jié)點(diǎn)以外的另一基本組成部分:ROUTE 語句。ROUTE語句把事件出
26、口和事件入口聯(lián)系在一起,從而構(gòu)成事件體系。在這里,我們是把接觸檢測器touchBox的事件出口isActive連接到視點(diǎn)節(jié)點(diǎn)view2的事件入口set_bind: ROUTE touchBox.isActive TO view2.set_bind 現(xiàn)在我們得到的VRML文件是: #VRML V2.0 utf8 DEF view1 Viewpoint 視點(diǎn)position 0 0 20 description "view1" DEF view2 Viewpoint position 5 0 20 description "view2" Group chil
27、dren DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF touchBox TouchSensor 觸感 DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone Transf
28、orm translation -5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children ROUTE touchBox.isActive TO view2.set_bind 傳遞把這個文件調(diào)入瀏覽器,然后把鼠標(biāo)指向方塊并按下左鈕(先別松開?。梢钥吹揭朁c(diǎn)已經(jīng)變?yōu)関iew2,內(nèi)部的機(jī)制我們已經(jīng)很清楚:左鈕按下時(shí)方塊節(jié)點(diǎn)的接觸檢測器被觸發(fā),接著接觸檢測器從事件出口isActive送出一個事件“TRUE”,這個事件通過路由
29、進(jìn)入視點(diǎn)節(jié)點(diǎn)view2的事件入口set_bind,view2收到“TRUE”后成為當(dāng)前視點(diǎn),所以在我們眼前場景發(fā)生了變化。 當(dāng)松開鼠標(biāo)左鍵,又回到原來的視點(diǎn),稱為視點(diǎn)回跳。因?yàn)樗砷_鼠標(biāo)左鍵后,接觸傳感器向view2發(fā)送了“FALSE”事件,這樣view2的當(dāng)前地位被解除。若不想回跳,則要自己來定義。4.利用腳本編寫自定義行為在VRML中,利用Script節(jié)點(diǎn)(腳本節(jié)點(diǎn))定義用戶自定義行為,所謂定義即用腳本描述語言(Scripting Language)編寫腳本的過程。VRML97支持的腳本描述語言目前有兩種:Java和EMCAScript(這是JavaScript標(biāo)準(zhǔn)化后的名稱),關(guān)于這兩種語
30、言本身,請參考相應(yīng)參考書,VRML97標(biāo)準(zhǔn)中定義了它們和VRML的接口方法。應(yīng)提請注意的是:VRML是基于節(jié)點(diǎn)的語言,所以腳本也是封裝在Script這個特殊節(jié)點(diǎn)中的。這里我們不過多討論腳本描述語言的細(xì)節(jié),主要討論把腳本集成到VRML文件中的方法。 上面我們曾把接觸檢測器touchBox 和視點(diǎn)view2直接通過路徑連接起來,現(xiàn)在要定義我們指定的行為,就需要在二者之間插入一個腳本節(jié)點(diǎn),也就是讓路徑繞個彎: ROUTE touchBox.isActive TO touchScript.touchBoxIsActive ROUTE touchScript.bindView2 TO view2.set
31、_bind 其中的腳本節(jié)點(diǎn)touchScript有一個事件人口touchBoxIsActive和一個事件出口bind_View2,前者接收來自接觸檢測器touchBox的事件,然后經(jīng)自己的腳本處理后,把結(jié)果發(fā)送給視點(diǎn)節(jié)點(diǎn)view2: DEF touchScript Script eventIn SFBool touchBoxIsActive 入口eventOut SFBool bindView2 出口url"javescript: 腳本function touchBoxIsActive(active) 與入口同名的函數(shù)被調(diào)用bindView2= TRUE; 返回到出口" 關(guān)
32、于這個Script節(jié)點(diǎn),請注意一下幾點(diǎn):(1)它的事件入口touchBoxIsActive和事件出口bindView2是自定義的,其它VRML節(jié)點(diǎn)的域和事件都是固定的。(2)這里定義的事件入口touchBoxIsActive(即入事件)和事件出口bindView2(即出事件)的類型都是SFBool(單值布爾型),它們與touchBox的事件出口isActive和view2的事件入口set_bind的類型保持一致。(3)“url”是腳本節(jié)點(diǎn)的一個域,可以直接包含腳本,也可以包含一個或多個用URL地址指示的腳本,若有多個地址,則按照先后次序獲取第一個可得到的腳本。(4)腳本是以函數(shù)(functio
33、n)的形式給出的,函數(shù)名touchBoxIsActive 與事件入口的名稱相同,這是和ECMAScript語言的接口約定,表示相應(yīng)事件入口收到事件后調(diào)用此函數(shù)進(jìn)行處理。5.事件流程與小結(jié) 下面我們整理一下事件流程: (1)用戶在方塊上按下鼠標(biāo)左鍵。 (2)接觸檢測器發(fā)出一個“TRUE”事件。 (3)此事件進(jìn)入腳本節(jié)點(diǎn)touchScript的事件入口touchBoxIsActive. (4)調(diào)用腳本函數(shù)touchBoxIsActive(注意函數(shù)并沒有判斷入事件的值)。 (5)函數(shù)向touchScript的事件出口bindView2發(fā)送一個“TRUE”事件(還可以進(jìn)行其它判斷或執(zhí)行其它事件)。 (
34、6)view2節(jié)點(diǎn)收到“TRUE”事件,成為當(dāng)前視點(diǎn)。按照VRML約定,“認(rèn)為”上述事件是同時(shí)發(fā)生的,也就是這些事件的時(shí)間戳相同。 (7)若用戶松開鼠標(biāo)左鍵,則接觸檢測器發(fā)出一個“FALSE”事件,此事件同樣引起腳本函數(shù)調(diào)用并發(fā)送“TRUE”事件,所以view2仍然保持為當(dāng)前視點(diǎn)。 本節(jié)的完整代碼是: #VRML V2.0 utf8 DEF view1 Viewpoint position 0 0 20 description "view1" DEF view2 Viewpoint position 5 0 20 description "view2"
35、Group children DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF touchBox TouchSensor DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone
36、 Tranform transaltion -5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children DEF touchScript Script eventIn SFBool touchBoxIsActive eventOut SFBool bindView2 url "javascript : function touchBoxIsActive (active) bindView2 = TRUE; &qu
37、ot; ROUTE touchBox.isActive TO touchScript.touchBoxIsActive ROUTE touchScript.bindView2 TO view2.set_bind這里所建立的虛擬境界并不復(fù)雜,但涉及到了VRML2.0最基礎(chǔ)性的功能和概念:利用檢測器產(chǎn)生事件、利用路由傳遞事件以及利用腳本編寫自定義行為,掌握了這些內(nèi)容也就掌握了VRML2.0的核心。在后面的幾節(jié)中,我們將探索一些專題性的有趣功能,而本節(jié)是基礎(chǔ),因而必須透徹理解。 (六)進(jìn)一步的完善與修飾1.鄰近傳感器當(dāng)用戶進(jìn)入或離開鄰近檢測器所劃定的區(qū)域時(shí)就會觸發(fā)它。正如你在標(biāo)準(zhǔn)中可以查到的那樣,P
38、roximitySensor節(jié)點(diǎn)定義為:ProximitySensor exposedField SFVec3f center 0 0 0 exposedField SFVec3f size 0 0 0 exposedField SFBool enabled TRUE eventOut SFBool isActive eventOut SFVec3f position_changed eventOut SFRotation orientation_changed eventOut SFTime enterTime eventOut SFTime exitTime ProximitySensor
39、節(jié)點(diǎn)共有三個外露域(exposedField)和五個出事件(eventOut).出事件我們已經(jīng)熟悉,是節(jié)點(diǎn)狀態(tài)發(fā)生改變時(shí)用來通知其它節(jié)點(diǎn)的,這里的出事件isActive 用于ProximitySensor通報(bào)自己已被激活。enterTime和exitTime通報(bào)用戶(代表用戶的用戶化身或指示器)進(jìn)入和退出ProximitySensor檢測區(qū)的時(shí)刻。若用戶已在檢測器之內(nèi),則當(dāng)用戶的位置或方位發(fā)生變化時(shí),送出position_changed和orientation_changed出事件。這五個出事件聯(lián)合起來,就定義了鄰近檢測器的功能。外露域則集域(Field)、入事件(eventIn)和出事件(e
40、ventOut)三者的功能于一身,也就是說,它既象域一樣描述了節(jié)點(diǎn)的當(dāng)前狀態(tài),又可以作為入事件由其它節(jié)點(diǎn)修改這種狀態(tài),并作為出事件把這種改變通知其它節(jié)點(diǎn)。這里的enabled外露域是布爾型的,用于ProximitySensor的啟用和停用,center和size定義形為長方體的鄰近檢測區(qū)。我們要在方塊、球體和圓柱這三個物體構(gòu)成的靜態(tài)世界,現(xiàn)在在球體周圍增加一個鄰近檢測區(qū):DEF sphere Transform translation 0 0 0 children Shape . DEF comeClose ProximitySensor center 0 0 0 size 4 4 4 Pro
41、ximitySensor的名字為comeCloser,鄰近區(qū)的中心和球體的球心重合,形狀為正方體,邊長為4米,是球體直徑的兩倍。當(dāng)用戶走進(jìn)球體時(shí)就會觸發(fā)這個鄰近檢測器,檢測器發(fā)出isActive事件,我們把這個事件出口通過路由指向Script節(jié)點(diǎn)(用來綁定視點(diǎn)2):DEF comeCloserScript Script eventIn SFBool enterProximitySensorIsActive eventOut SFBool bindView2 url " javascript : function enterProximitySensorIsActive (active
42、) bindView2=TRUE; " 隨后,我們在鄰近檢測器的出事件isActive和腳本節(jié)點(diǎn)comeCloserScript的入事件enterProximitySensorIsActive之間建立路由,后者收到事件后執(zhí)行函數(shù)enterProximitySensroIsActive,函數(shù)發(fā)出bindView2出事件,這個出事件通過路由連接到視點(diǎn)節(jié)點(diǎn)View2:ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActive ROUTE comeCloserScript.bindView2 TO vi
43、ew2.set_bind 也就是說,一旦用戶進(jìn)入鄰近區(qū),境界的當(dāng)前視點(diǎn)將轉(zhuǎn)換成View2.這個由兩個視點(diǎn)、三個物體、一個鄰近檢測器和一個腳本節(jié)點(diǎn)組成的境界的完整代碼如下:#VRML V2.0 utf8 DEF view1 Viewpoint position 0 0 20 description "view1" DEF view2 Viewpoint position 0 0 20 description "view2" Group children DEF box Transform translation 5 0 0 children Shape a
44、ppearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF comeCloser ProximitrySensor center 0 0 0 size 4 4 4 DEF cone Transform translation -5 0 0 childr
45、en Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children DEF comeCloserScript Script eventIn SFBool enterProximitySensorIsActive eventOut SFBool bindView2 url "javascript : function enterProximitySensorIsActive(active) bindView2=TRUE; " ROUTE
46、 comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActive ROUTE comeCloserScript.bindView2 TO view2.set_bind 啟動VRML瀏覽器進(jìn)入境界,面向球體一直走過去,當(dāng)你剛剛感到靠近球體時(shí),會突然感到自己后退了一大步(或者說物體跳到前方更遠(yuǎn)的地方),這表明鄰近檢測器已經(jīng)檢測到你的靠近,它把這件事通知腳本節(jié)點(diǎn),腳本節(jié)點(diǎn)把視點(diǎn)View2綁定成當(dāng)前視點(diǎn),從而使你感到視點(diǎn)突然改變。再稍稍修改一下鄰近檢測器,把它的中心位置向右移了2米: DEF comeCloser Proximi
47、tySensor center 2 0 0 size 4 4 4 這樣你就可以從左邊(方塊那一邊)走進(jìn)球體(視點(diǎn)不跳),但不能從右邊(圓錐那一邊)走近它(視點(diǎn)跳轉(zhuǎn))。 總之,ProximitySensor能夠檢測用戶是否進(jìn)入或離開檢測器指定的空間區(qū)域,典型用法是當(dāng)用戶走進(jìn)房間時(shí)開啟燈光,當(dāng)用戶離開時(shí)關(guān)閉燈光,從而建立功能豐富的“智能”空間。2.連續(xù)動畫我們已經(jīng)使用過接觸檢測器,當(dāng)我們把鼠標(biāo)指針放到方塊(這個幾何節(jié)點(diǎn)包含接觸檢測器)上面時(shí),指針形狀發(fā)生變化,這意味著我們已經(jīng)進(jìn)入檢測區(qū),如果按下鼠標(biāo)左鈕,則按照我們的定義,當(dāng)前視點(diǎn)會發(fā)生變化。 這一節(jié)仍然制作這樣一個對接觸有反應(yīng)的方塊,只是接觸后它會連續(xù)不斷地轉(zhuǎn)動,動畫行為可以用時(shí)間檢測器(TimeSensor)驅(qū)動,而不斷變化的旋轉(zhuǎn)值可用腳本節(jié)點(diǎn)或朝向插補(bǔ)器(orientationInterpolator)給出。接觸傳感器作為開始的基本代碼是: #VRML V2.0 utf8 DEF cube Transform rotation 1 1 1 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF TouchS TouchSensor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- (4篇)2024幼兒園小班老師見習(xí)期工作總結(jié)
- 原材料及中間產(chǎn)品管理方案
- 二零二五年香港活牛養(yǎng)殖、屠宰、運(yùn)輸全流程服務(wù)合同3篇
- 房屋建筑學(xué)試題庫(含答案)匯編
- 二零二五版XX污水處理廠污泥處理與資源化利用合同3篇
- 阻礙執(zhí)行力的三大原因幻燈片資料
- 2024年海南衛(wèi)生健康職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年浙江金融職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 臺球室項(xiàng)目投資協(xié)議書
- 2024年濟(jì)源職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年個人汽車抵押借款合同范本(四篇)
- 軌道交通設(shè)備更新項(xiàng)目可行性研究報(bào)告-超長期國債
- 2024年公共衛(wèi)生基本知識考試題庫(附含答案)
- 2024-2030年中國一氧化二氮?dú)怏w行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- NB/T 11446-2023煤礦連采連充技術(shù)要求
- 任務(wù)13-1 火腿腸的加工
- 婚姻家庭編的女性權(quán)益保護(hù)研究
- T-ACEF 127-2024 火力發(fā)電廠高鹽廢水零排放工程應(yīng)用技術(shù)指南
- 手機(jī)綜合癥小品臺詞
- 銀行特殊人群服務(wù)方案
- 新生兒交接制度和流程
評論
0/150
提交評論