java

位置:IT落伍者 >> java >> 浏览文章

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


发布日期:2024年07月16日
 
VRML与JAVA在网络课件交互运用

虚拟现实建模语言(Virtual Reality Modeling Language 即VRML)和Java语言都是 可执行的代码技术通过网络传输的只是一个很小的描述文件(指令性数据集)客户端通过本地的VRML浏览器JAVA虚拟机交互地访问这些文件并解释执行将Java与VRML结合能够很好地实现网络多媒体课件技术使用VRML进行场景构造内嵌用Java编写的程序设计实现对象的编程行为这使VRML在网上创建充满真实感的三维虚拟世界为用户提供一种自然的身临其境的体验方式包括交互性动态效果连续性及参与感而这将是未来网络教学的主要形式之一

VRML简单交互

VRML简单交互即VRML空间中各节点间数据交互VRML有统一的数据传输接口和完善的属性集合和事件集合可接收传感器节点发送过来的数值并根据所对应的接口属性域设置提取数据改变自身的属性值触发事件进而改变自己在空间中的位置外型和显示效果还可以将处理后的数据送到输出域传递给其他模型节点各节点通过接口域的相互路由(route to)实现数据传输路由的映射关系自由但接口域的数据规格必须严格一致

VRML扩展交互

VRML本身交互机制是无法构建一个大型多媒体课件的因为VRML本身不能完成普通程序设计中的转折分支循环等基本特征因此实际系统设计中可利用Java语言提供的强大网络编程能力编写与远程系统通信和共享能力处理等功能的应用程序Java对VRML的所有支持都通过附加的封装类实现通过这些类Java程序就能够访问VRML场景接受和发送事件从页面上得到VRML对象等实现对VRML场景的完全控制[]根据访问方式的不同又可分为脚本编程接口SAI(Script Authoring Interface) 交互与外部编程接口EAI(EAI External Authoring Interface) 交互

脚本编程接口SAI交互

SAI交互即使用事件机制和路由利用Script节点实现VRML与 Java(或JavaScript)的交互首先通过eventIn将事件传至Script节点中的脚本其次在Script节点中的脚本中调用相应的Java类(或JavaScript)进行处理最后通过eventOut将结果送回到VRML场景以实现动画或交互

VRML的Script节点是一种控制传感器和内插器的节点通过它可以定义和改变场景中对象的外观和行为Script节点的URL域可以包含一段JavaScript程序或者是链接的一个JavaClassSCRIPT节点可放置在场景的任何地方用DEF命名它从而完成事件的删除成传递SCRIPT节点的字段是由用户延伸的到达这些字段的字段会自动移到和SCRIPT节点相关程序中另外SCRIPT节点也能够通过编写合适程序脚本动态生成(改变)三维造型并绑定合适的感应器和内插器

Java通过Script类(vrmlnode包)与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) 作为参数的fieldNameeventInNameeventOutName要与Script节点中定义的名称相符合对应的Field类的子类(vrmlfiled包)与Script节点中定义的各种Type类型一致它提供getValue()和setValue()方法

再则通过Script类提供的processEvent(Event p)或processEvents(int p Event[] p)方法来捕获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中的各类节点完成整个通信过程

Java通过Script节点和Node类(vrmlnode包)直接修改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 pgetEventIn(String p)方法分别得到节点的field和eventIn域并把结果作为Field类再通过各Field类的子类提供的方法读取和设置值将设置结果直接返回节点不用再设置路由从而达到了直接修改节点的目的

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

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

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

添加和删除路由addRoute(SFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn)deleteRoute(SFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn)

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

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

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

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

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

外部编程接口(EAI)交互

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

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

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

Browser类提供了三个方法getBrowser(Applet pApplet)getBrowser(Applet pAppletString frameNameint 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 valuedouble timeStampObject data)方法响应事件

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

总结

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

               

上一篇:实战Java多线程编程之不提倡的方法

下一篇:深入讨论JAVA字节码加密技术(1)