VRML基礎教程資料_第1頁
VRML基礎教程資料_第2頁
VRML基礎教程資料_第3頁
VRML基礎教程資料_第4頁
VRML基礎教程資料_第5頁
已閱讀5頁,還剩48頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

VRML基礎教程資料第一個虛擬境界#VRMLV2.0utf8這是VRML文件的標志,所有2.0版本的VRML文件都以這行文字開頭,VRML97是由VRML2.0版修訂而成的,符合VRML97規范的VRML文件也以這行文字開頭。其中“#”表示這是一個注釋。而utf8表示此文件采用的是utf8編碼方案,這在VRML標準中有詳細說明。1第一個虛擬境界Group節點加入一個Group節點(組節點):Group{組節點花括號之內的所有內容視為一個整體,利用組節點可以把虛擬場景組織成條理清晰的樹形分支結構。下面定義組節點的children域(孩子域):children[在children后的方括號內定義Group節點的所有孩子對象,第一個孩子是一個Shape節點(形態節點),它描述一個幾何形狀及其顏色等特征:Shape{在Shape節點內定義一個幾何體Box(方盒節點):geometryBox{}注意,我們沒有為Box定義任何域,這意味著它的尺寸和坐標位置等特性取缺省值(單位立方體)。隨后補齊每個右括號:}]}2第一個虛擬境界():#VRMLV2.0utf8Group{children[Shape{geometryBox{}}]}3第一個虛擬境界下面定義立方體的外觀,這只需改變Shape節點的appearance域(外觀),appearance域是一個Appearance節點,此Appearance節點的material域(材質)定義為一個Material節點:4第一個虛擬境界下面定義立方體的外觀,這只需改變Shape節點的appearance域(外觀),appearance域是一個Appearance節點,此Appearance節點的material域(材質)定義為一個Material節點:5第一個虛擬境界Shape{appearanceAppearance{materialMaterial{}}geometryBox{}}6第一個虛擬境界diffuseColor域(漫反射顏色)VRML的顏色說明采用RGB顏色模型,所以要定義紅色的立方體,漫反射顏色應該是{100},三個數字依次表示紅色、綠色和藍色,取值范圍都是0到1:materialMaterial{diffuseColor100}7第一個虛擬境界():#VRMLV2.0utf8Group{children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}8第一個虛擬境界():#VRMLV2.0utf8Group{children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}9第一個虛擬境界紅色的立方體位于屏幕的中心,它的中心坐標為{000}。移動位置可以外套一個Transform(變換節點)來實現:Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}10第一個虛擬境界在VRML中,Transform節點除了可以引進平移、旋轉和縮放變換以外,其作用和Group節點的作用一樣。把Transform節點的translation域(平移)設置為500,意味著Transform節點所在的坐標系相對于其上層坐標系向右平移(即x軸方向)5個單位,在其它兩個方向不移動,VRML的距離單位是米,5個單位相當于5米11第一個虛擬境界():#VRMLV2.0utf8Group{children[Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}]}12第一個虛擬境界接下來我們把方塊所在的Transform節點復制三份,并把各自包含的幾何形狀依次定義為方塊、球體和圓錐13第一個虛擬境界():#VRMLV2.0utf8Group{children[Transform{translation500children[Shape{geometryBox{}}]}Transform{translation000children[Shape{geometrySphere{}}]}Transform{translation-500children[Shape{geometryCone{}}]}]#endofGroupchildren}14第一個虛擬境界VRML文件中有許多括號(花括號“{}”和方括“[]”),請注意括號的配對,建議采用本教程的縮進風格。上述VRML文件中三個Transform節點的平移量是不同的,因而三個幾何體的位置也就不同。另外,還可以修改三個幾何體的顏色:球面Sphere為綠色(010),圓錐為藍色(010)。15第一個虛擬境界為了以后引用方便,分別給這三個Transform節點指定一個名稱:DEFboxTransform{...}DEFsphereTransform{...}DEFconeTransform{...}16第一個虛擬境界():#VRMLV2.0utf8Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}17增加交互能力上一節我們學習了用幾何體建立虛擬境界以及為幾何體賦予色彩和材質的方法,這樣建立的虛擬境界是靜態的。這一節我們將使一個幾何體(為了更具一般性,下面我們稱之為對象)能夠根據用戶動作做出反應,即交互能力,這是VRML2.0最突出的特征。18增加交互能力1、檢測器在VRML中,檢測器(Sensor)節點是交互能力的基礎。檢測器節點共九種。在場景圖中,檢測器節點一般是以其它節點的子節點的身份而存在的,它的父節點稱為可觸發節點,觸發條件和時機由檢測器節點類型確定。19增加交互能力接觸檢測器(TouchSensor)是最常用的檢測器之一最典型的應用例子是開關。其它檢測器將在后續章節中陸續介紹。這里我們定義一個開關節點lightSwitch(這是一個組節點),并定義一個接觸檢測器作為它的子節點:DEFlightSwitchGroup{children[各幾何造型子節點...DEFtouchSensorTouchSensor{}]}20增加交互能力這樣開關節點lightSwitch就是一個可觸發節點。當然,檢測器存在的理由是它被觸發時能夠引起某種變化,所以在更深入討論開關節點之前,我們先討論一下場景的變化。21增加交互能力2、視點最常見的變化是視點的變化,在我們的第一個境界中你可能已經體驗到視點變化:當你拖動鼠標或按動箭頭鍵時(按照VRML術語,稱為航行),虛擬境界就會旋轉或縮放,這實際上是在調整你的視點位置或視角。在虛擬場景的重要位置可以定義視點節點(ViewPoint),它們是境界作者給用戶推薦的最佳觀賞方位,在CosmoPlayer瀏覽器中,用戶就可以通過鼠標右鍵選擇作者推薦的各個視點。這里我們定義兩個視點節點:22增加交互能力這里我們定義兩個視點節點:DEFview1Viewpoint{position0020description"View1"}DEFview2Viewpoint{position5020description"view2"}23增加交互能力我們的目的是使用戶可以通過觸發開關節點來切換視點?,F在先研究一下這兩個視點節點,其中的坐標表示視點在場景中的位置,坐標的單位是米,這在前面已經提到過,視點的名稱將會在瀏覽器菜單中提示出來供用戶選擇。把上述視點說明加入helloworld5.wrl中(放在Group節點之前),并把其中的方塊節點修改成可觸發節點:24增加交互能力DEFboxTransform{children[Shape{....Box...}DEFtouchBoxTouchSensor{}]}把修改過的文件另存為“”。25增加交互能力3、事件傳遞把觸發(用鼠標箭頭按動方塊)和場景變化(視點切換)這兩件事情聯系起來,在場景圖中,除節點構成的層次體系外,還有一個“事件體系”,事件體系由相互通訊的節點組成。能夠接收事件的節點都應具有事件入口(eventIn),如果它要接收多種類型的事件(稱為入事件),它就應該具有多個事件入口,也就是說,事件入口象節點的域一樣是有類型的。同樣,發送事件的節點應有事件出口(eventOut),事件出口也是有類型的。例如ViewPoint節點就有一個事件入口set_bind,當向此事件送入一個值“TRUE”(即所謂的入事件)時,該viewpoint節點成為當前視點。又如,接觸檢測器TouchSensor有一個事件出口isActive,當受到用戶觸發后它就從此出口送出一個“TRUE”(即所謂的出事件),在下一個事件發送之前,此事件一直保存在事件出口中(作為記錄)。26增加交互能力3、事件傳遞事件出口和事件入口通過路徑相連,這就是VRML文件中除節點以外的另一基本組成部分:ROUTE語句。ROUTE語句把事件出口和事件入口聯系在一起,從而構成事件體系。在這里,我們把接觸檢測器touchBox的事件出口isActive連接到視點節點view2的事件入口set_bind:ROUTE好了!現在我們得到的VRML文件是():27增加交互能力#VRMLV2.0utf8DEFview1Viewpoint{position0020description"view1"}DEFview2Viewpoint{position5020description"view2"}Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}DEFtouchBoxTouchSensor{}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}ROUTE28增加交互能力把文件調入瀏覽器,然后把鼠標指向方塊并按下左鈕,可以看到視點已經變為view2,內部的機制我們已經很清楚:左鈕按下時方塊節點的接觸檢測器被觸發,接著接觸檢測器從事件出口isActive送出一個事件“TRUE”,這個事件通過路由進入視點節點view2的事件入口set_bind,view2收到“TRUE”后成為當前視點,所以在我們眼前的場景發生了變化。29增加交互能力現在松開左鈕,可以看到場景恢復到原來方位,這種功能稱為視點回跳,其原因是松開左鈕后接觸檢測器向view2發送了一個“FASLE”事件,這樣view2的當前視點地位被解除,原來的視點成為即當前視點,詳細說明可參考VRML標準中對視點節點的專門論述。如果我們不想視點回跳,就想停留在view2視點,那該怎么辦呢?這種非系統缺省功能要自己來定義。30利用腳本編寫自定義行為在VRML中,利用Script節點(腳本節點)定義用戶自定義行為,所謂定義就是用腳本描述語言(ScriptingLanguage)編寫腳本的過程。VRML97支持的腳本描述語言目前有兩種:Java和EMCAScript(這是JavaScript標準化后的名稱),關于這兩種語言本身,請參考相應的參考資料,VRML97標準中定義了它們和VRML的接口方法。應該注意的是:VRML是基于節點的語言,所以腳本也是封裝在Script這個特殊節點中的。這里我們不能過多地討論腳本描述語言的細節,主要討論把腳本集成到VRML文件中的方法。31利用腳本編寫自定義行為我們曾把接觸檢測器touchBox和視點view2直接通過路徑連接起來,現在要定義我們指定的行為,就需要在二者之間插入一個腳本節點,也就是讓路徑繞個彎:ROUTETO32利用腳本編寫自定義行為其中的腳本節點touchScript有一個事件人口touchBoxIsActive和一個事件出口bind_View2,前者接收來自接觸檢測器touchBox的事件,然后經自己的腳本處理后,把結果發送給視點節點view2:DEFtouchScriptScript{eventInSFBooltouchBoxIsActiveeventOutSFBoolbindView2url"javescript:functiontouchBoxIsActive(active){bindView2=TRUE;}"}33利用腳本編寫自定義行為關于這個Script節點,請注意以下幾點:(1)它的事件入口touchBoxIsActive和事件出口bindView2是自定義的,而其它VRML節點的域和事件都是固定的。(2)事件入口touchBoxIsActive和事件出口bindView2的類型都是SFBool(單值布爾型),touchBox的事件出口isActive和view2的事件入口set_bind的類型也是相同的。(3)“url”是腳本節點的一個域,可以直接包含腳本,也可以包含一個或多個用URL地址指示的腳本,若有多個地址,則按照先后次序獲取第一個可得到的腳本。(4)腳本是以函數(function)的形式給出的,函數名touchBoxIsActive與事件入口的名稱相同,這是和ECMAScript語言的接口約定,表示相應事件入口接收到事件后應調用此函數進行處理。34事件流程下面我們整理一下事件流程:(1)用戶在方塊上按下鼠標左鍵。(2)接觸檢測器發出一個“TRUE”事件。(3)此事件進入腳本節點touchScript的事件入口touchBoxIsActive.(4)調用腳本函數touchBoxIsActive(注意,腳本函數并沒有判斷入事件的值)。(5)函數向touchScript的事件出口bindView2發送一個“TRUE”事件(還可以進行其它判斷或執行其它事件)。(6)view2節點收到“TRUE”事件,成為當前視點。按照VRML約定,“認為”上述事件是同時發生的,也就是這些事件的時間戳相同。(7)若用戶松開鼠標左鍵,則接觸檢測器發出一個“FALSE”事件,此事件同樣引起腳本函數調用并發送“TRUE”事件,所以view2仍然保持為當前視點。本節的完整代碼是()35事件流程#VRMLV2.0utf8DEFview1Viewpoint{position0020description"view1"}DEFview2Viewpoint{position5020description"view2"}Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}DEFtouchBoxTouchSensor{}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}DEFtouchScriptScript{eventInSFBooltouchBoxIsActiveeventOutSFBoolbindView2url"javascript:functiontouchBoxIsActive(active){bindView2=TRUE;}"}ROUTETO36MAYA導入VRML

37MAYA導入VRML

38MAYA導入VRML

39MAYA導入VRML

40MAYA導入VRML打開VRMLPAD,打開導入的模型。41MAYA導入VRML打開VRMLPAD,打開導入的模型。手動進行調節模型42MAYA導入VRMLtranslation-5000

rotation0011.571、“translation”用于位置移動,此例中我們把物體沿-x軸方向移動50個單位。

2、“rotation”用于轉動物體。它的前三個參數定下一點,從原點到該點形成一個轉動軸,第四個參數表示沿該軸轉動的弧度數。此例表示把物體沿z軸轉動90度.43MAYA導入帶材質VRMLFortextures,bydefault,Mayauseabsolutepath(url"D:/Mesdocuments/")Forthemoment,Webseedonlyreadsrelativepath(url"./").OnesolutiontosolvetheproblemistoeditthepathinVrmlfile.IfVrmlandTexturesareatsamelevel,theurlis:url"./“IfVrmlisatrootandtexturesinafolder,theurlis:url"./Folder/“IfVrmlandtexturesareinindividualfoldersatsameleveltheurlis:url"../Folder/"44MAYA導入帶材質VRML實例中的草地圖片45Text節點T

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論