VRML与JAVA在网络课件中交互运用分析

虚拟现实建模语言(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中的各类节点,完成整个通信过程。

2.1.2 Java通过Script节点和Node类(vrml.node包)直接修改VRML节点

通过Script节点和路由,同时又必须在Script节点的eventOut域设置控制点,java程序才能改变VRML文件中节点值。当有大量数据需要传送时,这种给每个数据设置一个eventOut域加一个路由的方法显然是相当麻烦的。因此java,提出直接修改节点的方法。

Java直接修改场景中的节点,仍然要用到Script节点。首先在定义Script节点时,将eventOut域改为field域,fieldType定义为SFNode,具体格式如下:

“field SFNode fieldname USE nodeName”。 “nodeName”为要修改的节点名称(在VRML中由DEF语句命名),产生一个指向名为nodeName节点的指针。执行初始化时通过getField()方法得到相应的SFNode类的一个实例,通过getValue()方法得到该类的值,这里它的值恰好是名称为nodeName的Node类的实例,然后通过Node类提供的方法直接修改节点。getExposedField(String p0)、getEventIn(String p0)方法,分别得到节点的field和eventIn域,并把结果作为Field类;再通过各Field类的子类提供的方法读取和设置值,将设置结果直接返回节点,不用再设置路由,从而达到了直接修改节点的目的。

Node类还提供了getEventOut(String p0)方法,用它可以得到节点的eventOut域,与前两个方法不同,它得到的结果是一个不能修改的Field类,即Field类的子类ConstField类。 使用改进后的方法,可以有效的缩减代码长度,节省VRML文件的计算时间,提高VRML场景的生成速度。

2.1.3 Java通过Script节点和Browser类(vrml包)直接创建VRML场景

设置Group节点的addChindren和removeChindren的值来可添加和删除具体节点,但还无法操作路由。当有大量不同的并相互关联的节点要通过java在VRML中创建时,工作量是难以想象的。为了满足这一要求,Script类继承BaseNode(vrml包)类,BaseNode类中定义了两个方法:getBrowser()和getType()。getBrowser()方法将会返回BaseNode类所处的浏览器。Browser类存在于vrml包中,它提供了一系列方法来对整个VRML文件进行控制。 如:

(1)、添加和删除路由:addRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn),deleteRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn)

(2)、直接创建VRML:createVrmlFromString(SFString vrmlSyntax)(把要创建的节点语法以字符串的方式作为参数写入)

(3)、在VRML中建立相应节点:createVrmlFromURL(MFString url,SFNode node,SFString event)(该方法的提供节点语法的参数是放在url地址所指出的VRML文件中,浏览器通过url找到要加入的节点,把它加入到node参数指定的节点中event参数指定的eventIn域中)

(4)、用指定的节点来替换整个VRML文件:replaceWorld(MFNode nodes)

用url指定的另一个VRML文件来替换当前的文件:loadURL(MFString url,MFString parameter)。

Script类执行initialize()方法时,得到浏览器实例,然后processEvent(Event e)方法执行时使用上述方法建立、修改VRML场景。 通过改进,不仅VRML文件代码长度缩减,java程序代码也大大减少,进一步提高了VRML场景的生成速度。

2.2外部编程接口(EAI)交互

SAI交互VRML离不开Script节点和Script类(vrml.node包)。为了实现通信功能编写的java类都必须继承自Script类。但java不支持多继承,如果用Applet操控VRML场景, java程序要继承Script类的方法相当复杂。特别是要把VRML文件与Applet集成在同一个HTML页面时,用Script类来实现颇为困难,而且程序代码冗长、可扩展性差。

VRML97标准提供的EAI定义了外部环境怎样通过VRML现存的事件驱动模式来访问VRML内部的节点的一系列方法,实现了Applet与VRML场景的通信。EAI包含浏览器脚本接口的全部功能,例如查询浏览器的状态,增加或删除路由,生成新的节点等功能。

Java主要使用Browser和Node两个类(vrml.external包),以及其它一些如处理eventIn域和eventOut域的各个属性类(EventIn*、EventOut*)和处理例外的各种*Exception类完成对EAI的描述。

Browser类提供了三个方法:getBrowser(Applet pApplet)、getBrowser(Applet pApplet,String frameName,int index)和getNode(String name)方法。前两个方法是静态方法,直接在Applet类中使用这两个方法得到Applet类和VRML所在的浏览器类的实例。getNode()方法可以直接得到VRML文件的具体节点(Node类)的实例,用InLine语句嵌入在VRML文件中的各个节点是用getNode()方法是无法得到的。这里的Node类与方法一的Node类是完全不同的,它用自己的getEventIn()和getEventOut()方法来得到VRML节点的各个域。然后使用返回的Event*的实例的getValue()和setValue()方法来控制具体的值。EventIn*类仅提供了设置值的setValue()方法;EventOut*类相对复杂,不仅提供了getValue()方法来获得当前值,还提供了监听EventOut域的接口??EventOutObserver,随时监听VRML节点中是否有新的EventOut事件发生,一旦有新事件发生,通过替代该接口提供的callback(EventOut value,double timeStamp,Object data)方法响应事件。

通过Browser和Node类,可以抛弃Script节点和Script类甚至路由而现实对VRML文件的各种节点即Node类的各个实例直接操控。但getBrowser()方法的参数必须是Applet的实例,因而该方法只能通过Applet来控制VRML。

3.总结

VRML与其它实现三维场景的技术手段(如OpenGL,Cult3D,3DSMAX,Viewpoint)相比,具有语法简单、三维建模功能强大、便于网上发布等优点。但由于VRML本身仅仅是一种标准,不可能满足各行各业的所有需要。所以,高级交互功能的实现必须借助于Java等功能强大的高级语言。这样,可以有效地弥补VRML本身的一些不足(例如逻辑判断、文件操作、键盘输入、精确控制场景等),进而完善与HTML等其它媒体的交互,也可实现复杂的虚拟环境系统网络课件。

时间: 2024-10-11 13:06:57

VRML与JAVA在网络课件中交互运用分析的相关文章

java 从网络Url中下载文件

转自:http://blog.csdn.net/xb12369/article/details/40543649 /** * 从网络Url中下载文件 * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOExcepti

关于nspm品类产品在行业用户网络架构中的研究分析(建议安全自动化运维工具开发者,了解)

为配合NSPM产品在不同行业不同类型的网络架构中最大限度的发挥产品优势,探索不同网络架构中对产品的适配性.分多个行业目前的传统网络架构与未来演进的架构进行深入调研. 从目前数据中心所使用协议的数据层上看,IT方案都是以二/三层网络(例如以太网+IP网络)为基础的,例如GRE.VXLAN等等,其解决和设计方案就是为了解决现有网络的缺陷和不足,为某一个特定问题而设计的.而现有的二/三层网络本质问题并没有得到有效的解决,网络潜在的资源并未得到有效的利用,安全问题也并有效的管理和抑制.以下我们对不同行业

MVC模式在Java Web应用程序中的实例分析

MVC作为软件架构中及其重要的一种架构思想,在实际的java web项目开发中被开发者们广泛的应用.遵循MVC思想的所产生的解决方法也可以因实际情况的不同来进行不同的选择.这里以一个应用struts+hibernate+jsp的实例来进一步认识MVC. 学生管理系统中添加学生模块的的MVC架构: Model(系统的业务逻辑):Hibernate进行管理的数据实体+定义的业务逻辑的体现--------数据库操作类,也就是通常所说的Dao层 数据实体(PO,Entity): package PO;

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明文是yanzi1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出yanzi1225627.因此可以用来存储用户输入的密码在服务器上.现在下载文件校验文件是否中途被篡改也是用的它,原理参见:http://blog.c

用PowerPoint中的VB实现课件中的智能交互

http://www.duxiushan.net/index.asp?xAction=xReadNews&NewsID=294 我们使用PPT的目的只有一个,即更好地达成"沟通.演说.汇报.讲解.展示等"的预期效果,而非"秀"这个工具本身,尽管PPT可以做的看上去地很花哨. 既然使用PPT的目标并非PPT本身,而是其背后的沟通呈现目的,因此,我们更愿意定义这门为"管理沟通"课程,属"沟通呈现技能"的分支之一. 一名合格

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

java网络编程中拿到源后的写入动作

在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 1 //获取socket流,将图片上传给服务端 2 FileInputStream fis=new FileInputStream("c:\\12.jpg"); 3 4 //获取了输出流 5 OutputStream out=s.getOutputStream(); 6 7 //用数组作为缓冲 8 byte[]buf=n

java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程