版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
虛擬現(xiàn)實技術(shù)一一VRML篇一、VRML介紹.什么是VRML?VRML是“VirtualRealityModelingLanguagev的縮寫形式,意思是“虛擬現(xiàn)實造型語言”。第一代Web是以HTML為核心的二維瀏覽技術(shù),受HTML語言的局限性,VRML之前的網(wǎng)頁只能是簡單的平面結(jié)構(gòu),而且實現(xiàn)環(huán)境與參與者的動態(tài)交互是非常煩瑣的。第二代Web是以VRML為核心的三維瀏覽技術(shù)。第二代Web把VRML與HTML、Java,媒體信息流等技術(shù)有機地結(jié)合起來,形成一種新的三維超媒體Web。VRML是用來描述三維物體及其行為的,可以構(gòu)建虛擬境界(VirturalWorld),可以集成文本、圖像、音響、MPEG影像等多種媒體類型,還可以內(nèi)嵌用Java、ECMAScript等語言編寫的程序代碼。以VRML為核心構(gòu)建的虛擬世界中用戶如身處真實世界,可以和虛擬物體交互,人們可以以習(xí)慣的自然方式訪問各種場所,在虛擬社區(qū)中“直接”交談和交往。事實上,目前采用VRML技術(shù)取得成功的案例已經(jīng)很多,例如探路者到達火星后的信息就是利用VR應(yīng)在因特網(wǎng)上即時發(fā)布的,網(wǎng)絡(luò)用戶可以以三維方式隨探路者探索火星。.VRML的工作原理VRML定義了一種把3D圖形和多媒體集成在一起的文件格式。從語法角度看,VRML文件是顯式地定義和組織起來的3D多媒體對象集合;從語義角度看,VRML文件描述的是基于時間的交互式3D多媒體信息的抽象功能行為。VRML文件描述的基于時間的3D空間稱為虛擬境界(VirtualWorld),簡稱境界,所包含的圖形對象和聽覺對象可通過多種機制動態(tài)修改。VRML文件可以包含對其他標(biāo)準(zhǔn)格式文件的引用。可以把JPEG、PNG和MPEG文件用于對象紋理映射,把WAV和MIDI文件用于在境界中播放的聲音。另外,還可以引用包含Java或ECMAScript代碼的文件,從而實現(xiàn)對象的編程行為。VRML使用場景圖(SceneGraph)數(shù)據(jù)結(jié)構(gòu)來建立3D實境,VRML的場景圖是一種代表所有3D世界靜態(tài)特征的節(jié)點等級:幾何關(guān)系、質(zhì)材、紋理、幾何轉(zhuǎn)換、光線、視點以及嵌套結(jié)構(gòu)。幾乎所有生產(chǎn)廠商,無論是CAD、建模、動畫、VR,還是VRML,他們的結(jié)構(gòu)核心都有場景圖。境界中的對象及其屬性用節(jié)點(Node)描述,節(jié)點按照一定規(guī)則構(gòu)成場景圖(SceneGraph),也就是說,場景圖是境界的內(nèi)部表示。場景圖中的第一類節(jié)點用于從視覺和聽覺角度表現(xiàn)對象,它們按照層次體系組織起來,反映了境界的空間結(jié)構(gòu)。另一類節(jié)點參與事件產(chǎn)生和路由機制,形成路由圖(RouteGraph),確定境界隨時間的推移如何動態(tài)變化。VRML文件的解釋、執(zhí)行和呈現(xiàn)通過瀏覽器實現(xiàn),這與利用瀏覽器顯示HTML文件的機制完全相同。瀏覽器把場景圖中的形態(tài)和聲音呈現(xiàn)給用戶,這種視聽覺呈現(xiàn)即所謂的虛擬世界(境界)o用戶通過瀏覽器獲得的視聽覺效果如同從某個特定方位體驗到的,境界中的這種位置和朝向稱為取景器(Viewer)。.VRML的應(yīng)用VRML在電子商務(wù)、教育、工程技術(shù)、建筑、娛樂、藝術(shù)等領(lǐng)域有廣泛的應(yīng)用。例如在教育上,VRML不僅僅是HTML功能更強的替代品,其潛在意義在于突破上述基于WWW的教學(xué)模型建立更自然、更真實的虛擬教育環(huán)境。在這種環(huán)境中g(shù)eometrySphere{})]}DEFconeTransform{translation-500children[Shape{appearanceAppearancematerialMaterial{diffuseColor001))geometryCone{})])]#endofGroupchildren}ROUTEtouchBox.isActiveTOview2.set_bind#傳遞把這個文件調(diào)入瀏覽器,然后把鼠標(biāo)指向方塊并按下左鈕(先別松開?。?,可以看到視點已經(jīng)變?yōu)関iew2,內(nèi)部的機制我們已經(jīng)很清楚:左鈕按下時方塊節(jié)點的接觸檢測器被觸發(fā),接著接觸檢測器從事件出口isActive送出一個事件“TRUE”,這個事件通過路由進入視點節(jié)點view2的事件入口set_bind,view2收到“TRUE”后成為當(dāng)前視點,所以在我們眼前場景發(fā)生了變化。當(dāng)松開鼠標(biāo)左鍵,又回到原來的視點,稱為視點回跳。因為松開鼠標(biāo)左鍵后,接觸傳感器向view2發(fā)送了“FALSE”事件,,這樣view2的當(dāng)前地位被解除。若不想回跳,則要自己來定義。.利用腳本編寫自定義行為在VRML中,利用Script節(jié)點(腳本節(jié)點)定義用戶自定義行為,所謂定義即用腳本描述語言(ScriptingLanguage)編寫腳本的過程。VRML97支持的腳本描述語言目前有兩種:Java和EMCAScript(這是JavaScript標(biāo)準(zhǔn)化后的名稱),關(guān)于這兩種語言本身,請參考相應(yīng)參考書,VRML97標(biāo)準(zhǔn)中定義了它們和VRML的接口方法。應(yīng)提請注意的是:VRML是基于節(jié)點的語言,所以腳本也是封裝在Script這個特殊節(jié)點中的。這里我們不過多討論腳本描述語言的細(xì)節(jié),主要討論把腳本集成到VRML文件中的方法。上面我們曾把接觸檢測器touchBox和視點view2直接通過路徑連接起來,現(xiàn)在要定義我們指定的行為,就需要在二者之間插入一個腳本節(jié)點,也就是讓路徑繞個彎:ROUTEtouchBox.isActiveTOtouchScript.touchBoxIsActiveROUTEtouchScript.bindView2TOview2.set_bind其中的腳本節(jié)點touchScript有一個事件人口touchBoxIsActive和一個事件出口bind_View2,前者接收來自接觸檢測器touchBox的事件,然后經(jīng)自己的腳本處理后,把結(jié)果發(fā)送給視點節(jié)點view2:DEFtouchScriptScript{eventinSFBooltouchBoxIsActive#入口eventOutSFBoolbindView2 #出口url,zjavescript: #腳本functiontouchBoxIsActive(active){ #與入口同名的函數(shù)被調(diào)用bindView2=TRUE; #返回到出口關(guān)于這個Script節(jié)點,請注意一下幾點:(1)它的事件入口touchBoxIsActive和事件出口bindView2是自定義的,其它VRML節(jié)點的域和事件都是固定的。(2)這里定義的事件入口touchBoxIsActive(即入事件)和事件出口bindView2(即出事件)的類型都是SFBool(單值布爾型),它們與touchBox的事件出口isActive和view2的事件入口set_bind的類型保持一致?!皍rl”是腳本節(jié)點的一個域,/以直接包含腳本,也可以包含一個或多個用URL地址指示的腳本,若有多個地址,則按照先后次序獲取第一個可得到的腳本。(4)腳本是以函數(shù)(function)的形式給出的,函數(shù)名touchBoxIsActive與事件入口的名稱相同,這是和ECMAScript語言的接口約定,表示相應(yīng)事件入口收到事件后調(diào)用此函數(shù)進行處理。5.事件流程與小結(jié)下面我們整理一下事件流程:(1)用戶在方塊上按下鼠標(biāo)左鍵。(2)接觸檢測器發(fā)出一個“TRUE”事件。(3)此事件進入腳本節(jié)點touchScript的事件入口touchBoxIsActive.(4)調(diào)用腳本函數(shù)touchBoxIsActive(注意函數(shù)并沒有判斷入事件的值)。(5)函數(shù)向touchScript的事件出口bindView2發(fā)送一個"TRUE”事件(還可以進行其它判斷或執(zhí)行其它事件)。(6)view2節(jié)點收到“TRUE”事件,成為當(dāng)前視點。按照VRML約定,“認(rèn)為”上述事件是同時發(fā)生的,也就是這些事件的時間戳相同。(7)若用戶松開鼠標(biāo)左鍵,則接觸檢測器發(fā)出一個"FALSE”事件,此事件同樣引起腳本函數(shù)調(diào)用并發(fā)送“TRUE”事件,所以view2仍然保持為當(dāng)前視點。本節(jié)的完整代碼是:#VRMLV2.0utf8DEFviewlViewpoint{position0020description〃viewl〃DEFview2Viewpoint{position5020description〃view2〃}Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100)}geometryBox{})DEFtouchBoxTouchSensor{}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010))geometrySphere{))])DEFconeTranform{transaltion-500children[Shape{appearanceAppearance{
materialMaterial{diffuseColor001))geometryCone{})]I#endofGroupchildrenDEFtouchScriptScript{eventinSFBooltouchBoxIsActiveeventOutSFBoolbindView2urlz/javascript:functiontouchBoxIsActive(active){bindView2=TRUE;}〃ROUTEtouchBox.isActiveTOtouchScript.touchBoxIsActiveROUTEtouchScript.bindView2TOview2.set_bind這里所建立的虛擬境界并不復(fù)雜,但涉及到了VRML2.0最基礎(chǔ)性的功能和概念:利用檢測器產(chǎn)生事件、利用路由傳遞事件以及利用腳本編寫自定義行為,掌握了這些內(nèi)容也就掌握了VRML2.0的核心。在后面的幾節(jié)中,我們將探索一些專題性的有趣功能,而本節(jié)是基礎(chǔ),因而必須透徹理解。(六)進一步的完善與修飾.鄰近傳感器當(dāng)用戶進入或離開鄰近檢測器所劃定的區(qū)域時就會觸發(fā)它。正如你在標(biāo)準(zhǔn)中可以查到的那樣,ProximitySensor節(jié)點定義為:ProximitySensor{exposedFieldSFVec3fcenter000exposedFieldSFVec3fsize000exposedFieldSFBoolenabledTRUEeventOutSFBoolisActiveeventOutSFVec3fpositionchangedeventOutSFRotationorientation_changedeventOutSFTimeenterTimeeventOutSFTimeexitTimeProximitySensor節(jié)點共有三個外露域(exposedField)和五個出事件(eventOut).出事件我們已經(jīng)熟悉,是節(jié)點狀態(tài)發(fā)生改變時用來通知其它節(jié)點的,這里的出事件isActive用于ProximitySensor通報自己已被激活。enterTime和exitTime通報用戶(代表用戶的用戶化身或指示器)進入和退出ProximitySensor檢測區(qū)的時刻。若用戶已在檢測器之內(nèi),則當(dāng)用戶的位置或方位發(fā)生變化時,送出positionchanged和orientationchanged出事件。這五個出事件聯(lián)合起來,就定義了鄰近檢測器的功能。外露域則集域(Field)、入事件(eventin)和出事件(eventOut)三者的功能于一身,也就是說,它既象域一樣描述了節(jié)點的當(dāng)前狀態(tài),又可以作為入事件由其它節(jié)點修改這種狀態(tài),并作為出事件把這種改變通知其它節(jié)點。這里的enabled外露域是布爾型的,用于ProximitySensor的啟用和停用,center和size定義形為長方體的鄰近檢測區(qū)。我們要在方塊、球體和圓柱這三個物體構(gòu)成的靜態(tài)世界,現(xiàn)在在球體周圍增加一個鄰近檢測區(qū):DEFsphereTransform{translation000children[ShapeDEFcomeCloseProximitySensor{center000size444}])ProximitySensor的名字為comeCloser,鄰近區(qū)的中心和球體的球心重合,形狀為正方體,邊長為4米,是球體直徑的兩倍。當(dāng)用戶走進球體時就會觸發(fā)這個鄰近檢測器,檢測器發(fā)出isActive事件,我們把這個事件出口通過路由指向Script節(jié)點(用來綁定視點2):DEFcomeCloserScriptScript{eventinSFBoolenterProximitySensorlsActiveeventOutSFBoolbindView2url〃javascript:functionenterProximitySensorlsActive(active){bindView2=TRUE;}〃)隨后,我們在鄰近檢測器的出事件isActive和腳本節(jié)點comeCloserScript的入事件enterProximitySensorlsActive之間建立路由,后者收到事件后執(zhí)行函數(shù)enterProximitySensroIsActive,函數(shù)發(fā)出bindView2出事件,這個出事件通過路由連接到視點節(jié)點View2:ROUTE comeCloser.isActive TOcomeCloserScript.enterProximitySensorlsActiveROUTEcomeCloserScript.bindView2TOview2.setbind也就是說,一旦用戶進入鄰近區(qū),境界的當(dāng)前視點麻轉(zhuǎn)換成View2.這個由兩個視點、三個物體、一個鄰近檢測器和一個腳本節(jié)點組成的境界的完整代碼如下:#VRMLV2.0utf8DEFviewlViewpoint{position0020description〃viewl〃)DEFview2Viewpoint{position0020description〃view2〃)Group{children[DEFboxTransform{translation500children_Shape{appearanceAppearance{materialMaterial{diffuseColor100)}geometryBox{}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010))geometrySphere{}}DEFcomeCloserProximitrySensor{center000size444DEFconeTransform{translation-500children_Shape{appearanceAppearance{materialMaterial{diffuseColor001)}geometryCone{}]#endofGroupchildrenDEFcomeCloserScriptScript{eventinSFBoolenterProximitySensorlsActiveeventOutSFBoolbindView2urljavascript:functionenterProximitySensorlsActive(active){bindView2=TRUE;ROUTE comeCloser.isActive TOcomeCloserScript.enterProximitySensorlsActiveROUTEcomeCloserScript.bindView2TOview2.set_bind啟動VRML瀏覽器進入境界,面向球體一直走過去,當(dāng)你剛剛感到靠近球體時,會突然感到自己后退了一大步(或者說物體跳到前方更遠的地方),這表明鄰近檢測器已經(jīng)檢測到你的靠近,它把這件事通知腳本節(jié)點,腳本節(jié)點把視點View2綁定成當(dāng)前視點,從而使你感到視點突然改變。再稍稍修改一下鄰近檢測器,把它的中心位置向右移了2米:DEFcomeCloserProximitySensor{center200size444}這樣你就可以從左邊(方塊那一邊)走進球體(視點不跳),但不能從右邊(圓錐那一邊)走近它(視點跳轉(zhuǎn))??傊?,ProximitySensor能夠檢測用戶是否進入或離開檢測器指定的空間區(qū)域,典型用法是當(dāng)用戶走進房間時開啟燈光,當(dāng)用戶離開時關(guān)閉燈光,從而建立功能豐富的“智能”空間。.連續(xù)動畫我們已經(jīng)使用過接觸檢測器,當(dāng)我們把鼠標(biāo)指針放到方塊(這個幾何節(jié)點包含接觸檢測器)上面時,指針形狀發(fā)生變化,這意味著我們已經(jīng)進入檢測區(qū),如果按下鼠標(biāo)左鈕,則按照我們的定義,當(dāng)前視點會發(fā)生變化。這一節(jié)仍然制作這樣一個對接觸有反應(yīng)的方塊,只是接觸后它會連續(xù)不斷地轉(zhuǎn)動,動畫行為可以用時間檢測器(TimeSensor)驅(qū)動,而不斷變化的旋轉(zhuǎn)值可用腳本節(jié)點或朝向插補器(orientationinterpolator)給出。⑴接觸傳感器作為開始的基本代碼是:#VRMLV2.0utf8DEFcubeTransform{rotation1110children[Shape{appearanceAppearance{materialMaterial{diffuseColor100geometryBox{}}DEFTouchSTouchSensor{}DEFrevolverScript{eventinSFBoolstartRevolvingeventOutSFRotationrevolvefieldSFFloatangle0url,zjavascript:functionstartRevolving(){revolve[0]=l;revolve[1]=1;revolve[2]=1;revolve[3]=angle;angle+=0.1;}〃}ROUTETouchS.isOverTOrevolver.startRevolvingROUTErevolver.revolveTOcube.set_rotation其中,方塊cube包含兩個子節(jié)點,前者定義了它的形態(tài)(紅色的單位立方體),后者把它定義成接觸檢測器。注意,cube的類型是Transform節(jié)點,它的rotation域是外露域,指定本組相對于上層坐標(biāo)系的旋轉(zhuǎn)值,這里指定的初始值是"1110”,其中前三個數(shù)值定義旋轉(zhuǎn)軸,最后一個值定義旋轉(zhuǎn)角。由于它是外露域,因而可以通過入事件(名為set.rotation)進行修改,下面定義的動態(tài)行為就是這樣實現(xiàn)的。Script節(jié)點revolver的核心是內(nèi)聯(lián)的ECMAScript腳本函數(shù)。它給定一個不斷變化的旋轉(zhuǎn)值。當(dāng)鼠標(biāo)指針移動到方塊之上時,接觸檢測器發(fā)出isOver,和第一節(jié)中采用的isActive事件不同,isOver不需鼠標(biāo)左鈕按下時即可發(fā)出。isOver事件通過路由傳遞給腳本節(jié)點的事件入口startRevolving,從而啟動函數(shù)startRevolving,函數(shù)將一個新的旋轉(zhuǎn)值發(fā)往事件出口revolve,這個旋轉(zhuǎn)值通過路由進入cube的外露域rotation,修改了方塊的旋轉(zhuǎn)角,引起它的朝向變化。鼠標(biāo)指針在cube上面的每次方位變化都引起isOver事件發(fā)送一次,從而導(dǎo)致方塊旋轉(zhuǎn)一次。⑵時間傳感器為了使方塊能夠連續(xù)旋轉(zhuǎn),需要引進等間隔連續(xù)發(fā)送的時間序列,這正是時間檢測器的用武之地。時間檢測器隨著時間推移不斷產(chǎn)生事件,可用于多種目的,包括:a.驅(qū)動連續(xù)性的仿真和動畫b.控制周期性的活動(如每分鐘一次)c.初始化單獨事件,如報警鐘下面是我們要用的時間檢測器和修改后的路由關(guān)系:DEFtickerTimeSensor{clelnterval0.1loopTRUEenabledFALSE)ROUTETouchS.isOverTOticker.set_enabledROUTEticker.cycleTimeTOrevolver.startRevolvingROUTErevolver.revolveTOcube.set_rotationenabled用于啟用和停用時間檢測器,開始時它處于停用狀態(tài),以后由接觸檢測器的isOver事件修改這一狀態(tài)。啟用的時間檢測器每隔0.1秒送出一個cycleTime事件,并用它來觸發(fā)revolver的startRevolving事件,注意,cycleTime事件的類型為SFTime,而路由兩端事件的類型必須匹配,所以盡管這里我們不關(guān)心這個事件表示的具體時刻,還是把revolver的startRevolving事件類型也改為SFTime.這樣,revolver的函數(shù)startRevolving。就會每0.1秒調(diào)用一次,從而驅(qū)動方塊連續(xù)旋轉(zhuǎn)。完整的代碼是:#VRMLV2.0utf8DEFcubeTransform{rotation1110children[Shape{appearanceAppearance{materialMaterial{diffuseColor100})geoemtryBox{})DEFTouchSTouchSensor{}])DEFrevolverScript{eventinSFTimestartRevolvingeventOutSFRotationrevolvefieldSFFloatangle0url^vrmlscript:functionstartRevolving(){revolve[0]=l;revolve[l]=l;revolve⑵=1;revolve[3]=angle;angle+=0.1;DEFtickerTimeSensor{cyclelnterval0.1loopTRUEenabledFALSE)ROUTETouchS.isOverTOticker.set_enabledROUTEticker.cycleTimeTOrevolver.startRevolvingROUTErevolver.revolveTOcube.set_rotation上述腳本節(jié)點的功能比較簡單,只是不斷送出調(diào)整的旋轉(zhuǎn)值,它是關(guān)鍵幀動畫的一種。由于關(guān)鍵幀動畫十分常用,故VRML專門定義了插補器節(jié)點來實現(xiàn)它。⑶方位插值器插補器節(jié)點可認(rèn)為是VRML內(nèi)置的腳本節(jié)點,它們執(zhí)行簡單的動態(tài)計算,通常和時間檢測器或者能夠使對象產(chǎn)生動作的節(jié)點結(jié)合在一起使用,生成線性關(guān)鍵幀動畫。插補器節(jié)點實際上是一個由關(guān)鍵點和對應(yīng)關(guān)鍵值定義的分段線形函數(shù)。根據(jù)插值類型的不同,VRML共定義六個插補器節(jié)點:Colorinterpolator(顏色插補器)、Coordinatelnterpolator(坐標(biāo)插補器)、Normallnterpolator(法線插補器)、Orientationinterpolator(朝向插補器)、positioninterpolator(位置插補器)、Scalarinterpolator(標(biāo)量插補器)。所有插補器的域和事件都是類似的:eventinSFFloatset_fructionexposedFieldMFFloatkey[...]exposedFieldMF[type]keyValue[ ]eventOut[S|M]F[type]keyValue_changed關(guān)鍵值域keyValue的類型決定了插補器的類型(例如,Orientationinterpolator的keyValue域的類型是MFFloat),入事件set_fraction接收SFFloat型的事件,插補器隨即根據(jù)它進行插值,并通過出事件value_changed送出插值結(jié)果。這里我們把時間檢測器的fraction_changed事件作為插補器的輸入,這個事件是一個[0,1]區(qū)間的值,每個時間步都送出一次,表示當(dāng)前周期內(nèi)已過去的時間相對于整個周期的比例,是插補器常用的輸入源之一。與此對應(yīng),我們把插補器關(guān)鍵幀的取值也定義在[0,1]范圍內(nèi)。與0和1這兩個關(guān)鍵幀對應(yīng)的關(guān)鍵值的旋轉(zhuǎn)軸是相同的,只是旋轉(zhuǎn)角度不同(0,3.14159),這樣方位插補器輸出的旋轉(zhuǎn)值的旋轉(zhuǎn)軸固定不變,旋轉(zhuǎn)角從0遞增到3.14159,然后不斷重復(fù)。#VRMLV2.0utf8DEFcubeTransform{rotation1110children[Shape{appearanceAppearance{materialMaterial{diffuseColor010學(xué)生可以以瀏覽探索的方式汲取知識,如進入虛擬太空學(xué)習(xí)天文知識,利用虛擬地球?qū)W習(xí)地理知識,穿過歷史長廊與歷史人物交流,進入分子世界游歷化學(xué)殿堂等等,這些曾經(jīng)是夢想中的學(xué)習(xí)方式都可以逐步實現(xiàn)。在這個虛擬教育世界中,甚至可以有利用VRML制作的動畫人物扮演教師,其面部表情和形體動作利用動作跟蹤系統(tǒng)捕捉下來,這樣得到的講課節(jié)目將是三維的。如果把這種方式擴大到教學(xué)雙方,則可實現(xiàn)具有實時交互性的虛擬教學(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ù)的研究和實現(xiàn)工作。人性動畫工作組(HumanoidAnimationWG)利用VRML表現(xiàn)人類行為特性。色彩保真工作組(ColorFidelityWG)確保采用任何平臺的觀眾所看到的效果都和創(chuàng)作者的原始作品一樣,顏色應(yīng)相當(dāng)一致。元形式工作組(MetaFormsWG)針對利用形式文法生成的作品,提出一般性的方法論和一般性規(guī)范,使之能夠映射為某種特定形式。首要目標(biāo)是能夠表示〃數(shù)字生命格式〃(DigitalLife-Forms)結(jié)構(gòu)和增長。面向?qū)ο髷U展工作組(Object-OrientedExtensionsWG)探討和推動對VRML進行面向?qū)ο髷U展的方法。數(shù)據(jù)庫工作組(DatabaseWG)推進基于VRML商業(yè)應(yīng)用的創(chuàng)建,利用數(shù)據(jù)庫維護VRML內(nèi)容的持久性、升級能力和安全傳輸能力。外部創(chuàng)作接口工作組(ExternalAuthoringInterfaceWG)在VRML境界和外部環(huán)境之間建立標(biāo)準(zhǔn)接口。界面組件工作組(WidgetsWG)為開發(fā)者和用戶提供一套基礎(chǔ)性的、可自由使用的標(biāo)準(zhǔn)用戶界面組件集,并提供支持基本組件集和所有VRML組件的理論框架。二進制壓縮格式工作組(CompressedBinaryFormatWG)探討并開發(fā)VRML文件的二進制編碼方法,重點是研究為了快速傳送目的而盡量縮小文件尺寸,同時為了快速解碼B的而盡量簡化文件結(jié)構(gòu)。通用媒體庫工作組(UniversalMediaLibrariesWG)為了提高VRML境界的真實感,同時減少網(wǎng)絡(luò)的下載量,而定義一種由駐留本地的媒體元件(紋理、聲音和VRML對象)組成的小型跨平臺媒體庫。同時定義一種統(tǒng)一機制,通過這種機制,VRML內(nèi)容創(chuàng)作者可以在自己的境界中使用這些媒體元件。活動境界工作組(LivingWorldsWG)為多用戶(包括多個開發(fā)者)應(yīng)用的產(chǎn)生和進化定義概念框架,并確定一組界面。鍵盤輸入工作組(KeyboardInputWG)為了使內(nèi)容創(chuàng)作者能夠在自己的境界中訪問鍵盤輸入,定義一個或多個擴充節(jié)點。一致性工作組(ConformanceWG)為與一致性測試有關(guān)的問題提供一個討論場所,特別地,本組將辨別VRML實現(xiàn)發(fā)生分歧的地方以及相應(yīng)的動作序列。生物圈工作組(BiotaWG)為生命系統(tǒng)(LivingSystem)的研究和學(xué)習(xí)建立、配備數(shù)字式工具和環(huán)境。分布式交互仿真工作組(DistributedInteractiveSimulationWG)為建立有多廣播能力(Mu11icast-Capab1e)的大規(guī)模虛擬環(huán)境(Large-ScaleVirtualEnvironments,LSVEs)確立初始網(wǎng)絡(luò)約定。VRML腳本工作組(VRMLScriptWG)向VRML監(jiān)查組(VRMLReviewBoard,VRB)geometryBox{}}DEFTouchSTouchSensor{}DEFrevolverOrientationinterpolator{key[0,1]keyValue[0.50.50.50,0.50.50.53.14159])DEFtickerTimeSensor{cyclelnterval2loopTRUEenabledFALSE)ROUTETouchS.isOverTOticker.set_enabledROUTEticker.fraction_changedTOrevolver.set_fractionROUTErevolver.value_changedTOcube.set_rotation小結(jié):本節(jié)實現(xiàn)連續(xù)動向,動畫由接觸檢測器記動,由時間檢測器驅(qū)動,動畫本身比較簡單,就是不斷地旋轉(zhuǎn)。產(chǎn)生不斷變化的旋轉(zhuǎn)值的方法有兩種:自己編寫腳本,或者利用插補器節(jié)點。3.動態(tài)修改場景圖場景圖是描述境界結(jié)構(gòu)的基本概念,節(jié)點是構(gòu)成場景圖的基本單元。組節(jié)點是能夠包含子節(jié)點的節(jié)點,組節(jié)點本身還可作為其他組節(jié)點的子節(jié)點,從而形成層次性體系結(jié)構(gòu)。VRML中的組節(jié)點包含Anchor(錨)、Billboard(布告牌)、Collision(碰撞)、(Group)(組)、Inline(內(nèi)聯(lián))、LOD(細(xì)節(jié)層次)、Switch(開關(guān))、Transform(變換)共8種,除Inline.LOD、Switch這幾個具有特殊功能外,它們都定義了人事件addChild和removeChildren,前者用于向組節(jié)點的子節(jié)點域children中增加新的子節(jié)點,后備用于從中刪除子節(jié)點,這樣就可以動態(tài)修改場景圖的結(jié)構(gòu)。下面是我們這一節(jié)要建立的境界,開始的時候球體位于左邊紅色方塊的內(nèi)部,在按動底部的綠色方塊后,球體進人右邊藍包入塊之內(nèi)。#VRMLV2.0utf8Viewpoint{position0015}DEFleftBoxTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100})geometryBox{}DEFrightBoxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}geometryBox{}DEFonoffTransform{translation0-50children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}geometryBox{}其中,左邊的方塊為紅色,右邊的方塊為藍色,下邊的方塊為綠色,都是Transform類型,三者都位于場景圖的最高層,都是場景圖的根節(jié)點,都包含一個Box幾何體作為子節(jié)點。下面為紅方塊增加一個球體子節(jié)點:DEFleftBoxTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}DEFSphereChildShape{appearanceAppearance{materialMaterial{diffuseColor101})geometrySphere{radius1.2}為了以后引用方便,這里為球體子節(jié)點起了名字:SphereChildo為了讓用戶能夠增刪這個兒子,把綠方塊定義成接觸傳感器:DEFonoffTransform{translation0-50children[Shape{appearanceAppearance{materialMaterial{diffuseColor010})geometryBox{}}DEFTSTouchSensor{}])子節(jié)點增刪的具體任務(wù)由Script節(jié)點來完成:DEFSScript{eventinSFBoolisActiveeventOutMFNodechildfieldMFNodetestNodeUSESphereChildurl“javascript:functionisActive(value){if(value)chiId=testNode;}”)請注意,它的出事件child的類型是MFNode,也就是說,通過這個事件送出的是節(jié)點。節(jié)點S的testNode域是對球體SphereChild引用(USE語句),引用不復(fù)制該節(jié)點,而是把同一節(jié)點再次插入場景圖,從而導(dǎo)致SphereChild擁有多個父親,所以場景圖儀僅是層次結(jié)構(gòu),而不是樹形結(jié)構(gòu)。加上下面的路由語句,建立事件聯(lián)系:ROUTETS.isActiveTOS.isActiveROUTES.childTOleftBox.removeChiIdrenROUTES.childTOrightBox.addChiIdren接觸傳感器TS的激活事件isActive鏈接到腳本節(jié)點S的isActive,這樣用戶一旦按動綠方塊,就會啟動腳本節(jié)點的事件處理函數(shù)isActive。,此函數(shù)把testNode節(jié)點(即球體節(jié)點SphereChild)送至出事件S.child。根據(jù)路由,左邊紅方塊的事件人口leftBox.removeChildren收到此事件,按照removeChildren的語義,球體節(jié)點SphereChild從leftBox的子節(jié)點列表中刪除。與此同時,右邊藍方塊的事件入口rightBox.addChiIdren也收到S.child出事件,根據(jù)addChildren的語義,球體節(jié)點SphereChild加入rightBox的子節(jié)點列表。通過這個過程,球體節(jié)點SphereChild的父節(jié)點從leftBox更換成rightBoxo4.擴充節(jié)點類型VRML提供了54種節(jié)點類型,稱為內(nèi)部節(jié)點類型。然而實際應(yīng)用中可能要求新的節(jié)點類型,原型(prototype)是VRML實現(xiàn)節(jié)點類型擴充的基本機制。新節(jié)點類型是根據(jù)已定義的(內(nèi)部的或原型的)節(jié)點類型定義的,一旦定義,原型節(jié)點類型就可以像內(nèi)部節(jié)點類型一樣在場景圖中實例化。原型可以在當(dāng)前文件中定義并使用,也可以在其他文件中定義,即外部原型。外部原型提供了一種使節(jié)點類型能夠跨越網(wǎng)絡(luò)的機制。本節(jié)的原型例子取自VRML97標(biāo)準(zhǔn),它定義的是一個桌子類型,這個原型為:#VRMLV2.0utf8PROTOTwoColorTable[fieldSFColorlegColor0.80.40.7fieldSFColortopColor0.60.60.1](Transform{Children{Transform{#桌面translation0.00.60.0children_Shape{appearanceAppearance{materialMaterial{diffuseColorIStopColor})geometryBox{size1.20.21.2})]}Transform{translation-0.50-0.5children[DEFLegShape{appearanceAppearance{materialMaterial{diffuseColorISlegColor)geometryCylinder{height1radius0.1)Transform{#另一條桌腿translation0.50-0.5childrenUSELeg}Transform{#另一條桌腿translation-0.500.5childrenUSELeg)Transform{#另一條桌腿translation0.500.5childrenUSELeg)]#根節(jié)點Transform的兒子結(jié)束}#根節(jié)點Transform結(jié)束}#原型結(jié)束原型語句PROTO分為原型接口聲明和原型定義兩部分。接口聲明包括原型的入事件和出事件的類型和名稱,以及原型的域的類型、名稱和缺省值。這里的接口聲明為:PROTOTwoColorTable[fieldSFColorlegColor0.80.40.7fieldSFColortopColor0.60.60.1]這個原型的類型名稱為“TwoColorTable”(雙色桌),它有兩個域;legColor(桌腿色)和topColor(桌面色)。作為節(jié)點類型,TwoColorTable的用法和其他內(nèi)部節(jié)點類型一樣。接口聲明之后是原型的主體,稱為原型定義。原型定義實際上是一個場景圖,由一個或多個根節(jié)點、嵌入的PROTO語句和ROUTE語句構(gòu)成,其中的第一個節(jié)點類型確定原型實例在VRML文件中的使用方法。例如,如果原型定義中的第一個節(jié)點是Material節(jié)點,則只要可以使用Material節(jié)點的地方,原型實例都可以使用。原型定義中定義的其他節(jié)點及其附帶的場景圖都不進入原型實例所在的變換層系,但可以被原型定義中的ROUTE語句或Script節(jié)點引用。TwoColorTable原型中的第一個節(jié)點是Transform組節(jié)點,它決定了TwoColorTable型節(jié)點在場景圖中的方法,在場景圖中添加一個TwoColorTable型節(jié)點.相當(dāng)于增加Transformo原型定義中節(jié)點的域、人事件、出事件可以通過IS語句和接口聲明中的域、入事件、出事件建立關(guān)聯(lián),關(guān)聯(lián)實際上相當(dāng)于把原型定義中的這些域和事件公開作為原型的域和事件。關(guān)聯(lián)的基本規(guī)則是域和域、入事件和入事件、出事件和出事件對應(yīng)關(guān)聯(lián),原型定義中的外露域可以和接口聲明中的域、入事件、出事件或外露城關(guān)聯(lián)。本例中的關(guān)聯(lián)有兩個:桌面diffuseColor域和接口聲明中的topColor域,桌腿的diffuseColor域和接口聲明中的legColor域之間。也就是說,TwoColorTable型節(jié)點中的topColor和legColor值實際上分別確定了桌面和桌腿的漫反射色diffuseColoro提供有關(guān)Java和JavaScript的問題列表、修改建議和評論。自然語言處理和動畫工作組(NLP&AnimationsWG)為了使用戶能使用自然語言和VRML動畫形象進行交流,從而使交互更自然,增強用戶和動畫形象之間的信息流動,研究如何使用“問題/回答"、“命令/響應(yīng)”式的對話以及基于操作系統(tǒng)命令和字符控制的自然語言。VRML-DHTML集成工作組(VRML-DHTMLIntegrationWG)為VRML和DHTML在文檔對象模型、組件(Component)接口和繪制等三個層次的緊密集成開發(fā)一種概念模型。6.研究現(xiàn)狀VRML97發(fā)布后,互聯(lián)網(wǎng)上的3D圖形兒乎都使用了VRML。由于技術(shù)的局限性,如帶寬不夠,需要下栽插件瀏覽,文件量大,真實感、交互性需要進一步加強等原因,最近一二年,許多制作Web3D圖形的軟件公司的產(chǎn)品,并沒有完全遵循VRML97標(biāo)準(zhǔn),而是使用了專用的文件格式和瀏覽器插件,開發(fā)了比較實用的VR軟件。這些軟件有些比VRML有了進步,在渲染速度、圖像質(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)的擴展節(jié)點功能(X3D),使3D的效果,交互性能更加完美;支持MPEG,Mov、Avi等視頻文件,Rm等流媒體文件,Wav、Midi.Mp3、Aiff等多種音頻文件,F(xiàn)lash動畫文件,多種材質(zhì)效果,支持Nurbs曲線,粒子效果,霧化效果;支持多人的交互環(huán)境,VR眼鏡等硬件設(shè)備;在娛樂、電子商務(wù)等領(lǐng)域都有成功的應(yīng)用,并各自為適應(yīng)X3D的發(fā)展,以X3D為核心,有Blaxxim3D等相關(guān)產(chǎn)品。在虛擬場景,尤其是大場景的應(yīng)用方面,以VRML標(biāo)準(zhǔn)為核心的技術(shù)具有獨特的優(yōu)勢。二、初識VRML(一)VRML的文件結(jié)構(gòu).文件頭VRML2.0(VRML97)開頭如下:#VRMLV2.0utf8VRML是大小寫敏感的,utf8是指一種純文本編碼方式.場景圖(SceneGraph)由描述“對象及其屬性”的節(jié)點組成,節(jié)點是VRML的基本單元,場景圖的第一類節(jié)點用于從視覺和聽覺角度表現(xiàn)對象,它們是按照層次體系結(jié)構(gòu)組織的;另一類節(jié)點,則參與事件產(chǎn)生和路由機制。.原型(Prototype)用戶可以通過原型擴充VRML的節(jié)點類型集。原型的定義可以包含在使用該原型的文件中,也可以在外部定義。.事件路由(Route)有些VRML節(jié)點能通過產(chǎn)生事件響應(yīng)環(huán)境變化或用戶交互。事件一旦產(chǎn)生,就按時間順序向路由目標(biāo)節(jié)點發(fā)送。目標(biāo)節(jié)點接收后進行相應(yīng)處理,可改變節(jié)點狀態(tài),產(chǎn)生其他事件,或者修改場景圖的結(jié)構(gòu)。利用腳本節(jié)點Script,作者可以Java或JavaScript語言自定義任意事件處理。(二)VRKL節(jié)點和數(shù)據(jù)類型虛擬場景由對象構(gòu)成,對象及其屬性用節(jié)點(Node)描述,節(jié)點是構(gòu)成VRML文件的基本單元。VRML97定義了54種基本節(jié)點類型(內(nèi)部節(jié)點類型),用戶也可以通過原型機制定義自己的節(jié)點類型。節(jié)點由域和事件組成:.域(field)描述了節(jié)點的當(dāng)前狀態(tài)。其中外露域(exposedField)是域和事件的統(tǒng)一體,它既作為域描述節(jié)點,又隱含著形如“set_域名”的入事件和“域名.changed”的出事件。.事件(event)分為入事件和出事件,入事件將導(dǎo)致節(jié)點狀態(tài)的改變;出事件向外報告自身狀態(tài)的變化。(三)VRML瀏覽器BlaxxunContact3DCosmoPlayerVisvape等MicrosoftVRML2.0Viewer(四)編寫VRML境界L制作第一個虛擬境界#VRMLV2.0utf8Group{children[Shape{geometryBox{})])將它保存為SimpleWorld.wrl文件,則可以用瀏覽器看到它。.定義外觀 第二場景再定義立方體的外觀,即改變Shape節(jié)點的appearance域(外觀),appearance域是——個節(jié)點,止匕節(jié)點的material域定義為——個Material節(jié)點:則Shape節(jié)點變成了:Shape{appearanceAppearance{materialMaterial{}}geometryBox{})修改它的diffuseColor域(漫射色),應(yīng)該是{100},3個數(shù)字分別表示紅色、綠色和藍色,取值范圍是0到1:materialMaterial{diffuseColor100}這樣,生成了第二個場景文件:#VRMLV2.0utf8Group{children[Shape{appearanceAppearance{materialMaterial{diffuseColor100})geometryBox{}]).定義變換一一第三個場景若想移動這個紅色的立方體,可以通過為它外套一個Transform節(jié)點來實現(xiàn):Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100})geometryBox{})]}Transform節(jié)點的translation500表示x軸向上右移5個單位(米)則第三個場景完整代碼如下:#VRMLV2.0utf8Group{children[Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100)4.復(fù)制節(jié)點一一第四個場景復(fù)制節(jié)點,并將各自的幾何形狀定義為方塊、球體和圓椎Group{children[Transform{translation500children[Shape{...geometryBox{})Transform{translation000children[Shape{...geometrySphere{})])Transform{translation-500children[Shape{???geometryCone{})]#endofGroupchildren}為了以后引用方便,分別給這3個Transform節(jié)點指定一個名稱:DEFboxTransform{...}DEFSphereTransform{...}DEFconeTransform{...}則第四個場景的完整代碼是:#VRMLV2.0utf8Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseC
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 理事會消防制度規(guī)范要求
- 醫(yī)院樓道值班制度規(guī)范
- 規(guī)范性文件備案工作制度
- 臨沂合同管理制度規(guī)范
- 學(xué)校黨史展館制度規(guī)范
- 三項制度調(diào)查取證規(guī)范
- 初中規(guī)范招生管理制度
- 單位規(guī)范服務(wù)管理制度
- 出門請假制度規(guī)范標(biāo)準(zhǔn)
- 丙酮進貨查驗制度規(guī)范
- 前庭性偏頭痛(修訂版)課件
- 電子信息工程專業(yè)專業(yè)介紹課件
- (37)-24.1.4黃芪中藥中醫(yī)學(xué)課件
- 高中生物競賽課件:蛋白質(zhì)的性質(zhì)與分離、分析技術(shù)
- 刑法學(xué)(上冊)馬工程課件 第1章 刑法概說
- 《紅樓夢中的禮儀習(xí)俗研究報告》
- GB/T 1041-2008塑料壓縮性能的測定
- CB/T 3046-1992船用充放電板
- 教師心理健康輔導(dǎo)講座二
- 全國計算機等級考試三級網(wǎng)絡(luò)技術(shù)歷年真題版
- 申論答題卡word模板
評論
0/150
提交評論