创造网上虚拟现实
#1 一、现状
VRML是HTML的3D模拟,它使用VRML浏览器来描述现实世界和链接。VRML既可以用来建立真实世界场景的模型,也可以建立虚构的三维世界,就像许多游戏中的那样。在3D中浏览,并不等于把2D抛掉,你仍可以保留图像、视频和音频,但你拥有了最具吸引力的3D界面。VRML提供了6+1度的自由,你可以沿着三个方向移动,也可以沿着三个方位旋转,同时还可以建立其它3D空间的超链接。
#1 二、创建和浏览
VRML文件是虚拟空间的文本性描述。它是一个由文本编辑器(如记事本等)生成的文本文件,以.wrl为扩展名。当然也可由能够生成VRML三维空间的工具可视化地生成(如用3D Studio MAX生成),但这样生成的文件一般比自己编写的文件要大得多。
当你编写了一个符合VRML语法的文本文件,并以.wrl为文件扩展名,你就可以用VRML浏览器浏览了。IE和Netscape Navigator这两种最常用的浏览器只要是3.0以上的版本均可以安装用于浏览VRML文件的插件。IE5.0自带了一个Microsoft VRML2.0 Viewer。IE的浏览界面中包括中间的浏览区、左边和下边的操作按钮,通过鼠标或键盘的操作,我们可以在虚拟三维世界里穿行,对虚拟事务进行操纵。
#1 三、语法
目前一般的浏览器均支持到VRML2.0,因此仅介绍此版本的语法。
VRML三维空间是以浏览器的中点为缺省原点,从原点向右、向上和向下分别为X、Y、Z轴的正向。要想创建不在缺省位置的对象,必须使用调整原点位置的节点。
一个典型的VRML文件包括:文件头、注释、节点及其域、事件和路由等。
1.文件头:文件均以“#VRML V2.0 utf8”开头。文件头告诉浏览器该文件是①一个VRML文件;②符合VRML规范的2.0版本;③是一个使用国际UTF-8字符集的文件。
2.注释:注释以#号开始,结束于该行的最后。
3.节点:VRML文件包含描述空间造型及其属性的节点,这些是VRML的构件。单个节点描述造型、颜色、光照、视点,以及动画定时器、传感器、内插器等的定位和朝向等等。节点一般包括①节点类型;②一对括号;③括在括号中的一定数目描述节点属性的域(可选)和域值。由节点及其相关域定义的造型或属性在空间中被视为一个整体。
4.域及域值:域定义节点的属性。在一个节点中,可能有一个域,也可能有数个域,域的顺序是不重要的。域是可选的,因为每个域都有一个缺省域值,如果你不指定域值,VRML浏览器将使用缺省域值。域值定义如颜色、尺寸和位置等属性,每个值属于特定的域值类型,如浮点型、布尔型等。
5.定义及使用节点名称:VRML文件中每个节点都可认为是一个对象,我们在定义后可以任意引用。
6.事件和路由:为了使虚拟空间具有动感,便于用户交互,VRML提供事件和路由的定义和使用。在两个节点间创建一条通路(路由),通过发送事件使一个节点控制另一个节点的状态。其语法为“ROUTE 输出节点及事件 TO输入节点及事件”。
#1 四、实例
#VRML V2.0 utf8 #文件头
Group{ #基本组节点,将以下各节点编组
children [ #子节点列表
Shape{ # Group的子节点之一:桌面
appearance DEF Blue Appearance{ #定义蓝色外观节点即桌面的颜色
material Material{diffuseColor 0 0 1} #蓝色(RGB为0 0 1)
}
geometry Box{size 6.0 0.1 4.0} #桌面的几何形状:长方体(Box)
}
Transform{ # Group的子节点之二:桌腿一,同时也是只拥有一个子节点的组节点
translation -2.5 -1.5 1.75 #本组节点的基本坐标位置
children DEF Deskleg Shape{ #定义桌腿的形状,也是Transform组节点的唯一子节点
appearance USE Blue #桌腿颜色用已定义的蓝色
geometry Cylinder{ #桌腿的几何形状为圆柱(Cylinder)
radius 0.2 #圆柱的半径域和域值
height 3.0 #圆柱的高度域和域值
}
}
}
Transform{ # Group 的子节点之三:桌腿二
translation 2.5 -1.5 1.75 #桌腿二的坐标位置
children USE Deskleg #桌腿二的形状使用已定义的桌腿一的形状
}
Transform{ # Group 的子节点之四:桌腿三
translation -2.5 -1.5 -1.75
children USE Deskleg
}
Transform{ # Group 的子节点之五:桌腿四
translation 2.5 -1.5 -1.75
children USE Deskleg
}
Group{ # Group 的子节点之六:桌面上的球,同时也是一个编组节点
children [
DEF Mysphere Transform{ #定义桌面上的球
translation 0 0.55 0 #球的坐标位置
children Shape{ #球的形状
appearance Appearance{ #球的外观
material Material{} #球的颜色用缺省的白色
}
geometry Sphere{radius 0.5} #球的半径
}
}
DEF MysphereSensor PlaneSensor{ #定义球的平面传感器
maxPosition 2.8 0.55 #和下一句一起限制球的移动范围
minPosition -2.8 0.55
} ] } ]
}
ROUTE MysphereSensor.translation_changed TO Mysphere.set_translation #路由:将球的平面传感器的输出(鼠标移动位置)连接到球的输入(球的坐标位置)
将这段文字以文本形式存为desk.wrl,然后从带有VRML插件的浏览器中打开,我们即可欣赏这一实例了。在这个简单的实例中,绘制了一个拥有四个桌腿的蓝色桌子,在桌面上有一个白球。当将鼠标放在白球上方时,我们可以按住鼠标来水平移动白球,且白球的移动范围被限制在桌面内。从这个实例您是否发觉这种语言很直观而且简单?
#1 五、将VRML程序嵌入网页
将VRML程序嵌入网页中很容易实现。例如我们想将上面的desk.wrl放入网页中,可以编写下面的HTML文件:
<HTML>
<HEAD>
<TITLE>虚拟现实</TITLE>
</HEAD>
<CENTER>
<EMBED SRC=″desk.wrl″ WIDTH=400 HEIGHT=200>
<P>这是一个简单的虚拟现实例子
</HTML>
将本文件及desk.wrl放在同一目录下,在拥有VRML插件的Netscape或IE中运行,即可以看到页面里嵌入了所作的实例。