VRML基础知识

一、VRML概述

1.VRML发展的历史及其完善过程中出现的几个标准

  VRML最初出现在1994年的瑞士日内瓦的W3会议上,Tim Berners-Lee,也就是Web的奠基人,对Mark Pesce的编程工作产生了浓厚的兴趣并邀请他给出名为”Cyberspace”的论文。这篇论文解释了一个名为Labyrinth的VRML 浏览器原型,这是Mark和Tony Parisi在1994年1月完成的一个程序。冲动来源于William Gibson的一部名为Neuromancer的小说。

  因为是第一次在Web上呈现出三维的界面,所以在W3会议上Labyrinth受到了特别的关注。

  VRML是这样一个缩写词,它的英文全称是Virtual Reality Modeling Language。在最初的时候,M代表Markup,后来为了和HTML相区别,在W3会议之后的几个月内就把名称改为了Modeling了。

  Mark的那篇论文获得了巨大的成功,所以就举办了名为www-vrml的mailing list(http://vag.vrml.org/www-vrml/)以进行更为深入的讨论。Mark的身份是这个mailing list的协调员。

  这个邮件列表代表了VRML在学术上的发展。Gavin Bell,SGI公司的一名编程人员,在VRML团体中享有很高的声誉,采用Open Inventor作为VRML文件的官方格式。一些人觉得应该为这项新技术创建一个全新的格式,而另一部分人包括Mark本人则认为如果VRML文件格式符合现存的所有图象文件格式,那么它必将获得巨大的成功。理想的结构应该是创建一个和HTML相类似而又符合专业三维设计师的需求。最终Open Inventor被采纳了,Gavin Bell在VRML 1.0标准的制订过程中做了大量的文档工作。

  除了Open Inventor之外,还有几个标准:CDF(Cyberspace Description Format)、AFF(A File Format for the Interchange of Virtual World)、Labyrinth-VRML Specification Version 1.3.1、Web OOGL(Object-Oriented Graphics Language)、MSDL(Manchester Scene Description Language)和Meme(Multitasking Extensible Messaging Environment)等,但是这几个标准最终的结果都不如Open Inventor来得幸运,这主要是和OI的几个重要特性分不开的:

  • 窗口系统并且是独立于平台的。
  • 允许高质量的对象拾取。
  • 支持PostScript打印语言。
  • 在OpenGL的顶层创建。
  • 定义了三维数据交换的一个标准的文件格式。
  • 鼓励自定义对象。
  • 制作了一个适合于三维交互的事件模型。

  在OI被大众所接受之后,它被调整到我们现在所见到的VRML 1.0格式。很明显VRML是作为一个独立语言出现的,而不仅仅是作为一个HTML的扩展而出现的。VRML对于网络的要求比HTML更加严格并且在使用时要求更多数量的服务器。VRML 1.0标准中给出了超链接锚点(WWWAnchor)平行于HTML中的HREF,另一个语言上的特征是LOD(细节节点),它依据物体在场景中的位置和浏览器的渲染性能来为物体分配正确的浏览数据。

  VRML 1.0和它的后继者不太一样,它是完全面向ASCII字符集的,被限制在处理127个字符的能力上。这个限制对于处理非罗马语言的字符就会产生问题。VRML 1.0标准不能处理avatar也是一个很大的失误。

  1994年的11月第二界WWW会议召开,在这次会议上提出了VRML 1.0标准。在这次会议之后,Parisi建立了自己的公司Intervista并创建了第一个VRML浏览器WorldView。SGI公司也在1995年的四月给出了它的第一个Web浏览器WebSpace。在当年的夏天Netscape、NEC、DEC和Spyglass宣布对VRML进行支持。同年的八月,VAG(VRML工程组)成立。95年的十月,VAG成员决定把工作重心放在引导方向,VRML 2.0由此产生。

  VRML和Java团体的第一次会晤是在1996年的第三次的W3会议上。

  目前最新的标准是1997年制订的VRML 97。在VRML的整个发展历程中,出现了几个变种的标准:VRML+和VRML 1.1。VRML +是IBM对VRML的一种扩展标准,出现在1995年的八月。IBM公司准备以这项技术对VRML服务提供大范围的支持。VRML +准备在场景中提供一个象avatar一样的数字演员并提供象VRML 2.0一样功能的交互支持。

  VRML 1.1是VRML 1.0的一套扩展集,它试图扩展最初版本的功能。这个标准后来被集成进了VRML 2.0当中。

2.VRML的基本工作原理及其基本特性

  用文本信息描述三维场景,在Internet网上传输,在本地机上由VRML的浏览器解释生成三维场景,解释生成的标准规范即是VRML规范。正是基于VRML的这种工作机制,才使其可能在网络应用中有很快的发展。当初VRML的设计者们考虑的也正是--文本描述的信息在网络上的传输比图形文件迅速,所以他们避开在网络上直接传输图形文件而改用传输图形文件的文本描述信息,把复杂的处理任务交给本地机从而减轻了网路的负荷。

  统分结合模式:VRML的访问方式基于C/S模式,其中服务器提供VRML文件,客户通过网络下载希望访问的文件,并通过本地平台的浏览器(Viewer)对该文件描述的VR世界进行访问;即VRML文件包含了VR世界的逻辑结构信息,浏览器根据这些信息实现许多VR功能。这种由服务器提供统一的描述信息,客户机各自建立VR世界的访问方式被称为统分结合模式,也是VRML的基本概念。由于浏览器是本地平台提供的,从而实现了VR的平台无关性。

  基于ASCII码的低带宽可行性:VRML像HTML一样,用ASCII文本格式来描述世界和链接,保证在各种平台上通用,同时也降低了数2量,从而在低带宽的网络上也可以实现。

  实时3D着色引擎:传统的VR中使用的实时3D着色引擎在VRML中得到了更好的体现。这一特性把VR的建模与实时访问更明确的隔离开来,也是VR不同于三维建模和动画的地方。后者预先着色,因而不能提供交互性。VRML提供了6+1个自由度,即三个方向的移动和旋转,以及和其他3D空间的超链接(Anchor)。

  可扩充性:VRML作为一种标准,不可能满足所有应用的需要。有的应用希望交互性更强,有的希望画面质量更高,有的希望VR世界更复杂。这些要求往往是相互制约的,同时又受到用户平台硬件性能的制约,因而VRML是可扩充的,即可以根据需要定义自己的对象及其属性,并通过Java语言等方式使浏览器可以解释这种对象及其行为。

3.VRML文件格式及MIME类型

  VRML文件可以包括下列四个主要成份:VRML文件头、原型、造型和脚本、路由。并不是所有的文件都包括这些要素,唯一必须的是VRML文件头。

  VRML 2.0标准的文件头为#VRML V2.0 utf8。这不同于1.0标准中的文件头,1.0标准中文件只支持ASCII字符集,所以文本头为#VRMLV1.0ASCII。为了向下兼容,VRML 2.0文件格式兼容1.0文件格式。这个文件头有三个含义:第一、表明这个文件是一个VRML文件;第二,符合VRML 2.0版本;第三,文件使用的是utf8字符集(这是多种语言中键入字符的一种标准方式,包括英语,也支持朝鲜语、日语和阿拉伯语的字符)。

  VRML注释允许在不影响VRML空间外观情况下,在VRML中包括其他信息。可以加入对文件内容、文件绘制的不同部分的注释。注释以一个#符号开始,结束于该行的最后。

  VRML中包含描述空间中造型及其属性的节点。这些是VRML的构件。单个节点描述造型、颜色、光照、视点、以及造型、动画定时器、传感器、内插器等的定位和朝向等等。节点一般包括:

节点的类型(必需)。

一对括号(必需)。

  括号中的一定数目描述节点属性的域(可选)和域值。

Cylinder{

height 2.0

radius 2.0

}

  括号将节点的域信息组织在一起。组织在括号中的域是属于节点的。由节点及其相关域定义的造型或属性在空间中被视为一个整体。

  所有的域类型,要么是单值类型,要么是多值类型。单值类型是单一的值,如一种颜色和一个数字,该类型命名以“SF”开始。多值类型可以很有值,比如颜色和数字的列表,命名以“MF”开始。当指定多值类型时,使用括号将值的列表扩起来。

  VRML文件以扩展名.wrl或.wrz结尾,表示这是一个包含VRML空间的文件。

  MIME是英文Multipurpose Internet Mail Extensions—多用途Internet邮件扩展的缩写。它用来定义Internet上传送的文件内容类型的软件标准,所有的Web浏览器都能够理解MIME所定义的文件类型,并使用它们在浏览器上自动决定显示的信息内容。例如:如果一个MIME类型显示一个文件中包含VRML文本,那么浏览器将格式化VRML文本使其显示在浏览器的窗口中。一个MIME内容类型由用斜杠分开的两部分指定。第一部分说明内容的一般类型,象文本、音频、视频类型。第二部分说明内容的子类型,用于指定内容使用的确切格式。

  MIME内容类型由Internet协会标准化,临时的或最新的MIME内容类型都以x-开始(x表示扩展)。VRML非常新,以至于它现在使用下列扩展的MIME内容类型:x-world/x-vrml。将来,VRML的内容类型将融合进正式的MIME标准,并成为下列MIME内容类型:model/vrml。

4.VRML中的节点分类

  VRML中的节点有以下几种类型:

·造型尺寸、外观节点:Shape、Appearance、Material

·原始几何造型节点:Box、Cone、Cylinder、Sphere
·造型编组节点:Group、Switch、Billboard
·文本造型节点:Text、FrontStyle
·造型定位、旋转、缩放节点:Transform

·内插器节点:TimeSensor、PositionInterpolater、OrientationInterpolater、ColorInterpolator、 ScalarInterpolator、CoordinateInterpolator

·感知节点:TouchSensor、CylinderSensor、PlaneSensor、SphereSensor、VisibilitySensor、ProximitySensor、Collision

·点、线、面集节点:PointSet、IndexedLineSet、IndexedFaceSet、Coordinate
·海拔节点:ElevationGrid
·挤出节点:Extrusion

·颜色、纹理、明暗节点:Color、ImageTexture、PixelTexture、MovieTexture、Normal

·控制光源的节点:PointLight、DirectionalLight、SpotLight
·背景节点:Background
·声音节点:AudioClip、MovieTexture、Sound
·细节控制节点:LOD
·雾节点:Fog
·空间信息节点:WorldInfo
·锚点节点:Anchor
·脚本节点:Script
·控制视点的节点:Viewpoint、NavigationInfo
·用于创建新节点类型的节点:PROTO、EXTERNPROTO、IS

二、VRML中较为深入的几个概念

1.构建VRML文件的几种方法

  构建VRML文件一般有三种方法:

  使用文本编辑器直接进行VRML文件的书写。这样做的不足之处是只能创建比较简单的物体和场景。创建复杂场景的时候,几乎不可能使用文本编辑器来直接编写。第一是因为场景之间相互关系和位置确定比较复杂,第二是对于复杂物体的建模显得无能为力(精确到小数位两位已经是计算的一个极限了),第三对数学能力要求较高。

  一般的方法是使用可视化编辑器来建模。使用可视化编辑器避免了直接使用文本建模时的一些问题,例如不能生成复杂场景等。这些工具的一个突出的优点就是使用起来相当方便,它不需要手工地输入大量的命令而只需要轻轻拖动鼠标即可实现大量程序才可能完成的功能。

  常见的几个可视化编辑器有:Cosmo World 2.0、Paragraph’s Virtual Home Space Builder、Home Space、Caligari’s Pioneer、Virtus WalkThrough Pro和3-D Website Builder等。

  第三种方法就是使用其它常见的图形格式进行转换。在Web网上,存在着大量的各种各样的三维文件格式,转换工具的作用就是在这些文件格式之间进行转换。需要注意的是,所有的转换程序都有局限性,例如在转换特定文件中的光照和纹理贴图时就会失败。

  InterChange是Syndesis公司(http://www.threedee.com)的一项产品,它可以执行大约五十种文件格式之间的转换,VRML就是这五十种文件格式中的一种。

  Extreme 3-D是Macromedia公司(http://www.macromedia.com)的一项功能非常强大的产品,它对于VRML文件的转换功能在多媒体创作人员当中是深受欢迎的。使用Extreme 3-D,你就可以通过点击鼠标来把二维模型转换成三维模型。

  DoomToVrml2使你可以在网上发布你自己的Doom文件,它使得你可以把Doom层次的多边形和纹理信息转换成为VRML 2.0格式的文件(http://vrml.sig.com/tools/ doomtovrml2 /index.html)。

  VRML1to2可以将符合VRML 1.0格式的文件转换成为符合VRML 2.0格式的文件,Sony公司(http://vrml.sgi.com/cgi-bin/vrmlToVrml2.cgi)在这个领域开了先河。

  VRML1toVRML2来自SGI公司,它执行的功能和上面的转换器一样。

2.浏览VRML的方法及几种常见的VRML插件

  浏览VRML的一般方法是使用VRML浏览器,也可以在IE等通用浏览器上通过VRML浏览器插件对VRML文件进行浏览。

3.VRML中的动画效果

  要理解VRML中动画的概念,必需首先理解路由和事件。为了使虚拟空间具有动感,构造指令可以包含绑定指令,绑定指令描述如何将节点绑定在一起。VRML绑定包括:绑定在一起的节点和在节点之间绑定的路由或者叫做路径。绑定两个节点之后,第一个节点通过这样的路径传送给第二个节点的信息叫作事件。事件包含一个值。当一个节点接收到一个事件时,它将根据节点的特征开始动画或者其它事情。通过绑定多个节点,用户可以创建许多路由,从而使空间更加具有动感。

  大多数VRML节点都可以绑定在线路之上,每个节点都有输入、输出插座。一些节点同时具有输入、输出插座,而另外的一些节点仅有其中的一种。节点的输入插座称为eventIn,输出插座称为eventOut。当链接一个路由时,eventIn接受输入,eventOut将事件输出。例如,Group节点语法:

Group{

children [ ] #exposedField MFNode

bboxCenter 0.0 0.0 0.0 #field SFVec3f

bboxSize -1.0 -1.0 -1.0 #field SFVec3f

addChildren #eventIn MFNode

removeChildren #eventOut MFNode

}

  该节点中的addChildren就是输入插座,removeChildren就是输出插座。上述节点中的children域是一个exposedField域,exposedField域拥有两个隐含插座:一个用来设置它的值,而另一个用来传送域值。隐含的输入插座总是以set_XXX命名,其中XXX是exposedField域的名称。与此相似,隐含的输出插座是以XXX_changed命名。对于上述节点来说,children 域隐含的插座就是set_children和children_changed。当创建路由时,使用节点的eventIn和eventOut的名称来设定链接路由的地方。对于上述节点来说,创建路由时链接到addChildren和removeChildren上。对于一个exposed域,你可以绑定一个路由至隐含的eventIn和eventOut,也可以直接绑定至exposed域本身。对于Group节点来说,即绑定至children域。

  节点的每个输入输出路由也有类型,例如一个SFFloat类型的eventOut,当它绑定一个路由时,输出浮点数。SFFloat类型的eventIn,能够接收浮点值。创建路由之后,线路路由将处于睡眠状态,直到有一个事件从发送节点发送到接收节点。接收节点接收事件之后将作出反应,反应类型依赖于:

  • 接收事件节点的类型
  • 路由所绑定的节点输入插座
  • 事件所包含的数值
  • 当前节点的活动状态

  VRML中的动画产生是由于变动了任何一个坐标系的位置、方向和形体比例,从而使物体按你所想的方式飞行、平移、旋转或按比例缩放。

  TimeSensor节点的作用象一个时钟,它可以被用来执行开始,停止或者其他控制动画的动作。随着时间的流逝,这个传感器就会产生事件来表示时间的变化。通过将这些事件人TimeSensor节点的eventOut路由到其他节点,当TimeSensor节点的时钟计时时,你可以使这些节点发生相应的变化。如果要使一个坐标系平移、旋转和按比例缩放的话,你可以将TimeSensor节点事件路由至PositionInerpolator和OrientationInterpolator节点。这些节点中的每一个产生新的位置和旋转值,并通过他们的eventOut传送这些值。按顺序将这些值路由到Tranform节点,就可以使节点的坐标系随动画过程的发展而发生平移、旋转和按比例缩放。

4.VRML中的自身交互可以做到什么程度

  如果要使你的空间具有交互性,你可以给一个造型附带一个传感器,该传感器使用一个定点设备来感知观察者的动作。当观察者点击到一个附带有传感器的造型时,传感器就输出一个事件,这个事件就被路由到其它的节点来开始一个动画。

  TouchSensor是一种用来检测观察者的接触和将事件输出的传感器。这些输出描述了在何时、何地,观察者接触到了可感知的造型。CylinderSensor、PlaneSensor和SphereSensor节点也可用来检测何时观察者接触到一个可感知的造型,并且提供了用来改变造型位置和方向的输出。

  在VRML中,你可以将一个传感器附在一个造型上,用它来检测观察者的移动、点击和拖动。当观察者与一个可感知的造型相互作用时,你就可以把传感器的输出连入一个线路中,从而引起造型的移动和动画的播放。

  感知观察者接近常使用三种方法:感知观察者的可视性、感知观察者的接近性和通过碰撞检测。

  可见传感器从观察者的位置和方向来感知在空间中的一个长方体区域是否可视。你可以通过这些传感器来启动和停止动画或者控制其他的动作,这些动作仅当一个可感知的区域可见时是必要的。通过给出中心和尺寸,你可以指定一个由VisibilitySensor节点感测的空间区域。

  碰撞检测是检测空间中观察者与造型接近和碰撞的时间。碰撞节点在检测观察者的碰撞时做两件事:

通过CollideTime eventOut事件输出当前的绝对时间。

提示浏览器。

  以上就是VRML场景中的几种交互,使用这些交互我们可以做到类似电灯开启,自动滑动门等效果。但是更为复杂的交互使用它本身所提供的传感器就显得无能为力了,这就需要利用Script和Proto节点等对其进行功能上的扩展,最好是利用Java技术完成这些扩展工作,因为Sun公司对VRML技术也非常看好。

5.创建VRML场景的一个实例

#VRML V2.0 utf8

Group{

children[

Shape{

appearance DEF Yellow Appearance{

material Material{diffuseColor 1.0 1.0 0.0}

}

geometry Sphere{}

},

DEF Planet1 Transform{

translation 2.0 0.0 0.0

center -2.0 0.0 0.0

children Shape{

appearance DEF Red Appearance{

material Material{diffuseColor 1.0 0.0 0.0}

}

geometry Sphere{radius 0.2}

}

},

DEF Planet2 Transform{

translation 3.0 0.0 0.0

center -3.0 0.0 0.0

children Shape{

appearance DEF Green Appearance{

material Material{diffuseColor 0.0 1.0 0.0}

}

geometry Sphere{radius 0.3}

}

},

DEF Planet3 Transform{

translation 4.0 0.0 0.0

center -4.0 0.0 0.0

children Shape{

appearance DEF Blue Appearance{

material Material{diffuseColor 0.0 0.0 1.0}

}

geometry Sphere{radius 0.5}

}

},

DEF Planet4 Transform{

translation 5.0 0.0 0.0

center -5.0 0.0 0.0

children Shape{

appearance DEF Agenta Appearance{

material Material{diffuseColor 0.0 1.0 1.0}

}

geometry Sphere{radius 0.4}

}

},

DEF Clock1 TimeSensor{

cycleInterval 2.0

loop TRUE

},

DEF Clock2 TimeSensor{

cycleInterval 3.5

loop TRUE

},

DEF Clock3 TimeSensor{

cycleInterval 5.0

loop TRUE

},

DEF Clock4 TimeSensor{

cycleInterval 6.5

loop TRUE

},

DEF PlanetPath1 OrientationInterpolator{

key [0.0 0.50 1.0]

keyValue[

0.0 0.0 1.0 0.0

0.0 0.0 1.0 3.14

0.0 0.0 1.0 6.28

]

},

DEF PlanetPath2 OrientationInterpolator{

key [0.0 0.50 1.0]

keyValue[

0.0 0.0 1.0 0.0

0.0 0.0 1.0 3.14

0.0 0.0 1.0 6.28

]

},

DEF PlanetPath3 OrientationInterpolator{

key [0.0 0.50 1.0]

keyValue[

0.0 0.0 1.0 0.0

0.0 0.0 1.0 3.14

0.0 0.0 1.0 6.28

]

},

DEF PlanetPath4 OrientationInterpolator{

key [0.0 0.50 1.0]

keyValue[

0.0 0.0 1.0 0.0

0.0 0.0 1.0 3.14

0.0 0.0 1.0 6.28

]

}

]

}

ROUTE Clock1.fraction_changed TO PlanetPath1.set_fraction

ROUTE Clock2.fraction_changed TO PlanetPath2.set_fraction

ROUTE Clock3.fraction_changed TO PlanetPath3.set_fraction

ROUTE Clock4.fraction_changed TO PlanetPath4.set_fraction

ROUTE PlanetPath1.value_changed TO Planet1.set_rotation

ROUTE PlanetPath2.value_changed TO Planet2.set_rotation

ROUTE PlanetPath3.value_changed TO Planet3.set_rotation

ROUTE PlanetPath4.value_changed TO Planet4.set_rotation

你可能感兴趣的:(浏览器,扩展,internet,文本编辑,translation,postscript)