VRML与JAVA

1.VRML的概念
  VRML是虚拟现实建模语言 (Virtual Reality Modeling Language)的简称,是一种基于文本的通用语言,是一种在网络上使用的描述三维环境的场景描述语言,是HTML的3D(三维)模拟。它定义了3D应用中大多数常见概念,如光源、视点、动画、雾化、材质属性、纹理映射等。VRML语言的诞生,尤其是新的VRML2.0标准,被称为第二代Web语言,它改变了原来WWW上单调、平面的缺点,将人的行动作为浏览的主体,所有的表现都将随操作者行为而改变。

2.VRML的发展历史
  VRML的历史可以上溯到1994年,当时在日内瓦的第一次WWW年会上,一些与会者提出为创建三维网络的界面必须有一种通用的描述性语言,用于在 WWW上超级链接——类似于超文本描述语言(HTML),于是诞生了虚拟现实描述语言(Virtual Reality Makeup Language)。稍后,改为虚拟现实建模语言 (Virtual Reality Modeling Language),用于反映图像的本质。现在世界上有一个管理 VRML 的团体 ,简称为 VRML结构组织 (VGA),VGA为网络的三维功能建立了标准。1995年5月,VRML1.0规范正式出台,但此规范缺少对一些关键特性如动作、交互和行为的支持,为此,急需对它进行修订。1996年8月,在新奥尔良举行的SIGGRAPH’96会议上公布了VRML2.0规范的第一版,经ISO JTCI/ SC2 4同意,这一版被作为14772号委员会草案公布,并且于1997年4月提交审议。该草案又称为VRML 97(遵循ISO把发布年号写入名字的命名约定)。从此之后,许多公司纷纷推出了自己的 VRML浏览器,如 Netscape公司 Live3D,IE内嵌的Microsoft VRML 2.0 Viewer,Apple公司的 Quick Time VR等等。

3.VRML产品的技术特点
  (1)低带宽、开放的标准、跨平台 VRML采用“可执行的代码”技术,有效克服了网络带宽造成的瓶颈。开发人员利用VRML可以不必在介质中传输内容大得惊人的图像和动画文件,而只需传输用VRML描述的小型指令性数据集。在客户端利用本地计算机的强大计算及三维图形功能便可把接收的瘦型文件转换成极富感染力的可视化数据。 由于Web应用框架是由开放的标准 (如HTTP,HTML,VRML等)组成,这些标准相对于硬件平台和操作系统平台是中性的。从开发者的角度来说,开放的标准意味着平台自由性。开发者能在Web应用框架上采用许多开发工具编写应用程序,并在许多硬件平台、操作系统下部署这些应用程序。
  (2)从LAN到Internet的可扩展性好 由于VRML和其他Web程序有着共同的网络通信协议TCP/IP,因而基于Web的虚拟产品技术既能在小型局域网上应用 ,又能在大型广域网乃至Internet上应用。
  (3)性能/价格比高 Web使用统一的通用客户端程序(即Web浏览器)处理显示来自不同服务器的数据,而这些服务器可以不同的协议、不同的格式传递文件。由于Web应用框架包含了开放标准,客户端程序可以使用HTTP协议访问HTML文件或Java Applet,使用FTP协议下载文件,使用SMTP或POP协议收发Email,通过VRML文件访问3D影象,以及访问许多其他的网络资源。这个通用的客户端程序消除了现在的C/S应用中往往需要不同客户端软件所带来的隐含费用支出。通用的客户端程序还使用户能够以一致的方式与所有基于Web的应用交互,减少了技术支持和培训费用。所有这些因素使得基于 Web的虚拟产品技术具有良好的性能价格比。

⒋VRML的作用原理
  VRML文件是以扩展名为wrl结尾的一种用来描述几何形体的ASCII文本文件,它不需要任何编译,直接由浏览器解释执行。当用户打开VRML文件时,系统首先装入一个内嵌的VRML浏览器,该浏览器将VRML语言中的信息解释成空间中目标的几何形体描述,如长方体,球体,不规则的其他三维物等等,同时它将提供实时显示,一秒显示多次,这样在用户的计算机上就会有一个活动场景的感觉。

1. 场景图结构
  VRML 2.0使用场景图(Scene Graph)数据结构来建立3D实境,这是以SGI(Silicon Graphics Inc.)的Open Inventor 3D工具包为基础的一种数据格式,其基本单元被称为节点(Node),场景图规定了节点之间的等级关系与嵌套关系。VRML2.0总共定义有54个节点,它大致可以分为如下几类 :
·造型节点。用于表示各种基本的几何体和用于任意几何体的线框图和面框图。
·属性节点。用于定义相关对象的颜色、材质、纹理以及摄像机组、灯光组、视点、背景等。
·组节点。用于将节点分组 ,把相关节点组合成为同一个对象。
·感应节点。用于感知用户的输入或动作 ,以触发相应的动作。
·其它节点。包括移动和旋转动作 ,脚本(Script)节点、超链接节点等。
  VRML2.0使用符合右手规则的三维坐标系统,原点在屏幕中心,它也是使用这一坐标系统的各种几何体的中心。所以,当根据构图要求,某个几何体的中心不在屏幕中心时(事实上,几何体的中心落在屏幕中心的情形是很少见的),就需要移动坐标系统,即使用Transform节点,在该节点内定义的几何体都使用该节点中所定义的平移后的坐标系统。可以想见,在构造一个较为复杂的场景时,这种坐标平移将是相当频繁的。
2. 事件驱动机制和传感器
  由面向对象编程技术可以知道,对象之间的相互作用是通过一个对象向另一个对象发出某个操作消息(message)而实现的,VRML也是这样。它在两个要传递消息的节点之间创造(或称为绑定)一个路由(或称为路径)。于是,第一个节点就可以通过路由传递消息给第二个节点。这样的消息称为事件(event),它包含的是一个值,即节点内需要传递的某个域值。当一个节点接受到某个事件时,它将根据新得到的域值,去进行一次数据更新,从而可能引发某个动作。通过绑定多个节点,就可以创建出复杂的线路 ,从而使创造出的世界充满动感和交互性。
  传感器(Sensor,或称检测器)是VRML中提供交互能力和动态行为的基元。一个具有动态能力的节点需包含传感器。VRML共提供7种传感器节点,即Cylinder Sensor、Plane Sensor、Time Sensor、Touch Sensor、 Visibility Sensor、Proximity Sensor。它们提供了用户与虚拟世界中的物体进行交互的机制:根据时钟或者用户的动作,它们可以产生一个相应的事件,这事件沿着事先设定好的路由传递下去,从而使得虚拟世界对用户做出反应 ,实现交互。

3. 动画的实现和内插器
  VRML的动画比普通动画更吸引人,因为当用户在一个虚拟世界中漫游时,他可以从各种角度来观察动画,而要完成一个复杂的从所有视点来看都成功的动画是很困难的。VRML动画的另一个特点是,在播放动画时没有一个固定的帧速率,如果动画是由Time Sensor驱动的,它就可以确保动画在固定的Cycle Interval时间内完成,这样做的好处是可以使动画与声音或其它时间固定的媒体相同步。
  内插器(Interpolator,或称插补器)是实现动画的重要手段之一。通过一个被启动的时钟节点(Time Sensor),不停地向内插器提供时间消息。内插器一旦接受到一个时间消息,就会结合其内的关键时刻列表,从自己的关键值表中 ,通过线形插值的算法,得到一个当前时候的关键值,并经过路由送至Transform节点的相应域,从而实现动画。(例:声波图)
  实现动画的另一种方法是使用描述符script,它是用于VRML 2.0各个节点的一种描述语言,是Java描述符语言的子集,其语法和Java script有相似之处。

  VRML以其文件体积小、实时着色、全方位的观看效果等优势而逐渐成为新一代的网络三维技术,在建筑、天文、机械制图等应用得如火如荼。但是,在Web课件中,VRML作品还依然停留在作为一种展示型的课件的阶段上,只是纯粹的给人观看,缺少动感和交互。目前,VRML技术在Web课件上用得最多的是在化学上,主要是展示化学分子的分子结构,这样的例子在K12(http://www.k12.com.cn/)、课堂教学课件站(http://spschool.myrice.com/)、123工作室(http://mz123.myrice.com/kjku)很多。究其原因是它自身还不是很完善,还存在着许多不足之处,只要表现在:
1.浏览器的控制比较困难
  用过的人都知道,几乎所有的VRML浏览器都是利用鼠标的拖动或键盘箭头来改变视角的方式来观看VRML世界的,没有比较精确的控制手段,因而很容易一拖都不知道拖到哪里去,定位很困难。
2.VRML的与外界的通信能力比较差
  VRML几乎不与HTML文件进行通信,仅仅是作为一个插件嵌入到网页中去,VRML的数据传不到HTML中,HTML也没法读取VRML的数据。
3.VRML与用户的交互界面比较弱
  VRML的交互还仅仅限于鼠标单击及移动,没提供其它友好的用户界面了。最糟糕的是它没提供用户输入数据的功能,这对于一般的用户,特别是课件是使用者来说是极大的不便!教学课件的必须交互手段之一是可以根据学习者输入的数据作出不同的响应,而VRML在这方面就显得无能为力了,这大大影响它在网络课件中的发展。
  幸运的是,VRML的Script节点的URL域可以与JAVA接口,为其扩展提供了可能性。我们可以借助JAVA的强大功能大大延伸VRML的功能,使得它可以在网络课件发挥得更好。

 1991年,SUN MicroSystem公司的JameGosling、BillJoe等人,为在电视、控制烤面包箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件(即一种橡树的名字),但当时并没有引起人们的注意,直到1994年下半年,Internet的迅猛发展,环球信息网WWW的快速增长,促进了Java语言研制的进展,才使得它逐渐成为Internet上受欢迎的开发与编程语言。JAVA语言兼具解释型语言(如BASIC语言)和编译型语言(如C语言)两者的优点,具有执行效率高、程序的可移植性以及安全性好的特点。
1. JAVA语言的优点
  ☆是一种专门为网络应用而开发的语言;
  ☆以C++为蓝图,真正面向对象;
  ☆取消了指针概念,由计算机自动管理内存,因而安全可靠;
  ☆结构标准且移植性高,具跨平台性;
  ☆具有很高的可扩展性;
2. JAVA语言的类(Class)和包(Package)
  类是有所有相似对象的状态变量与行为构成的模板(template)或原型(prototype)。
  包(Package)由一组类(class)和界面(interface)组成。它是管理大型名字空间,避免名字冲突的工具。每一个类和界面的名字都包含在某个包中,通常在程序中由 import 导入。JAVA自带了许多类包,我们可以直接利用类包所提供的功能而不必重新从底层写起,大大的减少了编程的工作量,提高了编程效率。
    语言基础类  java.lang
    实用工具类  java.util
    输入输出类  java.io
    AWT类库    java.awt
    Swing类库   java.swing
    网络类库   Sockets、Telnet、ftp、NNtp、WWW
    浏览器类库  Applet、Audio、Links、Style、Properties

 JAVA 3D是一个用于开发三维图形的API,它从高层次为开发者提供对三维实体的创建、操纵和着色,使开发工作变得极为简单。同时,JAVA 3D的低级API是依赖于现有的三维图形系统的,如Direct 3D、OpenGL、QuickDraw 3D和XGL等,它可以帮助我们:
  ☆生成简单或复杂的形体(也可以直接调用现有的三维形体)
  ☆使形体具有颜色、透明效果、贴图。
  ☆可以在三维环境中生成灯光、移动灯光。
  ☆可以具有行为(Behavior)的处理判断能力(键盘、鼠标、定时等)
  ☆可以生成雾、背景、声音等。
  ☆可以使形体变形、移动、生成三维动画。
  ☆可以编写非常复杂的应用程序,用于各种领域如VR
  JAVA 3D的这种体系结构既可以使其开发的程序“到处运行”,又使其能充分利用系统的三维特性。就因为JAVA 3D拥有如此的强大的三维能力,使得它在网络世界,特别是在游戏中能大展姿彩。但是,由于其要求复杂的编程要求与慢如蜗牛的运行速度,使得其发展大打折扣。

 基于Web上的课件从以前的简单文字显示、图文并茂、声画俱全到视频的运用,一直到现在的三维立体技术,这是一个发展的历程,也是一个必然的趋势。声音、动画能集中学习者的注意力,三维立体的世界更能引起学习者的莫大兴趣。化学的原子结构、生物的解剖图、物理的运动、立体几何的图形变换等的网络课件用VRML技术表现就最好不过了。再配合JAVA的强大控制能力,VRML世界带来的视觉、听觉上的感官效果令学习者能在网络上感受到现实生活的学习环境,甚至还能感受到真实学习环境所不能达到的效果。以下是一些基于JAVA与VRML技术的三维立体Web课件。
※旋转几何体
  抽象的空间想象、错综复杂的线线面面,立体几何对学生来说是历来是最头疼的。在本课件里,你可以看到一个菱形绕着轴心旋转是怎么样子的。基于该思想,你可以设计出其它形状图形(如三角形、矩形、圆形等)的旋转、变换过程。学习者可以从720度全方位的角度看到这个过程。本课件利用了JVAVA的createVrmlFromString()函数接口即时生成大量的VRML形体,再旋转组合而成。
※氢氧成水
  在这里,你可以看到氢分子跟氧分子是怎么结合成水分子的。通过简单的修改,我们可以轻易的做出其它原子、分子的动态结合图。
※活动地球仪
  在这里,你可以象在真实环境一样拨动地球仪了。本课件设计成可以从各个角度一度一度地转动地球仪。虽然在VRML浏览器里可以随意从不同角度观看物体,但它不能精确数值。在本课件里,我们可以通过旋转地球仪的角度、方向来学习经度、纬度、时差等地理知识。本课件通过坐标变换Transform的rotation来旋转物体的。

  我们以“旋转几何体”为例子,讲解一下VRML与JAVA的接口技术。由于VRML只有方体、圆锥体、圆柱体、球等几种基本的形体,因而,要建立复杂的几何体,只能利用基本形体重叠的方式来建立。本例子演示的效果是一个菱形绕着它的中心轴旋转一周,因此,我们采用JAVA动态生成的方式来制作。每生成一个菱形就绕着中心轴旋转 1 度,循环180次(一周)就可以达到我们所要求的效果了。下面是VRML文件的代码,十分简单。
#VRML V2.0 utf8

Background {skyColor 1 1 1}
DEF OBJ Transform {
  children [
    DEF TS TouchSensor {}
    DEF shape Transform {
          rotation 0 0 1 0.785398
          children [
            Shape {
              appearance Appearance {
                material Material {
                  diffuseColor 0.5 0.2 0.7
                }
              }
              geometry Box {size 5 5 0.2}
            }
          ]
    }
  ]
}
DEF Rot Script{
    url “Rotation.class”
    eventIn SFBool touched
    eventOut MFNode RotIt
}

ROUTE TS.isActive TO Rot.touched
ROUTE Rot.RotIt TO OBJ.addChildren

  利用URL连接“Rotation.class”,变量touched作为事件的传入口,变量RotIt作为事件的出口。当接触传感器TS检测到鼠标被按下后,“ROUTE TS.isActive TO Rot.touched”使touched的值变为真。下面的JAVA程序被加载执行。
//Rotation.java
import java.util.*;
import vrml.*;
import vrml.node.*;
import vrml.field.*;
//线程接口
public class Rotation extends Script implements Runnable{
  MFNode RotIt;
  int k;
  float R=1.0f;
  Thread clockThread =null;
//初始化,取得RotIt的值
  public void initialize(){
    RotIt = (MFNode)getEventOut(“RotIt”);
  }
  //生成新的线程,循环180次
  public void run(){
    for(k=0;k<181;k++){
      R=(float)k/180*3.1415926f;
      rotation();
        try{Thread.sleep(10);} //暂停10毫秒
          catch(InterruptedException e){}
        }
    }
  //开始线程
  public void start(){
    if(clockThread ==null){
      clockThread =new Thread(this);
      clockThread.start();
    }
  }
  //停止线程
  public void stop(){
    try{
      clockThread.stop();
      clockThread = null;
    }catch (Exception e){}
  }

  //动态增加节点
  public void rotation() {
      String Rotation1 =
        ”Transform {” +
        ”  rotation 0 1 0 “;
      String Rotation2 =
        ”  children [” +
        ”Transform {” +
        ”  rotation 0 0 1 0.785398″ +
        ”  children [” +
        ”    Shape {” +
        ”      appearance Appearance {” +
        ”        material Material {” +
        ”          diffuseColor 0.5 0.2 0.7″ +
        ”        }” +
        ”      }” +
        ”      geometry Box {size 5 5 0.2}” +
        ”    }” +
        ”  ]” +
        ”}]” +
        ”}”;
      //取得VRML浏览器的句柄,产生一个新的节点
      Browser browser = getBrowser();
      BaseNode baseNodes[];
      //利用createVrmlFromString接口函数生成新的形体并检测异常
      try{
        baseNodes = browser.createVrmlFromString(Rotation1 + R +
                             Rotation2);
        //设置新的RotTt值并传送回VRML中
        if(null != baseNodes) {
          RotIt.setValue(baseNodes);
        }
      } catch (Exception ex) {
        ex.printStackTrace() ;
      }
      
    }
 //接收事件,取得touched变量的值
  public void processEvent(Event ev) {
   if(ev.getName().equals(“touched”)){
    start();
    }
  }
}
  VRML接收到JAVA传回的值后触发OBJ节点新增加一个子节点,从而形成我们所看到的效果。

发布于 :未分类

发表评论

电子邮件地址不会被公开。