VRML语法基础跟简介
VRML簡介和基礎語法
--------------------------------------------?
一、VRML是什么?
VRML是虛擬現實造型語言 (Virtual Reality Modeling Language) 的簡稱。
二、VRML文件的組成部分和文件頭?
VRML文本的文件名后綴是 .wrl,這是一種ASCII文本文件。VRML文件可以包括四個主要成分:?
VRML文件頭?
原型?
造型和腳本?
路由?
每個文件都有一個文 件頭,VRML1.0的文件頭和2.0的文件頭是不一樣的。VRML 1.0的文件頭是#VRML V1.0 asciiVRML 2.0的文件頭是,我們這里只討論VRML 2.0#VRML V2.0 utf8 在VRML文件中可以加入注解,只要在注解前加入#即可。下面是一個簡單的VRML文件,它在三維空間中建立一個立方體。#VRML V2.0 utf8?
Shape {?
appearance Appearance { }?
material Material { }?
}?
geometry Box { }?
}?
三、幾個基本造型?
所有VRML造型都使用Shape節點創建。?
Shape節點的語法是Shape {?
appearance NULL?
geometry NULL?
}其中appearance域的值定義一個節點,該節點定義造型的外觀,包括顏色和表面紋理等。當它為NULL值時建立的造型是無紋理的白色有陰影物體。它將在后面介紹。geometry域的值定義一個節點,該節點定義造型的3D構造及幾何結構。典型的幾何結構有Box,Cone,Cylinder和Sphere,它們都可以作為geometry的值。?
Box節點的語法是Box {?
size 2.0 2.0 2.0 #長 高 寬(x y z 三個方向,注:2.0 2.0 2.0是缺省值,下同)?
}?
Cone節點的語法是Cone {?
bottomRadius 1.0 # 圓錐底部半徑?
height 2.0 # 圓錐的高?
side TRUE # 是否創建圓錐的錐面?
bottom TRUE # 是否創建圓錐的底?
}?
Cylinder節點語法Cylinder {?
radius 1.0 # 園柱底的半徑?
height 2.0 # 園柱高?
side TRUE # 是否創建園柱曲面?
top TRUE # 是否創建園柱頂?
bottom TRUE # 是否創建園柱底?
}?
Sphere節點語法Sphere {?
radius 1.0 # 球體的半徑?
}以上語法中的值,是缺省值,下同。下面是一個簡單的VRML文件,它創建一個白色的,無紋理的長、高、寬分別為2.2,1.0和1.5的長方體。#VRML V2.0 utf8?
Shape {?
appearance Appearance {?
material Material { } # 白色無紋理的物體(material是appearance中的一個屬性,我們以后接觸)?
}?
geometry Box { size 2.2 3.0 1.5 } # 長方體?
}
四、文本造型?
Text節點語法(作為geometry的值)Text {?
string [] #文本內容?
length 0.0 #文本長度?
maxExtent 0.0 #文本的最大長度?
fontStyle NULL #文本外觀特性?
}?
FontStyle節點語法FontStyle {?
family "SERIF" #指定字符集?
style "PLAIN" #文本風格?
size 1.0 #字符高度?
spacing 1.0 #指定VRML單位的水平文本的垂直間距和垂直文本的水平間距?
justify "BEGIN" #相對于X、Y來說,文本造型放置的位置?
horizontal TRUE #水平文本還是垂直文本?
leftToRight TRUE #水平文本是從左到右還是從右往左(X方向)?
topToBottom TRUE #垂直文本是從上到下還是下到上?
language "" #指定TEXT節點中string所用語言的前后文?
} 文本風格style的值包括“PLAIN(常用文本)”、“BOLD(黑體文本)”、“ITALIC (傾斜文本)”和“BOLDITALIC(黑體且傾斜的文本)”。?
justify的值有四個“FIRST”、“BEGIN”、“MIDDLE”和“END”,justify可以取一個值,也可以取兩個值。當取兩個值時,兩個值應放在方括號中,用逗號隔開。其中第一個為主對齊,第二個為次對齊。需要說明的是對齊的具體含義和lefttorigh和toptobottom的取值有關。具體見下面的表:表5.1水平文本主對齊的justify域值?
justify域的主對齊值 leftToRight域值 描 述?
“FIRST” TRUE 將文本塊的左邊放在Y軸上?
FALSE 將文本塊的右邊放在Y軸上?
“BEGIN” TRUE 將文本塊的左邊放在Y軸上?
FALSE 將文本塊的右邊放在Y軸上?
“MIDDLE” TRUE 將文本塊的中邊放在Y軸上?
FALSE 將文本塊的中邊放在Y軸上?
“END” TRUE 將文本塊的右邊放在Y軸上?
FALSE 將文本塊的左邊放在Y軸上?
表5.2垂直文本主對齊的justify域值 justify域的主對齊值 topToBottom域值 描 述?
“FIRST” TRUE 將文本塊的上邊放在X軸上?
FALSE 將文本塊的下邊放在X軸上?
“BEGIN” TRUE 將文本塊的上邊放在X軸上?
FALSE 將文本塊的下邊放在X軸上?
“MIDDLE” TRUE 將文本塊的中邊放在X軸上?
FALSE 將文本塊的中邊放在X軸上?
“END” TRUE 將文本塊的下邊放在X軸上?
FALSE 將文本塊的上邊放在X軸上?
表5.3水平文本次對齊的justify域值 justify域的主對齊值 topToBottom域值 描 述?
“FIRST” TRUE 將第一行文本的基線放在X軸?
FALSE 將第一行文本的基線放在X軸?
“BEGIN” TRUE 將第一行文本的上邊放在X軸?
FALSE 將第一行文本的下邊放在X軸?
“MIDDLE” TRUE 將文本塊的中點放在X軸?
FALSE 將文本塊的中點放在X軸?
“END” TRUE 將最后一行文本的下邊放在X軸?
FALSE 將最后一行文本的上邊放在X軸?
表5.4垂直文本次對齊的justify域值 justify域的主對齊值 leftToRight域值 描 述?
“FIRST” TRUE 將第一列文本的基線放在Y軸?
FALSE 將第一列文本的基線放在Y軸?
“BEGIN” TRUE 將第一列文本的左邊放在Y軸?
FALSE 將第一列文本的右邊放在Y軸?
“MIDDLE” TRUE 將文本塊的中點放在Y軸?
FALSE 將文本塊的中點放在Y軸?
“END” TRUE 將最后一列文本的右邊放在Y軸?
FALSE 將最后一列文本的左邊放在Y軸?
例子:#VRML V2.0 utf8?
Shape {?
appearance Appearance {?
material Material { } # 白色無紋理的物體(material是appearance中的一個屬性,我們以后接觸)?
}?
geometry Text {?
string ["Hello","Let's go!"]?
fontStyle FontStyle {?
spacing 1.1?
}?
}?
}
五、造型定位(平移、旋轉和縮放)?
Transform節點語法Transform {?
children [] # 所包含的子節點列表?
translation 0.0 0.0 0.0 # x,y,z方向上平移的值?
ro tation 0.0 0.0 1.0 0.0 # x,y,z方向旋轉軸標識,旋轉角度(用弧度表示)?
scale 1.0 1.0 1.0 # x,y,z方向的縮放因子?
scaleOrientation 0.0 0.0 1.0 0.0 # 在x,y,z方向軸上旋轉一定弧度后,在按scale因子縮放?
Center 0.0 0.0 0.0 # 新的旋轉或縮放中心點的x,y,z坐標?
} children域中的值可以是Shape節點,Group節點(后面講)或另一個Transform節點(即可嵌套)。還有些域我們放到后面講。?
物體的平移?
translation的三個值分別表示x,y,z方向上的平移。?
例子:?
#VRML V2.0 utf8?
Transform {?
translation 2.0 3.0 -5.0 # x方向平移2個單位,y方向平移3個方向,z的反方向平移5個單位?
children [?
Shape {?
appearance Appearance {?
material Material{}?
}?
geometry Cylinder {}?
}?
]?
}?
請看效果(紅的為x方向平移2個單位,y方向平移3個方向,z的反方向平移5個單位的圓柱體)?
物體的旋轉 ?
旋轉采用右手法則,rotation域的前三個值的取值為繞X軸旋轉(1.0 0.0 0.0);繞Y軸旋轉(0.0 1.0 0.0);繞Z軸旋轉(0.0 0.0 1.0);第四個數是旋轉的角度,用弧度來表示,正數為逆時針旋轉,負數為順時針旋轉。?
通常情況下,旋轉中心是原點,但可以用Center的值來重定義旋轉中心點。?
例子:?
#VRML V2.0 utf8?
Transform {?
rotation 1.0 0.0 0.0 0.785 # 繞X軸順時針旋轉45度?
children [?
Shape {?
appearance Appearance {?
material Material{}?
}?
geometry Cylinder {}?
}?
]?
}?
請看效果,紅色的為旋轉后的圓柱體,白色的為Y軸?
物體的縮放?
scale的三個值分別是x,y,z方向的縮放因子.scaleOrientation的值指定一條旋轉軸和旋轉角度,在縮放前先做旋轉,縮放后再轉回來,所以它只是使縮放方向旋轉而不會旋轉物體.?
例子:?
#VRML V2.0 utf8?
Transform {?
scale 3.0 0.0 0.5 # 沿X軸放大兩倍,Z軸方向縮小0.5倍?
children [?
Shape {?
appearance Appearance {?
material Material{}?
}?
geometry Cylinder {}?
}?
]?
}?
六、使用材料控制外觀?
RGB顏色?
RGB顏色包含三個浮點值,每一個都在0.0到1.0之間。第一個RGB顏色值代表紅色的使用量值,第二個代表綠色的量值,第三個代表蘭色量值。0.0表示該種顏色被關閉,1.0表示該種顏色全部打開。?
明暗法?
當光線照在造型上,造型對光的一面亮,背光的一面暗,而側面就是中等亮度。明暗的對比使你感覺到造型是三維立體的。你可以使用VRML中的照明節點在你所處的環境中增加一些光源,這些節點 將在中級教程中介紹。你可以通過使用Material節點來控制表面的明暗度。?
發光效果?
發光造型包括電燈泡、計算機屏幕和霓虹燈等。發光造型都發出自己本身的光。使用Material節點你可以指定一個發光顏色。?
透明度?
不透明的造型擋住了光線,而透明的造型可以讓光線通過,半透明的造型擋住了部分光線。你可以用Material節點來指定一個造型創建時的透明狀態。?
Shape節點中的Appearance節點?
在基本造型中我們詳細介紹了Shape節點的geometry域,提到了“其中appearance域的值定義一個節點,該節點定義造型的外觀,包括顏色和表面紋理等”。?
Appearance節點語法是?
Appearance {?
material NULL #定義造型材料屬性的節點?
texture NULL #(后面介紹)?
textureTransform NULL #(后面介紹)?
}其中?
Material的節點語法是?
Material {?
diffuseColor 0.8 0.8 0.8 #表示一種材料的RGB顏色?
emmissiveColor 0.0 0.0 0.0 #表示RGB發光色?
transparency 0.0 #表示一個在0.0到1.0之間的透明度因數?
ambientintensity 0.2 #(后面介紹)?
specularColor 0.0 0.0 0.0 #(后面介紹)?
shininess 0.2 #(后面介紹)?
}?
例1一個旋轉了的紅色立方體?
#VRML V2.0 utf8?
Transform{?
rotation 1.0 1.0 0.0 0.635 #繞X軸和Y軸旋轉?
children [?
Shape {?
appearance Appearance {?
material Material {?
diffuseColor 1.0 0.0 0.0?
} # 紅色無紋理的物體?
}?
geometry Box { size 2.2 3.0 1.5 } # 長方體?
}?
]?
}?
例2 是多個不同顏色外觀的造型?
#VRML V2.0 utf8?
Group {?
children [?
#Station Shapes?
Shape {?
appearance Appearance {?
material Material {?
diffuseColor 1.0 0.0 0.0?
}?
}?
geometry Sphere {}?
},?
Shape {?
appearance Appearance {?
material Material {?
diffuseColor 0.5 0.25 1.0?
}?
}?
geometry Cylinder {?
radius 2.0?
height 0.05?
}?
},?
Shape {?
appearance Appearance {?
material Material {?
diffuseColor 0.75 0.0 1.0?
}?
}?
geometry Cylinder {?
radius 0.15?
height 5.0?
}?
}?
]?
}?
例3 本例子共有三個白色質地的燈泡,左邊的關閉,中間的發白光,右邊的發黃光。?
八、Group節點和DEF、USE語法?
Group節點?
Group {?
children [ ] #指定包含在組中的字節點列表,典型的子節點是Shape或其他的Group節點?
bboxCenter 0.0 0.0 0.0 #(以后講)?
bboxSize -1.0 -1.0 -1.0 #(以后講)?
addChildren #(以后講)?
removeChildren #(以后講)?
}?
DEF語法?
DEF 節點名 節點類型 {……} #定義節點的名稱?
節點名可以是任何字母序列,他們是區分大小寫的。但注意不要和VRML關鍵字重復。?
節點類型是一種特殊 類型的節點,比如Box節點。?
例如:DEF MY_BOX Box {}?
USE語法?
USE 節點名 #使用已經定義的節點名?
在同一文件中你可以使用USE來引用原始節點任意次。?
例如:USE MY_BOX?
例子:?
#VRML V2.0 utf8?
Group {?
children [?
#Wing?
DEF Wing Transform {?
scale 0.5 1.0 1.5?
children Shape {?
appearance DEF White Appearance {?
material Material { }?
}?
geometry Cylinder {?
radius 1.0?
height 0.025?
}?
}?
},?
# Fuselage?
DEF Fuselage Transform {?
scale 2.0 0.2 0.5?
children Shape{?
appearance USE White?
geometry Sphere { }?
}?
},?
# Wing detal and fuselage dome?
Transform {?
scale 0.3 2.0 0.75?
children [?
USE Wing?
USE Fuselage?
]?
}?
]?
}?
RML中的節點有以下幾種類型:?
造型尺寸、外觀節點:Shape、Appearance、Material?
原始幾何造型節點:Box、Cone、Cylinder、Sphere?
造型編組節點:Group、Switch、Billboard?
文本造型節點:Text、FrontStyle?
造型定位、旋轉、縮放節點:Transform?
內插器節點:TimeSensor、PositionInterpolater、OrientationInterpolater、ColorInterpolator、 ScalarInterpolator、CoordinateInterpolator、?
感知節點:TouchSensor、CylinderSensor、PlaneSensor、SphereSensor、VisibilitySensor、ProximitySensor、Collision?
點、線、面集節點:ointSet、IndexedLineSet、IndexedFaceSet、Coordinate?
海拔節點:ElevationGrid?
擠出節點:Extrusion?
顏色、紋理、明暗節點:Color、ImageTexture、PixelTexture、MovieTexture、Normal?
控制光源的節點:ointLight、DirectionalLight、SpotLight?
背景節點:Background?
聲音節點:AudioClip、MovieTexture、Sound?
細節控制節點:OD?
霧節點:Fog?
空間信息節點:WorldInfo?
錨點節點:Anchor?
腳本節點:Script?
控制視點的節點:Viewpoint、NavigationInfo?
用于創建新節點類型的節點:ROTO、EXTERNPROTO、IS?
ScalarInterpolator節點?
ScalarInterpolator { ?
key [ ] # exposed field MFFloat?
keyValue [ ] # exposed field MFFloat?
} ?
域?
key 關鍵幀時間比率列表。通常介于0.0和1.0之間的浮點數,包括0.0和1.0。?
keyValue 浮點數值的列表,對應于上面的列表。?
事件 ?
set_fraction eventIn SFFloat?
動畫的完成比率。?
value_changed eventOut MFFloat?
與比率相對應的浮點數值。?
說明?
ScalarInterpolator節點允許對單精度浮點數進行動畫關鍵幀的插值操作。建立插值器時,為動畫的不同完成比率設置相應的〉閌ㄗ詈冒 賈島徒崾擔 br> 通常坐標插值器從時間傳感器接收set_fraction事件,經處理后,將輸出值發送給類型為單精度浮點數的域。如intensity和radius。?
s cript節點?
s cript {?
?
url [ ] # exposed field MFString?
mustuate FALSE # SFBool?
directOutpur FLASE # SFBool?
以下 域可由用戶定義任意多個:?
eventIn eventTypeName eventName?
field?
fieldTypeName?
fieldName initialValue?
eventOut?
eventTypeName?
eventName?
域?
url 腳本的URL或腳本??赡苡卸鄠€值,瀏覽器執行第一個它 理解的腳本。?
mustuate?
指出當瀏覽器不再需要腳本的輸出時是否還要給腳本發輸人事件。若為FALSE,瀏覽器有時可以提高其性能,因為當沒有其它節點需要腳本的輸出事件時,瀏覽器可以不發事件給腳本。除非腳本做了諸如訪問網絡這樣一些瀏覽器無法識別的事,否則應該保留FALSE。?
directOutpur?
指出是否允許腳本直接改變場景節點和動態地建立或刪除通路。換句話說,就是指出腳本是否只能通過事件的方法來與世界聯系。如果不是十分必要的話,應設為FALSE,可便于瀏覽器對場景進行優化。?
事件?
s cript 節點不能包含內置事件,但對于整個s cript節點的輸入輸出事件可定義任意多個事件。?
說明?
一個s cript節點包含一個叫作s cript的程序。這個程序是以javas cript或Java寫的。腳本可以接受事件,處理事件中的信息,還可以產生基于處理結果的輸出事件。?
當一個s cript節點接受一個輸入事件時,它將事件的值和時間戳傳給與輸人事件同名的函數或方法。函數可以通過賦值給與事件同名的變量發送事件。一個輸出事件與調用發出輸出事件函數的輸入事件有相同的時間戳。?
當一個腳本給另一個節點發出多個具有相同時間戳的事件時,另一個節點的類型將決定處理事件的順序。總而言之,這個處理過程最接近用戶期望的順序。例如,如果用戶的腳本向某個ViewPoint節點發出有相同時間戳的set_position和set_bind事件,瀏覽器在激活該視點之前會重新設置觀點的位置。大多數情況下,用戶最好忽略時間戳。?
一些腳本語言(包括Java,javas cript)定義了有特殊意義的函數和方法。例如,如果用戶提供了一個叫initialize()的函數,則當世界被裝入時,首先調用這個函數。另外,如有shutdown()函數,則在刪除世界時調用(例如當用戶用Anchor選擇了另一個世界時)。eventsProcessed()函數在一個或多個eventIn函數完成后被調用(由瀏覽器決定是完成每個eventIn函數后調用還是等所有輸人事件都處理完了再調用)。?
Shape節點?
Shape { ?
appearance NULL # exposed field SFNode?
geometry NULL # exposed field SFNode?
} ?
域?
appearance 包含一個Appearance節點。?
geometry 包含一個幾何節點(如:Box、Cone、IndexedFaceSet、PointSet)。?
說明?
將Appearance指定的材質和質感應用到geometry域的幾何節點?
Sound節點?
Sound { ?
source NULL # exposed field SFNode?
intensity 1 # exposed field SFFloat?
priority 0 # exposed field SFFloat?
location 0 0 0 # exposed field SFVec3f?
direction 0 0 1 # exposed field SFVec3f?
minFront 1 # exposed field SFFloat?
maxFront 10 # exposed field SFFloat?
minBack 1 # exposed field SFFloat?
maxBack 10 # exposed field SFFloat?
spatialize TRUE # SFBool?
} ?
域?
source 包含一個AudioClip或MovieTexture節點。若沒有指定,將不發出聲音。?
intensity 聲源的強度,0為最小值,1為最大值。在有些瀏覽器中最大值可以超過1。?
priority 指出聲音的優先級。若為背景音樂,則設為0。?
location 聲源的坐標。?
direction 指定橢球的長軸方向。?
minFront 聲源坐標點至內橢圓球前部端點的距離。?
maxFront 聲源坐標點至外橢圓球前部端點的距離。?
minBack 聲源坐標點至內橢圓球后部端點的距離。。?
maxBack 聲源坐標點至外橢圓球后部端點的距離。?
spatialize 指出聲音是作為空間點播放(TRUE),還是作為環境聲播放(FALSE)。?
說明?
minBack和minFront域定義一個內橢圓;maxBack和maxFront域定義一個外橢圓。?
在內橢圓區域內聲音為最大值;在外橢圓區域外沒有聲音;在內外橢圓之間的區域內,其聲音按距離衰減。?
聲音能否同時播放,由瀏覽器決定。?
Sphere節點?
Sphere {?
?
radius?
1?
# SFFloat?
}?
?
域?
radius 球的半徑。?
說明?
Sphere是一個代表球的幾何節點。缺省時,球以原點為圓心,以1為半徑。?
當一個紋理圖應用到一個球上時,缺省的紋理將覆蓋整個表面,從球體后面逆時針鋪開。紋理在yz平面的后面縫合。由于瀏覽器功能的不同,在使用某些瀏覽器時,從內部觀察球體是不可見的。不要把觀察點放到球體內。如果希望看到幾何體的內部,使用IndexedFaceSet,將其中solid設為FLASE。?
SphereSensor節點?
SphereSensor { ?
enabled TRUE # exposed field SFBool?
offset 0 1 0 0 # exposed field SFRotation?
autoOffset TRUE # exposed field SFBool?
} ?
域?
enabled 表示傳感器當前是否檢測定點設備的事件??上蛟搨鞲衅靼l送一個值為FALSE的set_enabled時間來關閉它。?
offset 在一次拖動后,相關幾何體相對于初始位置的旋轉角度。?
autoOffset 設置為TRUE,表示在拖動結束時,將當前的方位值存儲到offset中,若autoOffset設置為FALSE,在用戶每次開始一個新的托動時,幾何體復位到初始值。?
事件?
inActive eventOut SFBool?
指出用戶是否在拖動與傳感器相關的幾何體。?
trackPoint_changed eventOut SFVec3f?
用戶在拖動過程中任意時刻定點設備在假想的球體表面上的實際位置。?
rotation_changed eventOut SFRotation?
用戶在拖動過程中任意時刻假想球體的當前朝向。?
說明?
SphereSensor節點將二維的拖 動解釋為三維空間中繞局部原點的旋轉。若在該節點的兄弟幾何體處按下鼠標,瀏覽器會以點擊鼠標的點到原點的距離為半徑作一個想象中的球。隨后的拖動將解釋為旋轉球體。?
SpotLight節點?
SpotLight { ?
on TRUE # exposed field SFBool?
intensity 1 # exposed field SFFloat?
ambientIntensity 0 # exposed field SFFloat?
color 1 1 1 # exposed field SFColor?
location 0 0 0 # exposed field SFVec3f?
direction 0 0 -1 # exposed field SFVec3f?
beamWidth 1.570796 # exposed field SFFloat?
cutOffAngle 0.785398 # exposed field SFFloat?
radius 100 # exposed field SFFloat?
attenuation 1 0 0 # exposed field SFVec3f?
}?
?
域?
on 指出燈是否打開。?
intensity 光源的強度。?
ambientIntensity 光源對環境光的貢獻。?
color 光源的顏色。?
location 光源的位置。?
direction 光圓錐軸的方向。?
beamWidth 光圓錐對應的角度(以弧度為單位)。該角度外,光的強度減弱。?
cutOffAngle 光源的遮擋角。?
radius 光源的射程。?
attenuation 光源的衰減度。域中的第一個數表示常數衰減;第二個數表示對距離線性衰減;第三個數表示對距離平方衰減。對距離平方衰減是三種衰減中最接近現實的,但也是計算最慢的。?
說明?
一個SpotLight節點定義兩個光圓錐:一個光圓錐的頂角等于beamWidth、高等于radius,在其內部光強最大;另一個光圓錐與前一個共軸,頂角等于cutOffAngle,光強從內圓錐表面到外圓錐表面逐漸衰減,直至為零。?
Switch節點?
Switch {?
?
whichChoice -1 # exposed field SFInt32?
choice [ ] # exposed field MFNode?
} ?
域?
whichChoice 活動子項的標號。choice域中的第一個活動子項的標號是0。如果whichChoice的值小于0或者大于choice域中的項目數,那么不選中任何子項。?
choice 包含該組節點的各個子項。每個子項有一個隱含的序號。第一個子項的隱含序號為0。?
說明?
Switch組節點激活choice域中指定的零個或一個子項。非活動子項被忽略。但是,無論是否被激活,Switch節點的所有子項都對事件作出反應。?
Text節點?
Text {?
?
string [] # exposed field MFString?
fontStyle NULL # exposed field SFNode?
maxExtent 0.0 # exposed field SFFloat?
length [] # exposed field MFFloat?
} ?
域 ?
string 要顯示的文本串,用UTF-8編碼。?
fontStyle 包括說明如何繪制文本的FontStyle節點。?
maxExtent 在該節點文本的任意一行的主要方向上的最大范圍,必須大于等于0。如果FontStyle節點的horizonal域是TRUE,則主要方向是水平方向,否則是垂直方向。取值0表示字符串可為任意長度。?
length 單個文本串的預期長度。0表示可謂任意長取
說明?
Text節點繪出特殊風格的一個或多個字符串。如果給出多于一個的字符串 ,則每個串單獨占一行,行距由FontStyle節點決定。?
瀏覽器決定局部坐標系主要方向上字符串的范圍。如果最長的字符串超過maxExtent的范圍,它將被縮小到maxExtent的長度范圍內;其它的字符串相應縮小同樣的程度。?
每一個字符串有一個相應的length值,表明設定的字符串長度。瀏覽器將字符串拉長或壓縮到所需長度。缺省值被當作0。?
對Text節點不執行碰撞檢查。?
TextureCoordinate節點?
TextureCoordinate { ?
point []?
# exposed field MFVec2f?
} ?
?
域?
point 以二維(s,t)形式給出的一組紋理坐標點,它們一般與IndexedFaceSet或ElevationGrid中的頂點構成對應關系。?
?
說明?
這個節點定義了一組二維坐標,用于完成紋理和幾何表面頂點間的映射。它通常用在IndexedFaceSet和ElevationGrid節點的texCoord域中。?
紋理圖參數值沿紋理圖像從0到1變化。先確定水平坐標s,然后確定垂直坐標t。?
在point域定義的TextureCoordinate值可以在-infinity和+infinity之間變化。如果紋理在某一方向上重復(s或t),那么紋理坐標c映射到沿指定方向有n個像素的紋理圖上;?
location=(c - floor(c))*n?
如果紋理沒有重復,c被剪裁到0--1的范圍內:?
location=max(0,min(1,c))*n?
TextureTransform節點?
TextureTransform { ?
translation 0 0 # exposed field SFVec2f?
rotation 0 # exposed field SFFloat?
rcale 1 1 # exposed field SFVec2f?
center 0 0 # exposed field SFVec2f?
} ?
域 ?
translation?
指定一個平移。?
rotation 指定一個以center域中定義的物體中心為原點的旋轉(弧度)。?
scale 指定一個以center域中定義的物體中心為原點的縮放。兩個軸向的縮放程度可以不同。?
center 指定一個縮放和旋轉的中心。?
說明?
TextureTransform 節點定義了對紋理坐標的二維變換。這個節點只在Appearance節點的textureTransf orm域使用,它影響紋理映射到相關幾何體節點表面的方式。這個節點中的操作的順序是縮放、旋轉、平移 。?
TimeSensor節點?
TimeSensor { ?
cycleInterval 1 # exposed field SFTime?
enabled TRUE # exposed field SFBool?
loop FALSE # exposed field SFBool?
stsrtTime 0 # exposed field SFTime?
stopTime 0 # exposed field SFTime?
}?
?
域?
cycleInterval 每個周期的長度,以秒為單位,取值大于0。?
enabled 若為TRUE,當條件成立時產生時間相關事件;若為FALSE,在任何條件下都不會產生時間相關事件。無論enabled為TRUE或FALSE,通域的 set_事件都被處理并產生_changed事件。?
loop 表明時間傳感器是無限循環,還是在一個周期后被終止。?
stsrtTime 開始產生事件的時間。?
stopTime 終止產生事件的時間。其值若小于等于起始時間,則被忽略。?
事件?
isActive eventOut SFBool?
表明時間傳感器 當前是否在運行。若在運行,則返回TRUE;若處于停止狀態,則返回FALSE。?
cycleTime eventOut SFTime?
在每個周期開始時,返回當前時間。?
fraction_changed eventOut SFloat?
當前周期的完成比。從0(周期開始)到1(周期結束)。?
time eventOut SFTime?
從格林威治時間1970年1月1日子時(午夜12點)至今所經過的秒數。?
說明?
隨著時間的推移,TimeSensor節點產生事件。它能被用來生成動畫(通常與插值器一起),能在一個指定時間引發一個動作或者以固定時間間隔產生事件。?
通常情況下,時間傳感器的starTime被另一個對用戶動作作串反應的傳感器或腳本傳來的時間事件設置。在startTime設定的時刻以前,時間傳感器不做任何工作。在該時刻到來時,它產生值為 TRUE的 isActive事件,并開始產生 time、fraction_ changed和cycleTime事件。?
time事件是總保持有一個當前時刻值的連續發生的事件。而產生的其它與時間相關的事件是周期性發生的事件。當loop為FALSE時,時間傳感器僅僅運行cycleInterval中設置的一個時間周期(或在第一個周期完成前到達stopTime中設定的時間);而當loop為TRUE時,時間傳感器不斷地運行,直到到達stopTime中設定的時間或 enabled被設置為FALSE。在每個周期的開始,時間傳感器發出fractdri_changed事件(值為0)和cycleTime事件(值為當前時間)。在每一個周期中,當瀏覽器允許傳感器產生一個事件時(通常每幀一次),fraction_?
changed的值從0增加到1,表明當前周期已完成多少。在fraction_changed值為1時,當前周期結束,新的周期開始。?
cycleTime事件僅僅在周期開始時產生。若要生成一個~次性事件如鬧鐘,則應把start_Time設置為期望時間,把loop設置為FALSE。這樣在startTime到來時,該時間傳感器只運行一個周期。?
在產生時間相關事件時,時間傳感器忽略set_cycleInterval和set_startTime事件。cycleInterval和startTime域的值將不會發生變化,而且不會產生 cycleInterval_changed和startTime_changed事件。若想要重啟一個時間傳感器,應該首先發送一個與當前時間值相同的set_stopTime事件來停止當前的時間傳感器,再發送一個set_startTime事件。?
當一個活動的時間傳感器收到一個set_stopTime事件時,若值大于startTime的值但小于當前的時間值,則它將把stopTime設定為指定值。但像stopTime中設置的時間是當前時間那樣,發出結束事件。若set_stopTime事件值小于等于startTime的值,則這一事件將被忽略。?
設置loop為TRUE時,時間傳感器在startTime到來時開始產生事件,事件將不斷地產生或在stopTime到來時停止(如果stopTime大于startTime)。如果希望當瀏覽器加載一個環境時時間傳感器立刻被激活,應將loop設置 為TRUE,讓startTime和stopTime保持缺省值(或將它們設置成stopTime小于等于startTime的任何值)。?
當時間傳感器運行時將loop從TRUE改變為FALSE,傳感器將在當前周期結束時或者stopTime到來時停止運行(取決于這兩個事件誰先發生)。?
時間傳感器不保證以某種頻率產生時間相關事件,但是大多數瀏覽器在繪制動畫的每一幀時,產生這些事件。?
TouchSensor節點?
TouchSensor {?
?
enabled?
TRUE?
# exposed field SFBool?
}?
?
域?
enabled 表明此傳感器是否對定點輸入設備做出反應。?
事件?
isOver eventOut SFBool?
表明定點設備當前是否正指向傳感器的兄弟幾何體(無論是否有鍵被按下)。?
isActive eventOut SFBool?
表明是否定點設備的鍵正在被按下。?
hitPoint_changed eventOut SFVec3f?
最近在兄弟幾何體表面釋放鍵的位置。?
hitNormal_changed eventOut SFVec3f?
hitPoint_changed所指定點的法向量。?
hitTexCoord_changed eventOut SFVec2f?
hitPoing_changed所指定點的紋理坐標。?
touchTime eventOut SFTime?
定點設備的鍵完成一次點動的時間。?
說明?
TouchSensor(觸動傳感器)節點產生基于定點輸入設備(通常是鼠標)的事件。這些事件表明用戶是否正在點選某個幾何體和用戶在什么地方,以及在什么時候按了定點設備的鍵。?
觸動傳感器監視的幾何體是傳感器的兄弟幾何體傳感器父組節點的所有子節點。?
若定點設備未指向傳感器的兄弟幾何體,而用戶開始將定點設備移到傳感器的兄弟幾何體時,傳感器將產生一個isOver事件,并將其值設置為TRUE;相反,若定點設備已經指向傳感器的兄弟幾何體,此時用戶將定點設備移出傳感器的兄弟幾何體,傳感器將產生一個isOver事件,并將其值設置為FALSE。?
當用戶將定點設備從幾何體的一點移動到另一點時,傳感器將發送一系列事件: hitPoint_changed、hitNormal_changed、hitTexCoord_changed,分別表明用戶所指的位置、該點的法向量和紋理坐標。?
當用戶點擊被TouchSensor監視的對象時,傳感器將產生值為TRUE的isActive事件;而當用戶釋放定點設備的鍵時,傳感器將產生isActive為FALSE的事件。?
若用戶在指向幾何體時按下鼠標鍵,然后在仍然指向這個幾何體(或又回到這個幾何體)時釋放鼠標鍵,傳感器將要發送一個touchTime事件,表明鍵被釋放的時間??梢允褂眠@一事件來模擬許多常用的用戶接口(如只有在用戶點擊和釋放定點設備按鍵時才產生的動作)。?
當一個觸動傳感器正處理事件時,其它定點設備傳感器不會產生事件。?
Transform節點?
Transform {?
?
bboxCenter 0 0 0 # SFVec3f?
bboxSize -1 -1 -1 # SFVec3f?
translation 0 0 0 # exposed field SFVec3f?
rotation 0 0 1 0 # exposed field SFRotation?
scale 1 1 1 # exposed field SFVec3f?
scaleOrientation 0 0 1 0 # exposed field SFRotation?
center 0 0 0 # exposed field SFVec3f?
children [ ] # exposed field MFNode?
}?
?
域?
bboxCenter 圍繞該變換子項的包圍盒的中心。?
bboxSize 包圍盒在x、y、z方向的值,缺省值是無包圍盒。?
translation 指定變換量。?
rotation 給定旋轉的軸和角度(以弧度為單位)。?
scale 指定縮放比例,各軸向縮放比值可以不相等。?
scaleOrientation 指定縮放和旋轉操作的軸向。?
center 指定縮放和旋轉操作的原點。?
children 受該節點指定的變換影響的子節點。?
事件?
addChildren eventIn MFNode?
將指定節點加入該組的子項列表中。?
removeChildren eventIn MFNode?
將指定節點從該組子項列表中刪除。?
說明?
Transform是為其子項定義坐標系統的組節點。?
Transform定義的三維變換按如下步驟執行:?
1、對任意一點的縮放,各軸向縮放比值可以不相等;?
2、對任意一點和任意軸的旋轉;?
3、平移。?
Viewpoint節點?
Viewpoint { ?
position 0 0 10 # exposed field SFVec3f?
orientation 0 0 0 1 # exposed field SFRotation?
fieldOfView 0.785398 # exposed field SFFloat?
des cription " " # SFStreing?
jump TRUE # exposed field SFBool?
}?
?
域?
position 在局域坐標系中,指定Viewpoint節點的相對位置。?
orientation 指定一個相對于缺省方向旋轉的視點方向。缺省方向是沿z軸負方向、x軸正向指向右和y軸正向指向正上方。視點的位置和方向受上層變換的影響。?
fieldOfView 以弧度為單位指定一個視圖域。小的角度嗨圃督咕低返男Ч?;大的角度产生类似广剿N低返男Ч?;视图酉摝该大?,小于丌;缺省值相當于45度。?
des cription 標識一個可以通過視點菜單或其它設備被公開訪問的視點。若沒有des cription,該視點不會出現在流覽器的GUI中。當用戶在GUI中選擇一個視點時,瀏覽器或者逐漸移動到新位置,或者直接跳到這個新位置。一旦到達該位置,將發出isBound和bindTime。事件。?
jump 表明在視點位置變化時,例覽器是否立刻將觀察者移動到新位置。若為TRUE的話,將立刻跳到新位置,不經過前后兩個位置之間的任何空間。?
事件?
set_bind eventln SFBool?
發出一個值為TRUE的該事件將該Viewpoint節點激活,使之成為場景當前的Viewpoint節點。?
bindTime eventOut SFTime?
視點被激活的時間。該輸出事件用來在一個給定視點被激活時開始運行一個動畫或腳本。?
isBound eventOut SFBool?
當瀏覽器到達一個指定的視點并被激活時,該事件值為TRUE。?
說明?
視點定義了處于局部坐標系中的一個指定位置,用戶可以從該點來觀察場景。?
視點可以被放置在VRML世界中來指定在剛剛進入場景 中的觀察者的初始位置。例如:URL語法“…/scene.wrl#EastGate”指出當用戶進入scene.wrl世界時的初始位置是scene.wrl文件中 DEF EastGate Viewpoint {…}定義的地方。
瀏覽器保存一個Viewpoint節點的堆棧。誰棧的頂部的Viewpoint節點是當前激活視點。如果要將一個視點壓到Viewpoint節點堆棧的頂部,就要送一個TRUE給該節點的set_bind輸入事件。該視點一旦被激活,瀏覽器窗口中的景物也做相應變化。給set_bind事件發送FALSE值將會從堆棧中彈出Viewpoint節點,激活棧中的下一個視點或默認視點。?
可以先激活一個觀點,再移動這個視點使用戶視圖不斷變化。?
VisibilitySensor節點?
VisibilitySensor { ?
center 0 0 0 # exposed field SFVec3f?
size 0 0 0 # exposed field SFVec3f?
enabled TRUE # exposed field SFBool?
}?
?
?
域?
center 該傳感器的包圍盒中心。?
size 該傳感器的包圍盒在x、y、z方向的大小。?
enabled 指出VisibilitySensor是否處于激活狀態。若為FALSE,則傳感器不送出輸出時間;若為TRUE,則傳感器檢測用戶是否進入指定的包圍盒,并通過isActive事件來發送輸出事件。?
事件?
isActive eventOut SFBool?
TRUE表明用戶已進入包圍盒;FALSE表明用戶不再包圍盒內。?
enterTime eventOut SFTime?
進入包圍盒的時間。?
exitTime eventOut SFTime?
走出包圍盒的時間。?
說明?
當用戶瀏覽時,VisibilitySensor檢查用戶是否進入包圍盒。當用戶進入包圍盒的任意一部分時,他輸出一個值為TURE的isActive事件;當用戶退出包圍盒時,他輸出一個值為FALSE的isActive事件。?
VisibilitySensor節點?
VisibilitySensor { ?
center 0 0 0 # exposed field SFVec3f?
size 0 0 0 # exposed field SFVec3f?
enabled TRUE # exposed field SFBool?
}?
?
?
域?
center 該傳感器的包圍盒中心。?
size 該傳感器的包圍盒在x、y、z方向的大小。?
enabled 指出VisibilitySensor是否處于激活狀態。若為FALSE,則傳感器不送出輸出時間;若為TRUE,則傳感器檢測用戶是否進入指定的包圍盒,并通過isActive事件來發送輸出事件。?
事件?
isActive eventOut SFBool?
TRUE表明用戶已進入包圍盒;FALSE表明用戶不再包圍盒內。?
enterTime eventOut SFTime?
進入包圍盒的時間。?
exitTime eventOut SFTime?
走出包圍盒的時間。?
說明?
當用戶瀏覽時,VisibilitySensor檢查用戶是否進入包圍盒。當用戶進入包圍盒的任意一部分時,他輸出一個值為TURE的isActive事件;當用戶退出包圍盒時,他輸出一個值為FALSE的isActive事件。?
WorldInfo節點?
WorldInfo { ?
title " " # SFString?
info [] # MFString?
} ?
域?
title 瀏覽器在窗口的標題欄上顯示的當前世界的標題。?
info 關于世界的其它信息,如作者、版權等。?
說明?
WorldInfo節點含有世界的有關信息。它對該世界的視覺效果和動作沒有任何影響,僅僅作為文檔
總結
以上是生活随笔為你收集整理的VRML语法基础跟简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结构之美——优先队列基本结构(四)——二
- 下一篇: SDN你必须知道的十大问题——SDN有哪