创造网上虚拟现实 宋端智 2000年 第7期 Java、Javascript、Flash等各种新技术使网页一改往日静止界面的模式,变得更加活泼,交互性也更强,但至今为止,我们的网页仍是以文本为主。假如某一天,我们在Internet上徜徉,就像在繁华的大街上闲逛,想购买某种商品,只需让你的替身在虚拟的世界中拿下它并付账,这种情形是否让我们激动?我们是否可以自己创造这种环境?答案是肯定的。一种专门用来在网上创造这种虚拟现实环境的语言VRML(Virtual Reality Modeling Language-虚拟现实建模语言)早已出现,只是由于硬件计算速度和网络速度的限制,还没有被广泛地应用。假若在你的网页上添加一些简单的虚拟现实模型供客人浏览、交互,绝对会增色不少。 #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文件: