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

基于VRML/JAVA的虚拟场景交互的实现马万全1, 单美贤2(1.东南大学计算机科学与工程学院, 江苏南京210096;2. 南京邮电大学传媒技术学院, 江苏南京210003)摘 要:Javra是一

基于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-

V A 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 包中可以获得以下信息:节点

名; 域(域的属性

eventIn...>、类型

MFNode...>、域名、默认值); 类的层次关

系。在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/JAV A 的虚拟场景交互的实现

标签: