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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于VRML_JAVA的虚拟场景交互的实现_马万全基于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或
Jav aScript);②在脚本中进行处理;③通过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].系统仿真学
报,2021,(7). [2] 舍曼,等.虚拟现实系统―――接口、应用与设计[M].北京:电子工业
出版社,2021. [3] (美)Burdea,等.虚拟现实技术(第二版)[M].北京:电子工业出版
社,2021. [4] 韦有双,等.虚拟现实与系统仿真[M].北京:国防工业出版社,2021.
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的虚拟场景交互的实现感谢您的阅读,祝您生活愉快。

相关文档
最新文档