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 表示传感器当前是否检测定点设备的事件。可向该传感器发送一个值为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 以弧度为单位指定一个视图域。小的角度嗨圃督咕低返男Ч淮蟮慕嵌炔嗨乒憬蔷低返男Ч皇油加蛴Ω么笥?,小于丌;缺省值相当于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节点含有世界的有关信息。它对该世界的视觉效果和动作没有任何影响,仅仅作为文档