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 

# 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节点含有世界的有关信息。它对该世界的视觉效果和动作没有任何影响,仅仅作为文档

VRML语法基础跟简介相关推荐

  1. VRML语法基础和简介

    VRML简介和基础语法 -------------------------------------------------------------------------------- 一.VRML是 ...

  2. R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介

    R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介 分层语法的组成(data-stat-geom-scale-coord-facet) 用分层 ...

  3. C#基础编程——简介及基础语法

    C#基础编程--简介及基础语法 百科介绍 C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言.运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计 ...

  4. JAVA_web基础 JavaScript简介、基础、语法

    1. JavaScript简介 1.1. JavaScript由来 Netscape 发明了 JavaScript JavaScript由Netscape 在1995年发明.早期的主要目的是处理一些用 ...

  5. Lua语法基础(1)---简介、基本数据类型、表达式

    我觉得我已经陷入了一个坑内.因为,安装了Lua和SublimeText3编辑器之后,怎么使自己编写的lua代码在untiy内运行起来,是个我完全不了解的机制.先放一放吧.首先,来回顾一下Lua的语法基 ...

  6. jquery 语法基础

    来源:http://www.cnblogs.com/A_ming/archive/2011/05/04/2036293.html jquery 语法基础 基本语法: $("HTML元素&qu ...

  7. IDL语法基础(01)

    ⛄IDL简介 交互式数据语言--IDL(Interactive Data Language)是进行应用程序开发.科学数据分析与可视化表达的理想工具.IDL是基于矩阵运算的计算机语言,它语法简单,自带大 ...

  8. html+css语法基础

    一,html5语法基础 1,<!–注释-- >,/* */注释语句(因为直接输出不会显示,所以在每个标签前都加了空格) 2,< head>< /head>头部标签, ...

  9. 前端基础 - HTML简介及开发环境

    前端基础 - HTML简介及开发环境 HTML简介及开发环境 HTML简介: 英文:Hyper Text Markup Language(超级文本标记语言) 超级文本:普通文本只能显示文字,超级文本, ...

最新文章

  1. 解决读写Excel的第三方类库as3xls无法读取中文和写入中文的问题
  2. 在vue项目中引入高德地图及其UI组件的方法
  3. 解决IDEA2020.1版本不兼容Lombok的问题
  4. #求教# 公共less模块中的背景图片地址应该怎么处理?
  5. 03、MySQL—数据表操作
  6. 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)...
  7. [virtualenvwrapper] 命令小结
  8. java.net.NoRouteToHostException: Cannot assign requested address
  9. Python数据可视化案例一:自定义曲线频率、颜色与线型
  10. [Ext JS6] Grid不同列的关联编辑
  11. 二进制与格雷码相互转换
  12. Android Audio - HAL 层多声卡同时录音框架设计(多语言)
  13. 电商销量预测方法综述
  14. librosa 语音库(三) librosa.feature. 中的 spectrogram 与 melspectrogram
  15. 阿里云创建及管理bucket(二)
  16. 联发科发布全新旗舰5G芯片;全球半数雇主计划加薪并恢复至正常招聘水平 | 美通企业日报...
  17. nubia Z5 mini 小牛 黑砖qhsusb dload修复
  18. 第十届蓝桥杯单片机省赛题目解析
  19. 100多行PHP代码实现socks5代理服务器
  20. ICRA2021论文阅读-多传感器融合语义slam

热门文章

  1. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )
  2. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
  3. 新版谷歌浏览器设置flash插件不提示步骤
  4. 利用ConcurrentHashMap来实现一个ConcurrentHashSet
  5. Python3 之 JSON
  6. 二叉树的几种递归和非递归式遍历:
  7. VS2017一次性运行多个项目的方法
  8. 如何修改git已提交记录的邮箱?
  9. java程序向mysql插入中文变问号
  10. 啥叫正则表达式(语法详解)