VRML2.0教程1:构造一个虚拟场景
来源:第三维度
作者:施寅,周葆芳,赵志勇
选自《VRML2.0使用速成》第四章
一个VRML 文件基本上就是一个按结构特点组织起来的对象集。如同现实世界中一样, 每个对象都有一些物理属性, 包括形状、各种表面特性(颜色、光滑度、自发光等等)以及在三维空间中的位置。其它的VRML 对象还包括声音、光源和视点等等, 它们也都有自己的三维特征。
建立一个简单的物体
下面介绍怎样建立一个带紫色圆柱物体的VRML 文件。文件很短, 但它包含VRML 文件所有的基本成分: 文件头、外形节点、几何节点、外观节点和组节点。现在刚开始学习, 你不用完全理解这个例子中所有的细节, 你只要对VRML 文件的大框架有一个初步的认识就可以了。
1 什么是节点
节点是VRML 文件的基本组成元素。一部分节点表示一些对象, 如圆柱( cylinder )、圆椎( cone)、长方体( box)、聚光灯( spotlight )等等; 另一部分节点可以把相关节点放在一起。举个例子, 外形( shape) 节点包含一个几何节点和一个外观节点, 而这两种节点又能包含其它节点。除了产生视觉效果的节点外, VRML 还定义了一些提供特殊功能的节点, 如超链接( 它能把定义在别的VRML 文件中的对象引用到自己的场景文件中)、碰撞检测等。每个节点都有域( field) , 它存储着本节点的各种值。
在VRML 文件中, 你能建立包含别的对象的对象。例如在阿兹特克场景中, 每座神庙都是由许多分离的对象组成的。大金字塔由它的墙、台阶、顶上的两座神庙以及各种火盆和雕像组成, 而这些组成大金字塔的节点又是更低层次节点的父节点。
2 文件头
每个支持VRML2 .0 规范的文件都以下面一句开头:
# VRML V2 .0 utf8
这里utf8 指本文件采用ISO 的UTF-8 编码标准, 可参看附录B 中对文本节点的说明。
3 外形节点
接下来, 你将把物体( 圆柱)加入到文件中。在建立一个圆柱之前, 你必需先建一个外形节点, 它是几何对象最基本的组节点。每个几何节点都被包含在外形节点中, 外形节点为描述物体的外观留有专门的“插槽”, 你将学会怎样往“ 插槽”上增加诸如颜色、材质和纹理等的外观节点。
# VRML V2 .0 utf8 Shape {
appearance Appearance {
material Material { }
}
geometry NULL
}
4 几何节点
VRML 提供了球体、圆柱体、长方体和圆锥体等简单几何节点, 也为构造复杂几何造型提供了索引面集( IndexedFaceSet )节点。大金字塔塔腰上的两座小神庙的一部分就是由圆柱和长方体组成的, 泰诺切蒂特里城场景中的其它大部分建筑物都是用索引面集节点构造的。下面建立一个取缺省值的圆柱体的VRML 文件描述:
# VRML V2 .0 utf8 Shape {
appearance Appearance {
material Material { }
}
geometry Cylinder { }
}
注意: 在文件格式中, 被讨论的对象将用黑体字表示。
每个节点都包含一组定义节点自身属性的域。节点的域名以及它的取值类型都是规范中定义好了的, 节点的各个域可以按任何顺序排列, 有关节点及其包含的域的详细情况参看附录B 的“节点说明”。
当你建立一个节点时, 它包含的所有域也自动建立起来并被赋予了缺省值。前面例子中由于没有为圆柱的域指定任何值, 所以取的是缺省值———半径为1、高为2 , 并且所有的面都可见, 缺省的位置是在计算机屏幕的中央, 材质也取的是缺省值。
注意: 在上面的例子中, 如果你不指定材质节点, 那么物体将是黑的, 你看不见它, 而上例中包含了一个空的材质节点, 物体的颜色就是材质的缺省颜色( 灰白)。
你也可以为节点指定新的域值。例如, 你想让这个圆柱看起来像个大杯子的话, 可以这样给它赋值———半径为3、高为6 , 并且顶面不显示出来。
# VRML V2 .0 utf8 Shape {
appearance Appearance {
material Material { }
}
geometry Cylinder {
radius 3 height 6
side TRUE
top FALSE
bottom TRUE
}
}
用浏览器看到的这个圆柱如图1 所示。
图1 简单的圆柱
注意: 在VRML 文件中, 节点名以大写字母开头, 域名用小写字母开头, 节点的域用一对大括号括起来。
5 外观节点
除几何造型外, 物体还有一些表面属性, 例如颜色、表面光滑度、光泽等等。通常用来赋予物体表面属性的节点有材质节点和纹理节点, 后者包括图片纹理( ImageTexture )、影像纹理(MovieTexture) 等。
这里是一个材质节点的例子, 它指定一种紫色光泽材质。
Material { diffuseColor .5 0 .5 shininess .5}
为简单起见, 例子中的一些域被省略掉了, 详细信息可参考附录B“节点说明”。
dif fuseColor 域包含三个值———颜色的红、绿、蓝分量。通常把它们称为“RGB”, 值(0 , 0 , 0 , ) 是黑颜色(就是没有任何色彩) ; 值( 1 , 1 , 1 ) 是白颜色; 值( 5 , 0 , 0 .5 )指定50% 的红颜色, 没有绿色, 再加大50%的蓝颜色, 最后结果是紫色。
shininess 域取一个0 .0~1 .0 的值。小的值在物体表面产生柔和的散射效果, 大的值产生集中的强对比的高光效果。材质节点还可以让你指定别的一些属性, 如物体的透明度、物体高光的反射量以及像太阳、灯泡这些物体的自发光强度。
现在, 紫色圆柱完成了, 下列例子中列出了这个简单VRML 文件的清单。
[例1] 一个紫色圆柱。
# VRML V2 .0 utf8 Shape {
appearance Appearance {material Material {
diffuseColor .5 0 .5 shininess .5
}
}
geometry Cylinder {
radius 3 height 6
side TRUE
top FALSE
bottom TRUE
}
}
这个例子说明了怎样在VRML 文件中使用节点, 特别是材质节点被用作了外观节点材质域的域值, 同时, 外观节点又是外形节点外观域的域值。图2 是从浏览器看到的这个紫色圆柱。
图2 紫色圆柱
图3 紫色圆柱的场景框图
6 场景结构图
画出场景框图通常是很有帮助的, 特别是在开始设计场景中节点关系的时候。本书中为场景框图做了几个简单约定, 如图3 是紫色圆柱场景的框图, 图中圆圈表示组节点以外的节点(它们不包含别的节点作为节点, 这要和节点作为域值区别开)。场景框图模仿VRML 文件的结构, 子节点都放在父节点的右侧。同一父节点的子节点, 如例子中的外观节点(Appearance )和圆柱节点(Cylinder ) , 就以垂直顺序向下排列。
7 分组节点
几乎在所有情况下, 你都需要建立一组对象, 并把它们放入到场景文件中。VRML提供了一些分组节点用来把共同完成一定功能的节点组织在一起(即包含在分组节点的大括号内)。这些节点是Group (组)、Transform( 变换)、LOD( 分层细节)、Switch ( 切换)、Anchor ( 锚)、Inline( 在线) 和Collision ( 碰撞检测)。一些像Cylinder ( 圆柱)、IndexedFace-Set (索引面集) 、Appearance (外观)和Material(材质) 等节点要限制地使用, 它们不能用作分组节点的子节点。
如果只是以组合为目的的话, 那么用Group 节点就够了。如果你想按空间坐标给物体分组的话, 那么就得用Transform 节点, 它可以让你通过平移、旋转等变换在三维空间中放置一个物体, 你还可以用它来放大或缩小物体。
下面是一个如何移动场景中紫色圆柱的例子。
[例2] 移动紫色圆柱。
# VRML V2 .0 utf8 Transform {
translation - 2 .4 2 3
children [
Shape {
appearance Appearance {
material Material {
diffuseColor .5 0 .5 shininess .5
}
}
geometry Cylinder {
radius 3
height 6
side TRUE
top FALSE
bottom TRUE
}
}
]
}
图4 列出了相应场景的框图, 图中黑圆圈代表变换分组节点Transform。
图4 移动后紫色圆柱场景的框图
translation 域的三个值指定了物体分别沿x , y , z 坐标轴移动的单位数。VRML 采用的是右手坐标系, 即x 轴正向水平向右, y 轴正向向上, z 轴正向垂直于计算机屏幕向外(如图5 所示) 。值( - 2 .4 , 2 , 3 )意为将物体在x 方向移动- 2 .4 个单位(就是从坐标原点向左移2 .4 个单位) , y 方向移动2 个单位, z 方向移动3 个单位。
8 注释语句
VRML 文件中的注释语句是以# 号打头的字符串, 范围是从# 号到这一行的行尾。下面这一行语句:diffuseColor .5 0 5 # Purple 浏览器将忽略注释“ # purple”。