Presentation is loading. Please wait.

Presentation is loading. Please wait.

致遠管理學院資訊管理學系 授課老師:謝慧民 九十三學年度第一學期

Similar presentations


Presentation on theme: "致遠管理學院資訊管理學系 授課老師:謝慧民 九十三學年度第一學期"— Presentation transcript:

1 致遠管理學院資訊管理學系 授課老師:謝慧民 九十三學年度第一學期
VRML虛擬實境網頁語言知城數位 第三章 VRML的檔案架構 致遠管理學院資訊管理學系 授課老師:謝慧民 九十三學年度第一學期

2 VRML檔案的概述 VRML的檔案就和大部分程式語言的檔案相同,是個文字敘述(textual description)的檔案。所以可以使用任何的文字編輯器來撰寫VRML,只要存檔時,存成file.wrl即可。而".wrl"通常讀成"dot world",由副檔名可以感受到VRML的目的就是去建造一個世界(world)。

3 圖3-1

4 VRML檔案的概述 這個範例是一個很典型的VRML程式,包含檔案標頭、註解、節點、欄位等,透過瀏覽器我們將可以看見程式執行的結果如圖3-1。將在下列各節對這些構成VRML檔案的基本項目做更詳細的說明與介紹。

5 VRML的檔案標頭 範例3-1的第一行 這就是VRML的檔案標頭,在任何VRML程式的第一行一定要寫上這個標頭。
#VRMLV2.0utf8 這就是VRML的檔案標頭,在任何VRML程式的第一行一定要寫上這個標頭。 VRML的檔案標頭對這個檔案有以下的描述: 它是個VRML的檔案。 它是使用VRML2.0版的規格來完成。 檔案是使用國際UTF-8的字元集合。

6 VRML的檔案標頭 在很多語言中,UTF-8字元集合是一個標準的字元集合,包含英文。它使得VRML能夠支援英文字元,例如:A到Z。只要是能在鍵盤上找到的字元,UTF-8字元集合都包含在內,所以能鍵入任何ASCII碼在一個UTF-8的VRML檔案中。

7 UTF-8字元集合小常識 UTF的是UCS Transform Format的所寫,而UCS是Universal Multiple-Octet Coded Character Set。UTF8是由ISO ( International Organization for Standards)的規範《ISO/IEC :1993)所提出。

8 VRML的檔案註解 我們看到範例3-1的第二行 #Drawthecolumn
它可以幫助程式設計師紀錄本段程式的意義,以便日後修正。 它可以幫助程式設計師除錯(debug)時,先將部分程式轉成註解。 它可以幫助非此程式設計者閱讀此程式時,了解程式的目的。 在VRML的程式中,註解的使用方式就是在每行程式的開頭加上"#","#"之後該行的文字便失去了程式執行的功能,變成註解。

9 節點 Node在本書中翻譯成節點。節點(Node)是VRML檔案中最基本的單位,每個節點還包含子節點(Child Node)和描述節點屬性的欄位(Fields)。 以Shape節點為例,它是一個用來形容物件幾何型狀(Geometry Node,例如:球體、長方體、圓柱體)和外觀(Appearance Node,例如:表面的顏色、透明度、光滑度)的節點。

10

11 節點 由圖3-2可以清楚地看到Shape節點包含了許多相關的節點(Node和欄位(Field),所以Shape節點是一個非常重要的節點,將會在第四章和第五章裡再詳細地說明。

12 節點 以下是範例3-1中,所使用的一個節點。 由以上可知一個節點通常包含: geometry Cylinder { radius 0.5
height 4.0 } 由以上可知一個節點通常包含: 1.節點的名稱(例如:Cylinder)。 2.一對大括號“{}"。 3.欄位和欄位值(例如:radius 0.5)

13 節點 所以在日後的各節中,將會介紹很多節點(Node)的語法(Syntax),先看下面Cone節點的語法:
其中欄位值,如:SFFloat、SFBoo1等的意義將在3-4節中說明。

14 節點 關於節點的分類方法,其實並沒有一定的分類方式,但依照規範的節點種類,可以分成群節點(Grouping Nodes)和子節點(Child Nodes)。 群節點(Grouping Nodes)可以將其它的節點放在這個群節點中。例如:在範例3-1中,Transform節點是一個群節點,它包含了Shape這個子節點,Transform節點可以控制在其節點內之子節點的位置、方位和尺寸,從範例3-1中可以了解。

15 節點 而子節點(Child Nodes)又該如何定義呢?所有的節點都可以視為子節點,當然也包括群節點。
哪些節點是群節點(Grouping Nodes)呢?其實並不多只有八個,在第六章將會介紹所有的群節點。由圖3-3可以看出哪些是群節點(Grouping Nodes)和不是群節點的子節點(Child Nodes)。

16

17 本書各章的分類,是依照各節點的特徵性質來區分,共分成八類,從第四章到第十一章,如表3-1所示。

18 欄位和欄位值 在這一節中主要是介紹欄位的語法和欄位值的型態。一個節點是由欄位和欄位值所組成,它們是用來描述節點的屬性。
欄位可以分成兩類:一類是欄位只包含一個單獨的值,開頭的名稱為SF (Single-value fields);另一類則是包含多重的值,開頭名稱為MF (Multiple-valued fields)。

19 欄位和欄位值 多重值的欄位值是有順序地寫在中括號"[]"裡。假如欄位沒有任何值,只需列出中括號"[]";假如只有一個值就將中括號"[]"省略。例如:有一個欄位值型態為MFInt32的多重欄位叫做foo,但它只含一個欄位值1,有以下表示方式: foo 1 foo[1,] foo[1]

20 欄位和欄位值 在範例3-1中,欄位和欄位值如下
geometry Cylinder { radius 0.5 height 4.0 } Cylinder節點的欄位有radius和height,而欄位值(Field Value)0.5、4.0皆為浮點數(Float),欄位值的型態為SFFloat。

21 欄位和欄位值 在一個節點的標準語法(Syntax)中:
欄位值(Field Value) SFFloat和SFBool所代表的意義是什麼呢?由以下的介紹,將可以對於各種不同欄位值的型態更加了解。

22 SFBool 它是一個布林值或邏輯值。它的值不是TRUE就是FALSE。常被使用去開啟或關閉一個節點的性質特徵。例如:Cone這個節點的side和bottom這兩個欄位,它們的欄位值就是布林值,用來決定四週或底部是否顯現。例如: fooBool FALSE fooBool是一個值為SFBool的欄位,它定義的布林值為FALSE。一個值為SFBool的eventOut事件,它的初始布林值為FALSE。

23 SFColor和MFColor 它總共包含三個浮點值,分別介於(0,1)之間,各自所描述的長紅、綠、藍(R-G-B),經由三個不同值的混合可以顯現出不同的顏色。常被使用在描述一個幾何外型或光線的顏色。例如: 是紅色; 是灰色。下面有一個R-G-B三原色混何參考表(表3-2)。 fooColor [ , , ]

24 SFColor和MFColor fooColor是一個值為MFColor的欄位,它包含三組主要的顏色,分別為紅、綠、藍。一個值為SFColor的eventOut事件,它的初始值為(0 0 0)。一個值為MFColor的eventOut事件,它的初始值為空的中括號"[]"。 基本上,所有的色彩皆由紅、綠、藍三種顏色混合組成的,稱之為三原色。以下為一個三原色混合的參考表:

25

26 SFFloatc和MFFloat 值是浮點數。它可以是正值或負值,可以有小數點,值分布在(-,+ ),例如:88.75、 等。 , fooFloat [ , 133.5e-5 , ] fooFloat是一個欄位值為MFFloat的欄位,它包含三組浮點數值。若一個值為SFFloat的eventOut事件,它的初始值為0.0。一個值為MFFloat的eventOut事件,它的初始值為空的中括號"[]"。

27 SFImage 用來描述數位圖片的一列值。可以表示一個物體外觀的表面紋路顏色。
fooImage<width><height><num components><pixels Values> 其中<width> <height> <num components>為整數值;<pixels values>是用十六進位法(hexadecimal)表示。例如: fooImage xFF 0x00

28 SFImage fooImage是一個值為SFImage的欄位。它定義了一個1個圖素(pixel)寬和2個圖素(Pixels)高的圖片,只含一個元件圖片,底部的圖素是白(0xFF),頂部的圖素是黑(0x00)。一個值為SFImage的eventOut事件,它的初始值為(0 0 0)。

29 SFInt32和 MFInt32 值是32bit的整數值。它可以是正值或負值,不可以有小數點,例如:123、-963等。值為SFInt32和MFInt32的欄位和事件,其值可以用十進位或十六進位的格式來表示。例如: fooIt32 [ 17 , -0xE20 , ] fooInt32是一個值為MFInt32的欄位,它包含了三組整數值(十進位或十六進位)。值為SFInt32的eventOut事件,它的初始值是0。值為MFInt32的eventOut事件,它的初始值是空的中括號"[]"。

30 SFNode和MFNode 值為SFNode的欄位就是一個VRML的節點。值為MFNode的欄位可以是零或多個節點。例如:
fooNode[ Transform {transltin 1 0 0} DEF CUBE BOX{} USE CUBE USE SOME_OTHER_NODE ] fooNode是一個值為MFNode的欄位,它定義了四組節點。若一個值為SFNode的eventOut事件,它的初始值為NULL。一個值為MFNode的eventOut事件,它的初始值是空的中括號"[]"。

31 SFRotation和MFRoation
它是由四個浮點值構成的欄位值。前三個值定義出旋轉軸,根據右手定則(圖3-4);最後一個值定義出旋轉角度,單位以弧度(radian)表示。通常被使用在定義一個物體的方位。例如: fooRotation fooRotation是個值為SFRotation的欄位,它表示對y軸旋轉(180度)的意思。若一個值為SFRotation的eventOut事件,它的初始值為(0 1 0)。一個值為MFRotation的eventOut事件,它的初始值是空的中括號"[]"。

32

33 SFString和MFString 它的一個欄位值是由在一對雙引號中的字元所構成("string")。它通常被用來表示一些選項的名字或描述事物。例如: fooString["One, Two, Three","She is a cute girl"] fooString是一個值為MFString的欄位,它包含了兩組字串。若一個值為SFString的eventOut事件,它的初始值為空的雙引號“”。一個值為MFString的eventOut事件,它的初始值是空的中括號"[]"。

34 SFTime和MFTime 它是一個浮點值。時間值是使用真實世界中的絕對時間,單位是用秒來表示,從某一個特別的時間(西元1970年,1月1日。子夜00:00:00 GMT)開始計算。通常是被應用在動畫中,決定何時開始或停止。例如: fooTime 0.0 fooTime是一個值為SFTime的欄位,表示一個0.0秒的時間。一個值為SFTime的eventOut事件,它的初始值為-1。一個值為MFTime的eventOut事件,它的初始值是空的中括號"[]"。

35 SFVec2f和MFVec2f 欄位值是一個二維的浮點數向量。由兩個浮點數構成一組欄位值。通常被使用來表示一個2-D的位置。例如:
fooVec2f[ , 26 94] fooVec2f是一個值為MFVec2f的欄位,它包含兩組向量。一個值為SFVec2f的eventOut事件,它的初始值為(0 0)。一個值為MFVec2f的eventOut事件,它的初始值是空的中括號"[]"。

36 SFVec3f和MFVec3f 欄位值是一個三維的浮點數向量。由三個浮點數構成一組欄位值。通常被使用來表示一個3-D的位置。例如:
fooVec3f[ , ] fooVec2f是一個值為MFVec2f的欄位,它包含兩組向量。一個值為SFVec3f的eventOut事件,它的初始值為(0 0 0)。一個值為MFVec3f的eventOut事件,它的初始值是空的中括號"[]"。

37 定義節點名稱 (DEF) 重用節點名稱 (USE)
將介紹如何定義一節點的名字。首先先來想想為什麼會有這個功能呢? 最大的功能就是增加重用性。當我們建構一棟房子時,房子一定會用到很多的柱、樑、窗戶和門等,可以發現絕大多數的柱、樑、窗戶和門的尺寸或外觀是相同的,只是位置不同,所以一開始『要先定義一根標準柱、一根標準樑、一個標準窗、一個標準門,把柱、樑、窗戶和門都視為單一的物件,而他們的屬性、尺寸也都設定在其中。接下來在建構這房子時,只要用組合的方式,將以上定義的各種物件放置於正確的位置即可。圖3-6是一根標準柱,圖3-7是一個標準樑,而圖3-8則是由標準柱和標準樑構成的樑柱結構系統。

38 圖3-7 標準樑 圖3-6 標準柱

39

40 DEF SYNTAX DEF node-name node-type{……………..} 去定義一個節點來當作重用案例,要在節點之前,加上“DEF”和所要定義的節點名稱“node-name”。在VRML的檔案中,可以定義任意個節點名稱,但是不能重複定義相同的名稱在同一個VRML的檔案中。node-name可以是任何你覺得方便的字串名稱,有大、小寫的差異,node-name叫做“ERlCA”和“erica”的意義對VRML瀏覽器來說是不一樣的。字元可以是字母、數字和底線(underscore,“_”)。下列是一些合法node-name的例子:

41 DEF SYNTAX node-name的標頭不可以是數字。它不可以包含不能顯現的ASCII字元,像是space、tabs;它也不能使用到標點符號或是運算符號,像是雙引號("")、各種括號、正負號等。 還有一些對VRML有特別意義的名稱也不可以使用來當作node-name,例如:

42 USE SYNTAX USE node-name 如果你在一個檔案中定義了一個節點名稱,可以用「USE」來重用已經定義的節點名稱在相同的檔案中。原本被定義名字的節點稱作「來源節點」(original node);每次被重用的節點則叫做「案例」(instance)。所有使用案例(instance)的地方,都可以具有和來源節點(original node)相同的屬性,如果要改變所有案例(instance)的屬性,只要變動來源節點(original node)的屬性就可以了。

43 USE SYNTAX USE node-name 在範例3-1中,先定義了一個Appearance的節點叫做Yellow,原本是用來形容Cylinder節點的外觀顏色;在下面Yellow又被用來形容Box節點的外觀顏色。透過範例3-1讀者應該對"DEF"和"USE"的用法有更基本的認識。

44 事件和路由--事件(Event) 節點是可以透過接收事件而改變。大部分的節點有能力去處理進入事件(eventIns)。靠著接收eventIns的指示,節點可以改變目前的狀態。例如:一個節點的顏色(color)可以被改變,set_color。當一個節點被改變了,它會對改變的狀態有所反應,藉著送出一些發生事件(eventOuts),例如:Color_changed。

45 事件(Event) 一個exposedField能夠接收事件,像是eventIn;能夠產生事件,像是eventOut。事件是短暫的,事件值是不會被寫入VRML的檔案中。exposedField就像是欄位一樣被放置在VRML檔案中。如果一個exposeField叫做zzz,那麼它的eventln事件為set_zzz,eventOut事件則為zzz_Changed。

46 事件(Event) 下列是一些eventIns和eventOuts的規則:
大部分的eventIns都是以"set_"為開頭的事件,除了addChildren和removieChildren這兩個eventIns以外。 大部分的eventOuts都是以"_changed"為結尾的事件,除了型態為SFBool的eventOuts。布林值的eventOuts是以"is"作為標頭,例如:isBound、isActive等。 eventIns和eventOuts的型態為SFTime時,就不是再使用"set_"和"changed_"作為連接。例如:bindTime、touchTime等。

47 路由 (Route) Route的功能是連接一個節點所產生的事件(eventOuts)和一個節點接收的事件(eventIns)。Route並不是節點,它只是簡單的語法架構,告訴一個事件該如何從某個節點到達另一個節點。換句話說,Route的目的是負責建立兩個節點間的路徑。 Route可以放置在VRML檔案的最頂層、在PROTO的定義中或在會出現欄位的節點內。 ROUTE Syntax: ROUTE NodeName.eventOutName_cnanged TO NodeName.set_eventInName

48

49

50 範例說明 透過這個範例主要的目的是讓讀者了解ROUTE的功能,對一個初學的讀者應該是不懂這範例的意思,但筆者的重點是讓讀者知道ROUTE如何建立節點間的路徑,並傳送事件。這個範例的執行結果是畫面中的球體會不斷地改變尺寸,如圖3-9所示。

51

52 總結 讀完這章後,讀者對於整個VRML的檔案架構應該有所認識。一個VRML的檔案架構就是在本章各節中所介紹的內容,像是檔案標頭的定義、註解的應用、節點和欄位的定義、DEF與USE的使用時機、事件與路由的結合。 在本章中,對只做了文字上的描述和範例介紹。在往後的章節中,本章所提的架構會一再地出現於範例中。讀者從本章中獲得了這些基本概念後,對接下來的學習內容應該可以有所助益。


Download ppt "致遠管理學院資訊管理學系 授課老師:謝慧民 九十三學年度第一學期"

Similar presentations


Ads by Google