⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vrml

📁 一片介绍虚拟现实虚拟空间协同生成原型系统的研究与开发的论文
💻
字号:
计算机应用研究
APPLICATION RESERCH OF COMPUTERS
2000  Vol.17 No.1 P.26-28
  

--------------------------------------------------------------------------------
 

VRML虚拟空间协同生成原型系统的研究与开发

刘一松

摘 要 以该文作者自行开发的VRML虚拟空间协同生成原型系统(MVRC)为基础,提出了借助VRML的外部程序接口EAI,人-机交互地生成VRML虚拟空间的方法;论述了通过采用集中式系统结构、利用TCP/IP协议下的Java Socket网络通信机制以及构造相应的网络通信数据包等方法,实现异地多个用户协同工作的过程。MVRC可以成为实现诸如虚拟教室、多用户虚拟展览馆应用系统以及虚拟社区的基础。
关键词 VRML EAI CSCW 虚拟空间生成

  虚拟现实建模语言(VRML)是描述虚拟环境中场景的一种标准,利用它可以在Internet上建立交互式三维多媒体虚拟境界。VRML的基本特征包括:分布式、交互式、平台无关、三维、多媒体集成、逼真自然等,被称为第二代Web,其应用领域非常广泛,包括科学研究、教育、工程、建筑、商业、娱乐、广告、电子商务等,已被越来越多的人所重视。
  VRML像HTML一样,用文本格式来描述虚拟境界,这种创建虚拟境界的方法,既繁琐又不直观,较难为一般使用人员所接受。VRML虚拟空间生成系统(VRML Authoring software)可以使用户通过可视化拖放的方法,人-机交互地生成VRML虚拟空间,并保存于VRML文件 (扩展名为.wrl) 中,而用户完全不需要掌握VRML的语法和规范。国外已经有一些单用户的虚拟空间生成系统的商品软件,如Silicon Graphics公司的Cosmo Worlds 2.0 、Platinum Technology公司的 VRCreator 2.0等。而多用户的VRML虚拟空间协同生成系统(VRML Cooperative Authoring software)能使异地的多个用户协同工作,共同生成一个VRML虚拟空间;也可以使设计者在生成VRML虚拟空间的同时,与其客户进行实时交互,以及时满足客户的需求。目前,VRML虚拟空间协同生成系统正处于研究阶段,还没有出现可用的商品软件。
  本文主要以我们自行开发的多用户VRML虚拟空间生成原型系统(MVRC)为基础,论述了人-机交互地生成VRML虚拟空间的方法,以及实现异地多用户协同工作的方法。

1 VRML虚拟空间的生成技术

1.1 Java Applet借助EAI访问VRML虚拟境界

  在VRML中,节点是构成虚拟场景的基本单元。节点由域和事件组成,域的取值决定了节点的取值,从而决定了虚拟境界的当前状态。事件包括Eventin(入事件)、Eventout(出事件)以及exposedField(外露域)的一对隐含的事件入口(set_xxx)和事件出口(xxx_changed),事件为节点提供了接受外界(如外部程序Java Applet)消息以及向外界发送消息的能力,通过事件可以动态改变虚拟境界的状态。
  VRML文件描述的虚拟境界需要经过带有VRML插件(plug-in)的浏览器的解释,才能呈现给观察者。而VRML的EAI(External Authoring Interface外部程序接口)是一个与VRML插件相联系的Java包,它由三部分组成:Vrml.external、 Vrml.external.field、Vrml.external. exception。EAI允许一个Java Applet主要以三种方式访问VRML中的场景:①可以发送一个事件到VRML场景中节点的事件入口。②可以收到VRML场景中节点的事件出口发出的最新值。③当VRML场景中节点的事件出口发出一个事件时,能得到一个通知,激活callback方法。
  借助于在Java Applet使用EAI,可以实现Java Applet 与VRML虚拟空间之间的相互通信。具体的实现方法是:VRML文件可以通过HTML文件的标记<EMBED>或<OBJECT>等包含在HTML文件中,而Java Applet可以通过HTML文件的标记<CODE>等同样包含在HTML文件中,这样包含在同一个HTML文件的Java Applet和VRML 虚拟境界可以相互访问,如图1。



图1 Java Applet借助EAI访问VRML虚似境界

1.2  VRML虚拟空间的生成

  MVRC主要用基元构造法人机交互地生成VRML虚拟空间,即用户能创建(或删除)任意多个物体,包括如正方体、球体、圆锥体、圆柱体、文本等基元物体和用户预先设计的物体;能用移动、旋转、缩放、改变颜色等造型变换方式,变换和组合这些物体,以构造一个虚拟空间。
  MVRC系统的虚拟空间主要由基元物体、用户预先设计的物体和用户替身(Avatar)组成,可将它们设计成三种节点类型:BaseObject(基元物体)、CustomObject(用户预先设计的物体)和 AvatarObject(用户替身)。其中BaseObject节点类型的结构如下。
Proto BaseObject[
  ExposedField SFVec3f     translation    #位移
  ExposedField SFRotation   rotation      #旋转
  ExposedField SFVec3f     scale       #缩放
  ExposedField SFColor     diffusecolor    #颜色
  ExposedField SFBool     touchsensorenabled #锁定/解锁
  ExposedField SFBool     spheresensorenabled #交互属性
  ExposedField SFBool     timesensorenabled  #动画属性
  Eventin  SFNode      objectNodes     #物体的几何造型
  Eventout  SFTime      touchtime
  Eventout  SFRotation    rotation_changed
]{ ... }

  MVRC 用VKIND(0,1,2)将物体分为三类,用VID(物体序号)来识别某一物体是哪一类中的哪一个物体。MVRC分别用三个Java类:CBaseObject、CCustomObject、CAvatarObject来生成并保存三种物体中的每个物体的状态数据,根据保存的每个物体的状态数据和VRML的语法,就可生成VRML文件以保存创建的虚拟空间。生成VRML虚拟空间的具体方法和关键Java代码如下。
  1) 构造初始的VRML虚拟空间(Init.wrl)
Inline{url "scene.wrl"} 
        //scene.wrl描述了VRML的初始虚场景,可以为空
    DEF ROOTNODE Transform {} 
       //ROOTNODE是所有生成物体的根节点
   DEF BIGBOX ProximitySensor { 
       //节点BIGBOX能跟踪本地协作者的视点
     size 1000 1000 1000 //的移动和转向。
  }
  在Java Applet中,建立与VRML浏览器(Browser)即Init.wrl的联系:
browser=Browser.getBrowser(this); 
          //获得VRML浏览器(Browser)的句柄,
Node rootNode=browser.getNode("ROOTNODE"); 
          //获得ROOTNODE的句柄
addChildren=(EventInMFNode) rootNode.getEventIn 
      ("addChildren");
removeChildren = (EventInMFNode) rootNode.getEventIn 
      ("removeChildren");
Node box = browser.getNode("BIGBOX"); 
          //获得BIGBOX等节点的句柄
  2)在Browser中创建物体
  创建物体在类CBaseObject、CCustomObject、CAvatarObject中实现,例如values="Box":
Node[] nodes
Nodes=browser.createVrmlFormString("BaseObject节点的文本内容")
EventInSFVec3f set_translation=nodes[0].getEventIn("translation")
EventOutSFVec3f translation_changed=nodes[0].getEventOut("translation")
...
objectNodes=(EventinSFNode)nodes.getEventIn("objectNodes")
objectNodes.setValue(browser.createVrmlFromString(values+"{}")
addChildren.setValue(nodes) //将创建的物体加到Browser中
  3) 对物体设值和取值
  通过设值,可对物体进行移动、旋转、缩放、改变颜色等变换;通过取值可获得物体的当前状态。例如values为位移值。
set_translation.setValue(((VSFVec3f)values).getValue()) //平移物体
float[] val= translation_changed.getValue() //获取平移值
  4) 从Browser中删除物体
removeChildren.setValue(nodes)

2 VRML虚拟空间协同生成的研究与实现

  要使异地的多个用户能协同工作,共同生成一个VRML虚拟空间。必须使得所有用户当前获得的信息保持一致,实现WYSIWIS的效果;应该提供一个人-人交互界面,使用户能感知当前群体工作的状态,并能与其他用户进行语言交流;必须充分考虑可能出现的冲突,提供解决冲突的办法。实现这些的基础是建立多用户通信环境和构造通信数据包。

2.1 建立CSCW系统结构和构造多用户间通信数据包

  目前,CSCW系统结构的实现方法有集中式和分散式(复制式)两大类。我们自行开发的MVRC采用集中式系统结构,遵循客户/服务器模式,服务器通过TCP/IP协议下的Java Socket机制与每个客户机相连接。采用集中式方式易于实现用户间信息的一致和事件的同步。
  服务器为每一个发出连接请求的用户创建一个线程,负责接受用户的操作请求,请求被处理后发出响应,必要时把这个响应通过相应的线程广播给其他用户。客户端生成一个线程与服务器连接和通讯,用户大部分的操作都须向服务器提出请求,请求得到响应后,才能作相应的处理,得到结果,如图2。



图2 MVRC的系统结构

  一个用户在客户机上所产生的数据信息(用户所操作的对象、操作的类型、操作的结果),如用户的加入或退出、替身移动或转向、替身自身动作、创建或删除一个物体、对物体进行移动(旋转、缩放、改变颜色)变换处理、对物体进行锁定或解锁、用户间的对话等,可形成一个请求数据包:

VKIND
操作对象类型 VID
操作对象序号 VIP
操作类型 Vfield
操作的数据类型 Values
操作的数据值 

  这个请求数据包传送给服务器,经过处理后,服务器会产生一个结构相同的响应数据包,并传回给该用户。必要时将这个响应数据包广播给所有的用户,以及时改变他们的VRML虚拟空间和Java Applet界面的状态。这样就可以实现用户间信息的一致和事件的同步,获得WYSIWIS的效果。

2.2 协同感知

  为实现多用户在协同工作时能感知当前群体工作的状态,可在VRML虚拟空间中用一个带有用户名的3D替身(avatar)来代表一个用户,3D替身是VRML场景中一个特殊的物体,是用户形象和行为在虚拟环境中的表现。
  利用VRML的PoximitySensor节点可以跟踪本地用户视点的移动和转动并获得位置和方向值,这对值通过网络可用以改变其他用户的VRML虚拟空间中该用户3D替身的位置和方向。这样其他用户就能感知到该用户正移向或转向某个区域的某个对象,正关注什么。
  用户间的交流可以简单地通过文本的形式来实现,如在Java Applet界面中包含接收对话框和发送对话框。要使用户间在交流的同时,能感知到对方的身体动作和面部表情,可对3D替身预先设计几种动画(如摇头、点头、举手等)和面部表情(如高兴、生气等),用户可选择并驱动替身的这些动画和面部表情。

2.3 用锁定机制避免冲突

  MVRC采用锁定机制避免多个用户同时对同一物体进行修改(变换)而可能发生的冲突。用户要对某一物体进行修改时,先必须向服务器发送一个锁定该物体的请求。若此时该物体未被其他用户锁定,则服务器向该用户发出一个摽尚薷母梦锾鍞的响应,同时向其他用户发出一个“可修改该物体”的消息。一个用户只有对某物体解锁后,才可以提出另一个锁定请求。MVRC中物体节点的(ExposedField SFBool) touchsensorenabled域可用以对物体的锁定和解锁。

3 MVRC的操作界面和实验运行环境

  MVRC主要用基元构造法,人机交互地生成具有简单动画和交互能力的VRML虚拟空间。当用户所在的客户机与服务器连接成功时,就会出现MVRC的Java Applet操作界面,如图3。



图3 MVRC的Java Applet操作界面

  异地的多个用户可在各自的VRML浏览器(Browser)中共同生成一个VRML虚拟空间,并可同时在这个VRML虚拟空间中漫游,如图4。其中,标有搇ee數奈锾逦

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -