虚拟现实技术VRML篇.docx
《虚拟现实技术VRML篇.docx》由会员分享,可在线阅读,更多相关《虚拟现实技术VRML篇.docx(33页珍藏版)》请在冰豆网上搜索。
虚拟现实技术VRML篇
虚拟现实技术一一VRM篇
一、VRM介绍
1.什么是VRM?
L
VRM是“VirtualRealityModelingLanguage”的缩写形式,意思是“虚
拟现实造型语言”。
第一代Web是以HTML为核心的二维浏览技术,受HTM语言的局限性,VRML之前的网页只能是简单的平面结构,而且实现环境与参与者的动态交互是非常烦琐的。
第二代Wet是以VRML为核心的三维浏览技术。
第二代Web把VRMI与HTMLJava、媒体信息流等技术有机地结合起来,形成一种新的三维超媒体Web
VRM是用来描述三维物体及其行为的,可以构建虚拟境界(VirturalWorld),可以集成文本、图像、音响、MPE(影像等多种媒体类型,还可以内嵌用Java、ECMAScript等语言编写的程序代码。
以VRM为核心构建的虚拟世界中用户如身处真实世界,可以和虚拟物体交互,人们可以以习惯的自然方式访问各种场所,在虚拟社区中“直接”交谈和交往。
事实上,目前采用VRM技术取得成功的案例已经很多,例如探路者到达火星后的信息就是利用VRMLS因特网上即时发布的,网络用户可以以三维方式随探路者探索火星。
2.VRML的工作原理
VRML!
义了一种把3D图形和多媒体集成在一起的文件格式。
从语法角度看,VRM文件是显式地定义和组织起来的3D多媒体对象集合;从语义角度看,VRML文件描述的是基于时间的交互式3D多媒体信息的抽象功能行为。
VRM文件描述的基于时间的3D空间称为虚拟境界(VirtualWorld),简称境界,所包含的图形对象和听觉对象可通过多种机制动态修改。
VRML文件可以包含对其他标准格式文件的引用。
可以把JPEGPNG和MPEG文件用于对象纹理映射,把WAN和MIDI文件用于在境界中播放的声音。
另外,还可以引用包含Java或ECMAScript代码的文件,从而实现对象的编程行为。
VRM使用场景图(SceneGraph)数据结构来建立3D实境,VRM的场景图是一种代表所有3D世界静态特征的节点等级:
几何关系、质材、纹理、几何转换、光线、视点以及嵌套结构。
几乎所有生产厂商,无论是CAD建模、动画、
VR还是VRML他们的结构核心都有场景图。
境界中的对象及其属性用节点(Node)描述,节点按照一定规则构成场景图(SceneGraph),也就是说,场景图是境界的内部表示。
场景图中的第一类节点用于从视觉和听觉角度表现对象,它们按照层次体系组织起来,反映了境界的空间结构。
另一类节点参与事件产生和路由机制,形成路由图(RouteGraph),确定境界随时间的推移如何动态变化。
VRML文件的解释、执行和呈现通过浏览器实现,这与利用浏览器显示HTML
文件的机制完全相同。
浏览器把场景图中的形态和声音呈现给用户,这种视听觉呈现即所谓的虚拟世界(境界)。
用户通过浏览器获得的视听觉效果如同从某个特定方位体验到的,境界中的这种位置和朝向称为取景器(Viewer)。
3.VRML的应用
VRML在电子商务、教育、工程技术、建筑、娱乐、艺术等领域有广泛的应用。
例如在教育上,VRM不仅仅是HTML功能更强的替代品,其潜在意义在于突破上述基于WW的教学模型建立更自然、更真实的虚拟教育环境。
在这种环境中学生可以以浏览探索的方式汲取知识,如进入虚拟太空学习天文知识,利用虚拟地球学习地理知识,穿过历史长廊与历史人物交流,进入分子世界游历化学殿堂等等,这些曾经是梦想中的学习方式都可以逐步实现。
在这个虚拟教育世界中,甚至可以有利用VRML制作的动画人物扮演教师,其面部表情和形体动作利用动作跟踪系统捕捉下来,这样得到的讲课节目将是三维的。
如果把这种方式扩大到教学双方,则可实现具有实时交互性的虚拟教学——教师控制的虚拟教师和学生控制的虚拟学生就可以在一个虚拟教室中相互交流。
4.VRML的工作组及其研究目标
为了推动VRMLS术的发展,VRM协会组织了很多工作组,每个工作组都是自愿组织、自我约束、并经VRM协会认可的技术委员会,负责某个与VRM!
有关的专题技术的研究和实现工作。
人性动画工作组(HumanoidAnimationWG)利用VRM!
表现人类行为特性。
色彩保真工作组(ColorFidelityWG)确保采用任何平台的观众所看到的效果都和创作者的原始作品一样,颜色应相当一致。
元形式工作组(MetaFormsWG)针对利用形式文法生成的作品,提出一般性的方法论和一般性规范,使之能够映射为某种特定形式。
首要目标是能够表示"
数字生命格式"(DigitalLife-Forms)结构和增长。
面向对象扩展工作组(Object-OrientedExtensionsWG)探讨和推动对VRML进行面向对象扩展的方法。
数据库工作组(DatabaseWG推进基于VRM商业应用的创建,利用数据库维护VRML内容的持久性、升级能力和安全传输能力。
外部创作接口工作组(ExternalAuthoringInterfaceWG在VRMLS界和外部环境之间建立标准接口。
界面组件工作组(WidgetsWG为开发者和用户提供一套基础性的、可自由使用的标准用户界面组件集,并提供支持基本组件集和所有VRMLS件的理论框架。
二进制压缩格式工作组(CompressedBinaryFormatWG)探讨并开发VRML文件的二进制编码方法,重点是研究为了快速传送目的而尽量缩小文件尺寸,同时为了快速解码目的而尽量简化文件结构。
通用媒体库工作组(UniversalMediaLibrariesWG)为了提高VRMLS界的真实感,同时减少网络的下载量,而定义一种由驻留本地的媒体元件(纹理、声音和VRM对象)组成的小型跨平台媒体库。
同时定义一种统一机制,通过这种机制,VRM内容创作者可以在自己的境界中使用这些媒体元件。
活动境界工作组(LivingWorldsWG为多用户(包括多个开发者)应用的产生和进化定义概念框架,并确定一组界面。
键盘输入工作组(KeyboardInputWG)为了使内容创作者能够在自己的境界中访问键盘输入,定义一个或多个扩充节点。
一致性工作组(ConformanceWG)为与一致性测试有关的问题提供一个讨论场所,特别地,本组将辨别VRMLS现发生分歧的地方以及相应的动作序列。
生物圈工作组(BiotaWG)为生命系统(LivingSystem)的研究和学习建立、配备数字式工具和环境。
分布式交互仿真工作组(DistributedInteractiveSimulationWG)为建立
有多广播能力(Multicast-Capable)的大规模虚拟环境(Large-ScaleVirtualEnvironments,LSVEs)确立初始网络约定。
VRML脚本工作组(VRMLScriptWG向VRM监查组(VRMLReviewBoard,VRB)提供有关Java和JavaScript的问题列表、修改建议和评论。
自然语言处理和动画工作组(NLP&AnimationsWG)为了使用户能使用自然语言和VRM动画形象进行交流,从而使交互更自然,增强用户和动画形象之间的信息流动,研究如何使用“问题/回答”、“命令/响应”式的对话以及基于操作系统命令和字符控制的自然语言。
VRML-DHTM集成工作组(VRML-DHTMLIntegrationWG)为VRML和DHTM在文档对象模型、组件(Component)接口和绘制等三个层次的紧密集成开发一种概念模型。
6.研究现状
VRML9发布后,互联网上的3D图形几乎都使用了VRML由于技术的局限性,如带宽不够,需要下栽插件浏览,文件量大,真实感、交互性需要进一步加强等原因,最近一二年,许多制作Web3D图形的软件公司的产品,并没有完全遵循VRML9标准,而是使用了专用的文件格式和浏览器插件,开发了比较实用的VR
软件。
这些软件有些比VRM有了进步,在渲染速度、图像质量、造型技术、交互性以及数据的压缩与优化上,都有胜过VRMI之处。
比如,Cult3D、Viewpoint、GL4JavaPulse3D、Flatland、Flash、JPEG200C等。
CULT3DVIEWPOINT360度环视等技术正被应用。
以Blaxxun和ParallelGraphics公司为代表,它们都有各自的VR浏览器插件,并各自开发基于VRMLS准的扩展节点功能(X3D,使3D的效果,交互性能更加完美;支持MPEGMovAvi等视频文件,Rm等流媒体文件,WavMidi、Mp3Aiff等多种音频文件,Flash动画文件,多种材质效果,支持Nurbs曲线,粒子效果,雾化效果;支持多人的交互环境,VR眼镜等硬件设备;在娱乐、电
子商务等领域都有成功的应用,并各自为适应X3D的发展,以X3D为核心,有
Blaxxun3D等相关产品。
在虚拟场景,尤其是大场景的应用方面,以VRML标准
为核心的技术具有独特的优势。
二、初识VRML
(1)VRM的文件结构
1.文件头
VRML2.0(VRML9;开头如下:
#VRMLV2.0utf8
VRML!
大小写敏感的,utf8是指一种纯文本编码方式
2.场景图(SceneGraph)
由描述“对象及其属性”的节点组成,节点是VRMLS基本单元,场景图的
第一类节点用于从视觉和听觉角度表现对象,它们是按照层次体系结构组织的;另一类节点,则参与事件产生和路由机制。
3.原型(Prototype)
用户可以通过原型扩充VRM的节点类型集。
原型的定义可以包含在使用该原型的文件中,也可以在外部定义。
4.事件路由(Route)
有些VRML节点能通过产生事件响应环境变化或用户交互。
事件一旦产生,就按时间顺序向路由目标节点发送。
目标节点接收后进行相应处理,可改变节点状态,产生其他事件,或者修改场景图的结构。
利用脚本节点Script,作者可以Java或JavaScript语言自定义任意事件处理。
(二)VRKL节点和数据类型
虚拟场景由对象构成,对象及其属性用节点(Node描述,节点是构成VRML文件的基本单元。
VRML9定义了54种基本节点类型(内部节点类型),用户也可以通过原型机制定义自己的节点类型。
节点由域和事件组成:
1.域(field)
描述了节点的当前状态。
其中外露域(exposedField)是域和事件的统一体,它既作为域描述节点,又隐含着形如“set_域名”的入事件和“域名_changed”的出事件。
2.事件(event)
分为入事件和出事件,入事件将导致节点状态的改变;出事件向外报告自身状态的变化。
(三)VRM浏览器
BlaxxunContact3D
CosmoPlayer
Visvape等
MicrosoftVRML2.0Viewer
(四)编写VRM境界
1.制作第一个虚拟境界
#VRMLV2.0utf8
Group{
children[
Shape{geometryBox{}}
]
}
将它保存为SimpleWorld.wrl文件,则可以用浏览器看到它。
2.定义外观――第二场景
再定义立方体的外观,即改变Shape节点的appearance域(外观),appearance域是一个节点,此节点的material域定义为一个Material节点:
则Shape节点变成了:
Shape{appearanceAppearance{materialMaterial{}
}geometryBox{}
}
修改它的diffuseColor域(漫射色),应该是{100},3个数字分别表示
红色、绿色和蓝色,取值范围是0到1:
materialMaterial{diffuseColor100}
这样,生成了第二个场景文件:
#VRMLV2.0utf8
Group{children[
Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}
]
}
3.定义变换――第三个场景若想移动这个红色的立方体,可以通过为它外套一个Transform节点来实现:
Transform{translation500children[
Shape{appearanceAppearance{materialMaterial{diffuseColor100}}
geometryBox{}
}
]
}
Transform节点的translation500表示x轴向上右移5个单位(米)则第三个场景完整代码如下:
#VRMLV2.0utf8
Group{children[
Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}
}
]
}
〕
}
4.复制节点――第四个场景复制节点,并将各自的几何形状定义为方块、球体和圆椎Group{
children[
Transform{translation500children[
Shape{...geometryBox{}}
]
}
Transform{
translation000children[
Shape{...geometrySphere{}
}
]
}
Transform{
translation-500children[
Shape{...geometryCone{}}
]
}
]#endofGroupchildren
}为了以后引用方便,分别给这3个Transform节点指定一个名称:
DEFboxTransform{...}
DEFSphereTransform{...}
DEFconeTransform{...}
则第四个场景的完整代码是:
#VRMLV2.0utf8Group{children[
DEFboxTransform{
translation500
children[
Shape{
appearanceAppearance{materialMaterial{diffuseColor100}}
geometryBox{}
}
]
}
DEFsphereTransform{
translation000
children[
Shape{
appearanceAppearance{materialMaterial{diffuseColor010}}
geometrySphere{}
}
]
}
DEFconeTransform{
translation-500
children[
Shape{
appearanceAppearance{materialMaterial{diffuseColor001}}
geometryCone{}
}
]
}
]#endofGroupchildren
}
将此文件保存为FirstWorld.wrl,用浏览器观看,可从多个方位浏览自己的作品。
(五)交互能力的加入
1.传感器
是交互能力的基础,共9种。
在场景中,传感器节点一般是以其他节点的子节点的身份存在的,它的父节点称为可触发节点,触发条件和时机由传感器节点类型确定。
接触传感器(TouchSensor)是最常用的传感器,先了解一下开关节点lightSwitch(组节点),并定义一个接触传感器作为它的子节点:
DEFlightSwitchGroup{
children[
各几何造型节点……
DEFtouchSensorTouchSensor{}
]
}
传感器能引起某种变化,下面看场景变化。
2.视点
当你拖动鼠标或按动箭头键时(按照VRM术语,称为航行),虚拟境界就会旋转或缩放,这实际上是在调整你的视点位置或视角。
在虚拟场景的重要位置可以定义视点节点(ViewPoint),它们是境界作者给用户推荐的上佳观赏方位,在CosmoPlayer浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点。
这里我们定义两个视点节点:
DEFviewlViewpoint{#“view1”是编程时引用的名字
position0020description"View1"#“View1”是浏览器上显示的名字
}
DEFview2Viewpoint{
position5020
description"view2"
}
目的是使用户可以通过触发开关节点来切换视点。
视点节点中的坐标表示视点在场景中的位置,坐标的单位是米,视点的名称将会在浏览器菜单中提示出来供用户选择。
把上述视点说明加入helloworld2.wri中(放在Group节点之前),并把其中的方块节点修改成可触发节点:
DEFboxTranform{
children[
Shape{Box...}
DEFtouchBoxTouchSensor{}#定义触发节点
]
}
把修改过的文件另存为“touchme.wrl”。
3.事件传递
下面把触发(用鼠标箭头按动方块)和场景变化(视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成。
能够接收事件的节点都应具有事件入口(eventIn),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也就是说,事件入口象节点的域一样是有类型的。
同样,发送事件的节点应有事件出口(eventOut),事件出口也是有类型的。
例如ViewPoint节点就有一个事件入口set_bind,当向此事件送入一个值“TRUE(即所谓的入事件)时,该viewpoint节点成为当前视
点。
又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口送出一个“true(即所谓的出事件),在下一个事件发送之前,此事件一直保存在事件出口中(作为记录)。
事件出口和事件入口通过路径相连,这就是VRM文件中除节点以外的另一基本组成部分:
ROUTE语句。
ROUT语句把事件出口和事件入口联系在一起,从而构成事件体系。
在这里,我们是把接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind:
ROUTEtouchBox.isActiveTOview2.set_bind
现在我们得到的VRM文件是:
#VRMLV2.0utf8
DEFview1Viewpoint{#视点
position0020
description"view1"
}
DEFview2Viewpoint{
position5020
description"view2"
}
Group{
children[
DEFboxTransform{
translation500
children[
Shape{
appearanceAppearance{materialMaterial{diffuseColor100}
}
geometryBox{}
}
DEFtouchBoxTouchSensor{}#触感
]
}
DEFsphereTransform{
translation000
children[
Shape{
appearanceAppearance{materialMaterial{diffuseColor010}
geometrySphere{}
}
]
}
DEFconeTransform{
translation-500
children[
Shape{
appearanceAppearance{
materialMaterial{diffuseColor001}
}
geometryCone{}
}
]
}
]#endofGroupchildren
}
ROUTEtouchBox.isActiveTOview2.set_bind#传递
把这个文件调入浏览器,然后把鼠标指向方块并按下左钮(先别松开!
),可以看到视点已经变为view2,内部的机制我们已经很清楚:
左钮按下时方块节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件
“TRUE,这个事件通过路由进入视点节点view2的事件入口set_bind,view2
收到“TRUE后成为当前视点,所以在我们眼前场景发生了变化。
一
当松开鼠标左键,又回到原来的视点,称为视点回跳。
因为松开鼠标左键后,接触传感器向view2发送了“FALSE事件,,这样view2的当前地位被解除。
若不想回跳,则要自己来定义。
4.利用脚本编写自定义行为
在VRM中,利用Script节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(ScriptingLanguage)编写脚本的过程。
VRML97支持的脚本描述语言目前有两种:
Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML9标准中定义了它们和VRM的
接口方法。
应提请注意的是:
VRML是基于节点的语言,所以脚本也是封装在
Script这个特殊节点中的。
这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRM文件中的方法。
上面我们曾把接触检测器touchBox和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯:
ROUTEtouchBox.isActiveTOtouchScript.touchBoxIsActive
ROUTEtouchScript.bindView2TOview2.set_bind
其中的脚本节点touchScript有一个事