虚拟现实建模语言(Virtual Reality Modeling Language 即VRML)和Java语言都是 可执行的代码”技术,通过网络传输的只是一个很小的描述文件(指令性数据集),客户端通过本地的VRML浏览器、JAVA虚拟机交互地访问这些文件并解释执行。将Java与VRML结合,能够很好地实现网络多媒体课件技术:使用VRML进行场景构造,内嵌用Java编写的程序设计实现对象的编程行为。这使VRML在网上创建布满真实感的三维虚拟世界,为用户提供一种自然的、身临其境的体验方式,包括交互性、动态效果、连续性及参与感,而这将是未来网络教学的主要形式之一。
1、 VRML简单交互
VRML简单交互,即VRML空间中各节点间数据交互。VRML有统一的数据传输接口和完善的属性集合和事件集合,可接收传感器节点发送过来的数值,并根据所对应的接口属性域设置提取数据、改变自身的属性值、触发事件进而改变自己在空间中的位置、外型和显示效果,还可以将处理后的数据送到输出域,传递给其他模型节点。各节点通过接口域的相互路由(route to)实现数据传输,路由的映射关系自由,但接口域的数据规格必须严格一致。
2、VRML扩展交互
VRML本身交互机制是无法构建一个大型多媒体课件的,因为VRML本身不能完成普通程序设计中的转折、分支、循环等基本特征。因此实际系统设计中,可利用Java语言提供的强大网络编程能力,编写与远程系统通信和共享能力处理等功能的应用程序。Java对VRML的所有支持都通过附加的封装类实现。通过这些类,Java程序就能够访问VRML场景、接受和发送事件、从页面上得到VRML对象等,实现对VRML场景的完全控制。[2]根据访问方式的不同,又可分为:脚本编程接口SAI(Script Authoring Interface) 交互与外部编程接口EAI(EAI External Authoring Interface) 交互。
2.1脚本编程接口SAI交互
SAI交互即使用事件机制和路由利用Script节点实现VRML与 Java(或javascript)的交互。首先,通过eventIn将事件传至Script节点中的脚本;其次,在Script节点中的脚本中调用相应的Java类(或JavaScript)进行处理;最后,通过eventOut将结果送回到VRML场景以实现动画或交互。
VRML的Script节点是一种控制传感器和内插器的节点,通过它可以定义和改变场景中对象的外观和行为。Script节点的URL域可以包含一段JavaScript程序或者是链接的一个JavaClass。SCRIPT节点可放置在场景的任何地方,用DEF命名它,从而完成事件的删除成传递。SCRIPT节点的字段是由用户延伸的,到达这些字段的字段会自动移到和SCRIPT节点相关程序中。另外,SCRIPT节点也能够通过编写合适程序脚本,动态生成(改变)三维造型并绑定合适的感应器和内插器。
2.1. 1Java通过Script类(vrml.node包)与Script结点建立联系,控制VRML结点
首先,定义Script节点中的各域域值,设置路由(Route)使VRML中的其它节点与Script节点联系起来。当与Script节点有联系的节点发生事件时,事件通过路由传给Script节点的eventIn域,Script节点则通过url域中指定的地址找到java类。
然后,Java类开始工作,最先执行的是initialize()方法:在initialize()方法中必须获得Script节点中eventIn或field域的值,或者把java中的值返回给Script中的eventOut域。Script类提供的方法有: getField(fieldName); getEventIn(eventInName); getEventOut(eventOutName); 作为参数的fieldName、eventInName、eventOutName要与Script节点中定义的名称相符合,对应的Field类的子类(vrml.filed包)与Script节点中定义的各种Type类型一致。它提供getValue()和setValue()方法。
再则,通过Script类提供的processEvent(Event p0)或processEvents(int p0, Event[] p1)方法来捕捉Script节点传递的事件。processEvent和processEvents方法是所有外部事件公共的输入点。Java程序通过替代这两个方法对事件做出相应的处理。Vrml包中Event类的getName()方法返回事件名称(该名称与Script节点中发生该事件的eventInName相同),确定发生的事件,从而做出相应的处理;Event类的getValue()方法则返回一个ConstField类的实例 (它是Script节点中发生该事件的eventIn域),ConstField类是Field类的子类,它没有setValue()方法,因而只能取出Script节点中eventIn域的值,而不能修改。
最后,所有事件处理完后,程序就调用Script类中的eventsProcessed()方法,在这儿可以加入用户想要实现的动画、交互等各种效果。Script类中的shutdown()方法实现离开VRML文件的方式。
通过Script节点,能java程序处理过的数据返回给VRML文件。通过初始化时getEventOut()得到的变量的setValue()方法将值传递给Script节点的eventOut域,再通过路由传递给VRML中的各类节点,完成整个通信过程。