基于VRML_JAVA的虚拟场景交互的实现_马万全

更新时间:2024-05-07 01:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于VRML/JAVA的虚拟场景交互的实现

马万全1,单美贤2

(1.东南大学计算机科学与工程学院,江苏南京210096;2.南京

邮电大学传媒技术学院,江苏南京210003)

摘 要:Javra是一个以EAI为基础的处理VRML场景图的Java包,克服了VRML与Java通过内

部Script节点和EAI方式进行交互的不足:用户操作实时生成的VRML事件可以在Javra中捕捉

到并加以处理。Javra和VRML浏览器的结合,使得生成3D交互应用程序更有效。 关键词:Java;VRML;EAI;Javra;场景图

中图分类号:TP311 文献标识码:A

VRML(Virtual Reality Modeling Language)虚拟现实建模语言,是一种三维造型和渲染的图形描述性语 言。通过VRML,人们可以建立丰富的三维场景,但是VRML本身并没有直接和用户进行交互的能力,它

需要与其他评议结合才能实现三维场景和用户交互的要求,Java语言提供了这种可能性。本文主要论述

VRML与Java的交互方式和Javra的使用。 1 VRML与Java之间的交互方式

VRML产生事件的方式可以归结为基于TimeSensor的静态行为和基于程序的动态行为两种,前者仅能

执行预定的决策逻辑,对于一些复杂的动画动作、实时控制事件、智能推理能力等,就需要其他编程语言(如

Java)的支持,当前主流VRML浏览器也都对Java编程提供了支持。在VRML中使用Java语言有两种方

式,即通过内部Script节点和外部编程接口(EAI)进行。 1.1 内部Script节点

图1 利用Script节点进行动画设计的框图 Script节点支持VRMLScript和 JavaScript(两者通过内置接口通信), 支持SUN公司的Java,其通过内置接 口或者专用API与VRML通信。 Script节点的URL域可以包含一段

JavaScript程序或者是链接的一个JA- VA class。利用Script节点进行动画 设计的过程可以用图1表示:①通过 eventIn将事件传至Script节点中的脚 本(Java或JavaScript);②在脚本中进 行处理;③通过eventOut将结果送回 Script节点。

通过Script实现的动态场景中的事件(输入和输出)均在VRML内部节点之间进行传递,虽然可以实现

相应浏览者的交互功能,但对于与外界的信息交流包括信息的输入和输出却显得力不从心。 1.2 外部编程接口(External Authoring Interface)EAI

Script节点从VRML场景内部提供了与Java的连接,而EAI定义了与外部HTML页面中的Applet通 信的接口。EAI技术是利用定义的一套针对VRML浏览器的Java类实现对VRML场景的控制,它的基本

思想是将Java applet与VRML置于同一web页面,在Java applet中建立browser对象以标识一个唯一的

VRML场景,并由此获得对VRML场景中已定义节点的引用,它通过直接指定引用节点的域值而达到动态 效果。这样Java applet即可控制VRML场景,也能进行与HTML等其他媒体的交互以及网络控制,从而可

以实现复杂的虚拟环境系统。 图2 EAI的交互原理图

图2是EAI的交互原理。A、Brows- er类是对VRML场景的一个Java封装, 通过getBrowser()方法获得当前浏览环 境信息;B、访问某个节点产生要用 Browser类的getNode()方法来获得一个 Node类实例;C、在获得Node类实例后, 可以通过Node类所提供的getEventIn() 和getEventOut()方法对节点进行访问; D、如果需要在Applet中实现VRML节 点的动态增加和删除,就得利用到Brows- er类的一个方法:createVrmlFromString ()。此方法的参数是一个内容符合

VRML规范的字符串,它返回一个Node

类的实例数组,这些Node实例是在VRML场景的外部环境中生成的。E、读取VRML场景中节点事件出

口所发出的最新值;F、当VRML场景中节点的事件出口发出一个事件时,能得到一个通知,激活callback方 法。

VRML浏览器通过EAI与Java程序进行通信,EAI使得程序员可以控制VRML世界,然而EAI不是

一个很方便的编程方式,因为由Java设计的节点不再能访问,或者说这些节点必须在VRML

中被激活,这

就使得用户接口变得不友善,我们可以通过Javra加以改善。 2 Javra

图3 Javra和EAI简单的关系图 Javra是一个以EAI为基础的处理

VRML场景图的Java包,VRML浏览器 处理基本的3D场景交互(如平移、旋转 等),Javra处理Java程序和VRML之间 的通信。Javra和VRML浏览器的结合, 使得生成3D交互应用程序更有效:具有 Javra的VRML场景图支持VRML节点 类和设置这些节点的方法,因为这些节点 可以完全自动生成;另外,当用户操作时 生成的VRML事件可以在Javra中捕捉 到并加以处理。

2.1 EAI与Javra的关系

图3是Javra和EAI简单的关系图。 EAI通过Node类和Browser类访问

VRML浏览器中的场景图。在Javra程序中生成本地的场景图,称之为JavraNodes,可以被其他文件或

VRML浏览器访问。在Javra程序中,场景图中的每一个JavraNode都对应着浏览器中的一个节点,当

JavraNode发生改变时,通过设置域值产生一个VRMLEvent并发送到浏览器,从而引起浏览器中相应节点

的改变。与此相似,浏览器能将VRML事件(如用户点击了场景中的物体)发送到应用程序。 2.2 JavraNode

图4 JavraNode的层次关系示意图 从Javra包中可以获得以下信息:节点

名;域(域的属性、类型、域名、默认值);类的层次关 系。在Java的类文件中为每一个exposed- Field域的节点生成set_和get_方法。部分类 的层次关系如图4所示(图中加黑的节点是 新引入的节点),所有的类都是JavraNode的 子类。例如图4中的Box节点,只有一个域 和一个set_和get_方法,Box节点继承于Ge- ometry,因而可以作为Shape节点的一个Ge- ometry域值。

class Box extends Geometry{ float[]get_size();

void set_size(float[]a); }

GroupingNode节点是新节点,其部分程序如下:

class GroupingNode extends ChildrenNode{ void addChildren(ChildrenNode[]a); void set_Children(ChildrenNode[]a); ...... }

3 Javra的使用

Javra节点的使用和VRML节点的使用一样,下面我们通过举例来说明如何建立、输出Javra场景图,如

何与Javra场景图进行交互。 3.1 Javra场景图的生成

在VRML中,场景图是由相关联的节点形成的,如Box基本造型的形成如下: Shape{

geometry Box{size 1 2 1} appearance Appearance{

material Material{diffuseColor 1 0 0} } }

下面一段程序是相应的Javra代码,节点之间的连接是调用相应的set_函数实现的。建立Javra场景图

需要有一定的VRML知识,一般而言,Javra场景图的生成如实地反映了VRML场景图的生成,只是VRML

中的域名XXX(如appearance)在Javra中是通过调用set_XXX(set_appearance)方法实现的。 Material m=new Material();

m.set_diffuseColor(new float[]{1,0,0}); Appearance a=new Appearance(); a.set_material(m); Box b=new Box();

b.set_size(new float[]{1,2,1}); Shape s=new Shape(); s.set_geometry(b); s.set_appearance(a); 3.2 Javra场景图的输出

Javra场景图可以输出到支持EAI接口的VRML浏览器中或一个文件中(通过调用场景图中上层节点

的print方法实现)。如果将Javra场景图输出到浏览器中,需要获得相应的浏览器句柄,可以通过调用相应

的EAI方法实现,如browser.replaceWorld(new Node[]{s.getNode(browser)});语句。ReplaceWorld方法是

再次调用browser nodes(Node[])的EAI方法,为了获得相应的节点,JavraNode通过调用getNode(browser)

方法来建立一个Node。

Javra除了可以用场景图取代虚拟世界外,Javra中的节点也可以加到已经存在的虚拟世界中,代码如下:

Node n=browser.getNode(“TOP”);

JavraNode j=JavraNodeFactory.createJavraNode(browser,n); Group g=(Group)j;

借助EAI获得一个在VRML世界中定义的浏览器节点,如“TOP”。节点n可以通过JavraNodeFactory

类的createJavraNode方法嵌入到JavraNode的j中。 3.3 与Javra场景图的交互

当场景图输出到浏览器后,场景的动态部分既可以通过Javra节点也可以通过浏览器节点使之改变。

用户与场景的交互通过浏览器实现,应用程序可以跟踪在VrmlEvents中的交互结果。Java通过EAI的

VrmlEventListener接口类来监听浏览器的接收事件。例如,对于TouchSensor传感器的touchTime事件,

Javra代码可以表示如下:

TouchSensor ts=new TouchSensor(); ts.advise(“touchTime”,listener,data);

其中参数listener是一个VrmlEventListener接口类的对象实例,data是用户指定的与该事件相关联的

对象,当该事件发生的时候,userData就会一同被返回。 4 结束语

Java的加入为VRML提供了强大的编程能力以及网络访问能力,使VRML这种描述性语言对各种需

求功能的扩充成为可能。VRML完成场景的描述和接口的定义,真正的交互和高级应用由Java来完成。

Javra和VRML浏览器的结合,使得生成3D交互应用程序更有效。正是由于Java和VRML的结合,使它们

成为创建基于网络的大规模虚拟环境的理想综合平台。 参考文献

[1] 王汝传,等.基于Java和VRML虚拟场景通信方式的研究[J].系统仿真学报,2003,(7). [2] 舍 曼,等.虚拟现实系统———接口、应用与设计[M].北京:电子工业出版社,2004. [3] (美)Burdea,等.虚拟现实技术(第二版)[M].北京:电子工业出版社,2005. [4] 韦有双,等.虚拟现实与系统仿真[M].北京:国防工业出版社,2004. Realization the Communication of Virtual Scenes Based on VRML/Java Ma Wan-Quan1,Shan Mei-Xian2

(1.Department ofComputer Science,South East University,Nanjing210096,China; 2.Nanjing UniversityofPosts and Telecommunications,Nanjing210003,China)

Abstract:Javra is a Java package for handling VRMLscene graph.Javra isbased upon the external authoring in-

terface(EAI).As programming tool between Java and VRML,Script node and EAI have some weaknesses,

which can be overcome by Javra,for example,.after a user acted,VRML events generated real-time can be

caught and handled in Javra.The combination of Javra and a VRMLbrowser forms an effective start for generat-

ing 3D interactive applications.

Key words:Java;VRML;EAI;Javra;scene graph

81第26卷 马万全,单美贤:基于VRML/JAVA的虚拟场景交互的实现

本文来源:https://www.bwwdw.com/article/4e5g.html

Top