网上虚拟空间建造者VRML(初级)
内容:
一、VRML是什么
二、有哪些VRML的浏览器
三、VRML文件的组成部分和文件头
四、几个基本造型
五、文本造型
六、造型定位(平移、旋转和缩放)
七、使用材料控制外观
八、Group节点和DEF、USE语法
一、VRML是什么
VRML是虚拟现实造型语言 (Virtual Reality Modeling Language)
的简称。 它使得全球信息网 (Web) 上能够传送3D的信息。使用它,你能在Internet上设计自己的三维虚拟空间。可以建造虚拟的房间、建筑物、城市、山脉和星球。你能用虚拟的家具、汽车、人员、飞机或你能想象的任何东西来填充虚拟的世界。有了它,唯一限制的就是你的想像力。
VRML能让你在Internet上创建动态的世界和感觉丰富的虚拟幻境,还包括以下能力:
动画空间里的物体,使它运动。
在你的空间里播放声音和影象。
允许使用者和你在空间进行交互。
使用脚本来控制、改进你的空间,脚本是你创建来在VRML空间里实现动作的小程序。
(返回页首)
二、有哪些VRML浏览器
CosmoPlayer
由SGI公司(http://vrml.sgi.com/cosmoplayer/ )所开发,可以支援Netscape(
2.0版本以上)与IE(3.0版 以 上), 是目前浏览VRML2.0最普遍的浏览程式,安装后会取代已经安装的其他VRML浏览程式(包含Netscape内建的Live
3D),强调的特点为其顺畅的浏览功能,不会产生跳动的感觉,安装时会加入Intel所开发的RSX(Rea-listic
Sound Experience)2.0版本,以支援VRML中的音效,不过初使用时,它用以浏览的工具较难以接受与理解,不像Live
3D般直觉。现在的Netscape 4.x和IE4.0都内带CosmoPlayer 1.0。
Liquid
Reality
由DimensionX公司(http://www.dnx.com/
products/lr/index.html )所发展的浏览器,强调能与JAVA语言完全结合,并且包含一些不在VRML
2.0中出现的新节点功能,其特色在於VRML 2.0行为功能的表现与互动上,目前最新的版本仅支援Netscape
2.X(不包含3.X版本)。
Community
Place VRML 2.0 Browser
由日本Sony(http://sonypic.com/vs/ )公司依据其原来支援VRML
1.0与自订的VRML延伸格式(Extension-VRML)升级而来,为Netscape(2.0以上版本)的外挂程式(Plug-In),不仅支援VRML2.0版,最大的特点在於只要进入由Community
Place Bureau所建立的伺服网站中,即可以支援多重使用者功能,赋予一个虚拟的化身,在虚拟空间中进行对谈与互动。
(返回页首)
三、VRML文件的组成部分和文件头
VRML文本的文件名后缀是 .wrl,这是一种ASCII文本文件。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方向上平移的值
rotation
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 {}
}
]
}
请看一个复杂的旋转过程得到的效果 。
源代码请看Group节点和DEF、USE语法
(返回页首)
七、使用材料控制外观
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
]
}
]
}
请看效果 请转VRML中级教程