分类:
2009-09-02 15:24:51
VRML文件以.wrl为后缀,它是一种文本格式的文件。可以用文本编辑器(如Windows下的notepad)打开编辑。在设计一些最简单的模型时,这种方法是最简便可行的。但是当场景变得复杂后,就需要利用一些专用的模型设计软件,这种软件称为VRML编辑器,常用的有ParaGraph International公司的Inter net3D Space Builder(简称ISB)、Sculptware公司的SiteSculptor等等。解释VRML文件并构造三维模型的软件称为VRML浏览器。VRML浏览器通常是以插件的形式附着在Web浏览器中,如IE、NetScape等Web浏览器都有自带的VRML浏览器,但这些浏览器的功能有限,对VRML的支持不很充分。一些公司开发的VRML浏览器则通常功能强大,如SGI公司的Cosmo Player、SONY的Community Place Brower等等。下面是一个VRML的简单例子,程序构造了一个半径为1个单位被照亮的三维红球。
程序例5.2.1 sphere.wrl
#VRML V2.0 utf8
Shape{
appearance Appearance{
material Material{
emissiveColor 1 0 0
}
}
geometry Sphere {
radius 1
}
}
图5-2-1 sphere.wrl
程序说明:
每个VRML2.0文件必须以下面的语句作为开始:
#VRML V2.0 utf8
“utf8”是国际标准组织确认的一个标准,在VRML文本节点中引导语言字符。以£或#开头的文本行是注释行,直到下一个回车符为止,它将被浏览器解释所忽略。
Shape 是VRML的一个节点类型(Node),它有两个字段(Field):appearan ce和geometry,分别用于定义物体的外观属性(如材质、纹理)和几何属性。
appearance字段后紧跟的Appearance也是VRML的一个节点,它的内容就是该物体的外观属性。
Appearance可以定义material(材质)、texture(纹理)和textureTransfo rm(纹理映射)三种属性。Material节点紧跟在material字段后面,其内容就是物体的材质属性。emissiveColor 1 0 0表示球的表面材质反射100%的红光、0%的绿光和0%的蓝光。
geometry字段后的Sphere节点表示物体是一个球体,radius 1 表示球体的半径是1个单位。
VRML是一个基于对象的语言,它提供3D空间中描述对象的格式,称为节点(node)。一个节点可以与C++或Java中的对象相对应,你可以把节点视为派生类型Box、Sphere、Sound、Spotlight等定义的基类。每个对象节点都有共同的属性,如类型名称、默认字段值和收发设置字段信息的能力(VRML2.0中的事件)。当你定义一个派生类时,你可以仅用默认值,就象在C++中使用一样。VRML的一个好处就是当你定义一个节点时,你总是包含一个可视的、有形的结果。
VRML提供了许多预定义的节点,例如从你的场景元素继承特性生成的对象库,它还可以使你通过原型派生和使用自身的节点。
在VRML场景中通过把节点分组生成场景图来组织虚拟世界的布局和功能。场景图有点象树根,树干是最高结构层,子群组成树枝,节点在下面。在场景图分层结构中,子节点从它的每个父节点继承如位置、方向等特性。
为了说明问题,程序例5.2.2的结构如图5-2-2所示,显示了VRML场景图中节点的层次结构。在程序例中,DEF是增加节点名称的关键词。
程序例5.2.2 scene.wrl
#VRML V2.0 utf8
DEF TRUNK Transform {
translation 0.0 1.0 0.0
rotation 0.0 1.0 0.0 0.39
children [
DEF BALL Transform {
translation 3.0 0.0 0.0
children [
Shape{
appearance Appearance{
material Material {
emissiveColor 1 0 0
}
}
geometry Sphere { radius 1 }
}
]
}
DEF CUBE Anchor {
url [""]
children [
Shape{
geometry Box { size 1 2 2 }
}
]
}
]
}
图5-2-2 scene.wrl的场景等级结构
节点的字段(field)是参数或者关键字,它们的值描述了节点对象的属性。字段可以分为两类:属性字段,它用于对所要定义的节点定义属性,如:Spotlight节点的Ambient Intensity或Sphere Radius;“连接”字段,它用于把属性值传递给另外的节点。在程序例1.1中的Shape节点包括两个连接字段的例子:geometry字段,它接受一个Geometry节点的参数和Sphere、Box或Cone;appearance字段,它接受Appearance节点的描述。使用连接字段的节点可以使你在运行时使用事件触发器选择它的位置,例如传感器和脚本。其它的字段是私有的,其值只能在开始时设定。
为了在
VRML场景中定位对象,在Transform群组节点中使用Rotation字段,定义它的角度,然后使用Translation字段定义你希望物体所处位置的XYZ轴长度单位,具体转换将在下面章节详细说明。在VRML的场景中设置物体需要有明确的坐标,在同一个场景中,有一个统一的坐标系。这个坐标系是一个右手坐标系,在初始时(即观察者没有移动位置和改变视角),该坐标系的X轴为沿屏幕水平向右,Y轴为沿屏幕垂直向上,Z轴为从屏幕指向用户。
VRML的geometry节点对象参照这个坐标系,使用三维坐标系统描述点的位置。在初始状态下,VRML的geometry节点(除了文本)都被定位在空间坐标(0,0,0)点上,且高度以Y轴正方向表示(Text节点从缺省位置左端开始文本串,沿X轴正方向放置每个连续的文字)。
VRML提供了称为Primitives的许多种基节点对象,包括Box、Sphere、Cone和Cylinder,可以使用它们构造三维场景。这些Primitives只能提供一些基本的几何体,如果想构造更复杂的三维模型,如一个人脸的多边形面片,则需要利用IndexFaceSet节点,用多边形的数据去填充该节点内的相应字段。IndexFaceSet包含的每个顶点都由子节点Coordinate中的三维点列描述,而子节点CoordIndex中则列出了每个多边形的顶点在点列中的索引值,各个多边形的索引集之间用-1作为间隔。多边形的法线方向与所给的顶点顺序符合右手法则,即按照该多边形在CoordIndex中列出的顺序弯曲右手手指,拇指的方向就是多边形的法线方向。如果将IndexdFaceSet的ccw(counterclock wise)字段设置为FALSE(默认值为TRUE),则该节点内的所有多边形的法线方向都将反转。
程序例5.2.3 Paperplane.wrl
#VRML V2.0 utf8
Shape{
appearance Appearance {
material Material {
diffuseColor 1.0 1.0 1.0
emissiveColor 0.5 0.5 0.5
shininess 5
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [
0.0 0.0 2.5
-2.5 0.0 -2.5
-0.5 0.5 -2.5
0.0 -1.5 -2.5
0.5 0.5 -2.5
2.5 0.0 -2.5
]
}
coordIndex [
0, 1, 2, -1,
3, 2, 0, -1,
3, 4, 0, -1,
4, 5, 0, -1
]
normalPerVertex FALSE # 不为每个顶点指定法向量
ccw FALSE # 反转多边形的法线方向
solid FALSE
}
}
图5-2-3 Paperplane.wrl