创造网上虚拟现实

Author: 宋端智 Date: 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文件:
  <HTML>
  <HEAD>
  <TITLE>虚拟现实</TITLE>
  </HEAD>
  <CENTER>
  <EMBED SRC=″desk.wrl″ WIDTH=400 HEIGHT=200>
  <P>这是一个简单的虚拟现实例子
  </HTML>
  将本文件及desk.wrl放在同一目录下,在拥有VRML插件的Netscape或IE中运行,即可以看到页面里嵌入了所作的实例。