还剩21页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
虚拟现实技术一一VRML篇
一、VRML介绍
1.什么是VRMLVRML是“Virtual RealityModeling Languagev的缩写形式,意思是“虚拟现实造型语言”第一代Web是以HTML为核心的二维浏览技术,受HTML语言的局限性,VRML之前的网页只能是简单的平面结构,而且实现环境与参与者的动态交互是非常烦琐的第二代Web是以VRML为核心的三维浏览技术第二代Web把VRML与HTML、Java,媒体信息流等技术有机地结合起来,形成一种新的三维超媒体WebVRML是用来描述三维物体及其行为的,可以构建虚拟境界Virtural World,可以集成文本、图像、音响、MPEG影像等多种媒体类型,还可以内嵌用Java、ECMAScript等语言编写的程序代码以VRML为核心构建的虚拟世界中用户如身处真实世界,可以和虚拟物体交互,人们可以以习惯的自然方式访问各种场所,在虚拟社区中“直接”交谈和交往事实上,目前采用VRML技术取得成功的案例已经很多,例如探路者到达火星后的信息就是利用VR应在因特网上即时发布的,网络用户可以以三维方式随探路者探索火星
2.VRML的工作原理VRML定义了一种把3D图形和多媒体集成在一起的文件格式从语法角度看,VRML文件是显式地定义和组织起来的3D多媒体对象集合;从语义角度看,VRML文件描述的是基于时间的交互式3D多媒体信息的抽象功能行为VRML文件描述的基于时间的3D空间称为虚拟境界Virtual World,简称境界,所包含的图形对象和听觉对象可通过多种机制动态修改VRML文件可以包含对其他标准格式文件的引用可以把JPEG、PNG和MPEG文件用于对象纹理映射,把WAV和MIDI文件用于在境界中播放的声音另外,还可以引用包含Java或ECMAScript代码的文件,从而实现对象的编程行为VRML使用场景图Scene Graph数据结构来建立3D实境,VRML的场景图是一种代表所有3D世界静态特征的节点等级几何关系、质材、纹理、几何转换、光线、视点以及嵌套结构几乎所有生产厂商,无论是CAD、建模、动画、VR,还是VRML,他们的结构核心都有场景图境界中的对象及其属性用节点Node描述,节点按照一定规则构成场景图Scene Graph,也就是说,场景图是境界的内部表示场景图中的第一类节点用于从视觉和听觉角度表现对象,它们按照层次体系组织起来,反映了境界的空间结构另一类节点参与事件产生和路由机制,形成路由图Route Graph,确定境界随时间的推移如何动态变化VRML文件的解释、执行和呈现通过浏览器实现,这与利用浏览器显示HTML文件的机制完全相同浏览器把场景图中的形态和声音呈现给用户,这种视听觉呈现即所谓的虚拟世界境界o用户通过浏览器获得的视听觉效果如同从某个特定方位体验到的,境界中的这种位置和朝向称为取景器Viewer
3.VRML的应用VRML在电子商务、教育、工程技术、建筑、娱乐、艺术等领域有广泛的应用例如在教育上,VRML不仅仅是HTML功能更强的替代品,其潜在意义在于突破上述基于WWW的教学模型建立更自然、更真实的虚拟教育环境在这种环境中geometry Sphere{}]}DEF coneTransform{translation-500children[Shape{appearance Appearancematerial Material{diffuseColor001geometry Cone{}]]#end ofGroup children}ROUTE touchBox.isActive TO view
2.set_bind#传递把这个文件调入浏览器,然后把鼠标指向方块并按下左钮(先别松开!),可以看到视点已经变为view2,内部的机制我们已经很清楚左钮按下时方块节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE”,这个事件通过路由进入视点节点view2的事件入口set_bind,view2收到“TRUE”后成为当前视点,所以在我们眼前场景发生了变化当松开鼠标左键,又回到原来的视点,称为视点回跳因为松开鼠标左键后,接触传感器向view2发送了“FALSE”事件,,这样view2的当前地位被解除若不想回跳,则要自己来定义
4.利用脚本编写自定义行为在VRML中,利用Script节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚本的过程VRML97支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML97标准中定义了它们和VRML的接口方法应提请注意的是VRML是基于节点的语言,所以脚本也是封装在Script这个特殊节点中的这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法上面我们曾把接触检测器touchBox和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯ROUTE touchBox.isActive TOtouchScript.touchBoxIsActiveROUTE touchScript.bindView2TO view
2.set_bind其中的脚本节点touchScript有一个事件人口touchBoxIsActive和一个事件出口bind_View2,前者接收来自接触检测器touchBox的事件,然后经自己的脚本处理后,把结果发送给视点节点view2:DEF touchScript Script{eventin SFBooltouchBoxIsActive#入口eventOut SFBoolbindView2#出口url,z javescript:#脚本function touchBoxIsActiveactive{#与入口同名的函数被调用bindView2=TRUE;#返回到出口关于这个Script节点,请注意一下几点1它的事件入口touchBoxIsActive和事件出口bindView2是自定义的,其它VRML节点的域和事件都是固定的2这里定义的事件入口touchBoxIsActive即入事件和事件出口bindView2即出事件的类型都是SFBool单值布尔型,它们与touchBox的事件出口isActive和view2的事件入口set_bind的类型保持一致3“url”是脚本节点的一个域,/以直接包含脚本,也可以包含一个或多个用URL地址指示的脚本,若有多个地址,则按照先后次序获取第一个可得到的脚本4脚本是以函数function的形式给出的,函数名touchBoxIsActive与事件入口的名称相同,这是和ECMAScript语言的接口约定,表示相应事件入口收到事件后调用此函数进行处理
5.事件流程与小结下面我们整理一下事件流程1用户在方块上按下鼠标左键2接触检测器发出一个“TRUE”事件3此事件进入脚本节点touchScript的事件入口touchBoxIsActive.4调用脚本函数touchBoxIsActive注意函数并没有判断入事件的值5函数向touchScript的事件出口bindView2发送一个TRUE”事件还可以进行其它判断或执行其它事件6view2节点收到“TRUE”事件,成为当前视点按照VRML约定,“认为”上述事件是同时发生的,也就是这些事件的时间戳相同7若用户松开鼠标左键,则接触检测器发出一个FALSE”事件,此事件同样引起脚本函数调用并发送“TRUE”事件,所以view2仍然保持为当前视点本节的完整代码是#VRML V
2.0utf8DEF viewlViewpoint{position0020description〃viewl〃DEF view2Viewpoint{position5020description〃view2〃}Group{children[DEF boxTransform{translation500children[Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}DEF touchBoxTouchSensor{}]}DEF sphereTransform{translation000children[Shape{appearance Appearance{material Material{diffuseColor010geometry Sphere{]DEF coneTranform{transaltion-500children[Shape{appearance Appearance{material Material{diffuseColor001geometry Cone{}]I#end ofGroup childrenDEFtouchScriptScript{eventin SFBooltouchBoxIsActiveeventOut SFBoolbindView2url z/javascript:function touchBoxIsActiveactive{bindView2=TRUE;}〃ROUTE touchBox.isActive TOtouchScript.touchBoxIsActiveROUTE touchScript.bindView2TO view
2.set_bind这里所建立的虚拟境界并不复杂,但涉及到了VRML
2.0最基础性的功能和概念利用检测器产生事件、利用路由传递事件以及利用脚本编写自定义行为,掌握了这些内容也就掌握了VRML
2.0的核心在后面的几节中,我们将探索一些专题性的有趣功能,而本节是基础,因而必须透彻理解六进一步的完善与修饰
1.邻近传感器当用户进入或离开邻近检测器所划定的区域时就会触发它正如你在标准中可以查到的那样,ProximitySensor节点定义为ProximitySensor{exposedField SFVec3f center000exposedField SFVec3f size000exposedField SFBoolenabled TRUEeventOut SFBool isActiveeventOutSFVec3f positionchangedeventOut SFRotationorientation_changedeventOut SFTimeenterTimeeventOut SFTimeexitTimeProximitySensor节点共有三个外露域(exposedField)和五个出事件(eventOut).出事件我们已经熟悉,是节点状态发生改变时用来通知其它节点的,这里的出事件isActive用于ProximitySensor通报自己已被激活enterTime和exitTime通报用户(代表用户的用户化身或指示器)进入和退出ProximitySensor检测区的时刻若用户已在检测器之内,则当用户的位置或方位发生变化时,送出pos it i onchanged和or ient ationchanged出事件这五个出事件联合起来,就定义了邻近检测器的功能外露域则集域(Field)、入事件(eventin)和出事件(eventOut)三者的功能于一身,也就是说,它既象域一样描述了节点的当前状态,又可以作为入事件由其它节点修改这种状态,并作为出事件把这种改变通知其它节点这里的enabled外露域是布尔型的,用于ProximitySensor的启用和停用,center和size定义形为长方体的邻近检测区我们要在方块、球体和圆柱这三个物体构成的静态世界,现在在球体周围增加一个邻近检测区DEF sphereTransform{translation000children[ShapeDEF comeCloseProximitySensor{center000size444}]ProximitySensor的名字为comeCloser,邻近区的中心和球体的球心重合,形状为正方体,边长为4米,是球体直径的两倍当用户走进球体时就会触发这个邻近检测器,检测器发出isActive事件,我们把这个事件出口通过路由指向Script节点用来绑定视点2DEF comeCloserScript Script{eventin SFBoolenterProximitySensorlsActiveeventOutSFBoolbindView2url〃javascript:function enterProximitySensorlsActiveactive{bindView2=TRUE;}〃随后,我们在邻近检测器的出事件isActive和脚本节点comeCloserScript的入事件enterProximitySensorlsActive之间建立路由,后者收到事件后执行函数enterProximitySensroIsActive,函数发出bindView2出事件,这个出事件通过路由连接到视点节点View2:ROUTE comeCloser.isActive TOcomeCloserScript.enterProximitySensorlsActiveROUTE comeCloserScript.bindView2TO view
2.set bind也就是说,一旦用户进入邻近区,境界的当前视点麻转换成View
2.这个由两个视点、三个物体、一个邻近检测器和一个脚本节点组成的境界的完整代码如下#VRML V
2.0utf8DEF viewlViewpoint{position0020description〃viewl〃DEF view2Viewpoint{position0020description〃view2〃Group{children[DEF boxTransform{translation500children_Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}DEF sphereTransform{translation000children[Shape{appearance Appearance{material Material{diffuseColor010geometry Sphere{}}DEF comeCloserProximitrySensor{center000size444DEF coneTransform{translation-500children_Shape{appearance Appearance{material Material{diffuseColor001}geometry Cone{}]#end ofGroup childrenDEF comeCloserScriptScript{eventin SFBoolenterProximitySensorlsActiveeventOut SFBoolbindView2url javascript:function enterProximitySensorlsActiveactive{bindView2=TRUE;ROUTE comeCloser.isActive TOcomeCloserScript.enterProximitySensorlsActiveROUTE comeCloserScript.bindView2TOview
2.set_bind启动VRML浏览器进入境界,面向球体一直走过去,当你刚刚感到靠近球体时,会突然感到自己后退了一大步(或者说物体跳到前方更远的地方),这表明邻近检测器已经检测到你的靠近,它把这件事通知脚本节点,脚本节点把视点View2绑定成当前视点,从而使你感到视点突然改变再稍稍修改一下邻近检测器,把它的中心位置向右移了2米DEFcomeCloserProximitySensor{center200size444}这样你就可以从左边(方块那一边)走进球体(视点不跳),但不能从右边(圆锥那一边)走近它(视点跳转)总之,ProximitySensor能够检测用户是否进入或离开检测器指定的空间区域,典型用法是当用户走进房间时开启灯光,当用户离开时关闭灯光,从而建立功能丰富的“智能”空间
2.连续动画我们已经使用过接触检测器,当我们把鼠标指针放到方块(这个几何节点包含接触检测器)上面时,指针形状发生变化,这意味着我们已经进入检测区,如果按下鼠标左钮,则按照我们的定义,当前视点会发生变化这一节仍然制作这样一个对接触有反应的方块,只是接触后它会连续不断地转动,动画行为可以用时间检测器(TimeSensor)驱动,而不断变化的旋转值可用脚本节点或朝向插补器(orientationinterpolator)给出⑴接触传感器作为开始的基本代码是#VRML V
2.0utf8DEF cubeTransform{rotation1110children[Shape{appearance Appearance{material Material{diffuseColor100geometry Box{}}DEF TouchSTouchSensor{}DEF revolverScript{eventin SFBoolstartRevolvingeventOut SFRotation revolvefield SFFloatangle0url,zjavascript:function startRevolving(){revolve
[0]=l;revolve
[1]=1;revolve
[2]=1;revolve
[3]=angle;angle+=
0.1;}〃}ROUTE TouchS.isOver TOrevolver.startRevolvingROUTE revolver.revolve TOcube.set_rotation其中,方块cube包含两个子节点,前者定义了它的形态(红色的单位立方体),后者把它定义成接触检测器注意,cube的类型是Transform节点,它的rotation域是外露域,指定本组相对于上层坐标系的旋转值,这里指定的初始值是1110”,其中前三个数值定义旋转轴,最后一个值定义旋转角由于它是外露域,因而可以通过入事件(名为set.rotation)进行修改,下面定义的动态行为就是这样实现的Script节点revolver的核心是内联的ECMAScript脚本函数它给定一个不断变化的旋转值当鼠标指针移动到方块之上时,接触检测器发出isOver,和第一节中采用的isActive事件不同,isOver不需鼠标左钮按下时即可发出isOver事件通过路由传递给脚本节点的事件入口startRevolving,从而启动函数startRevolving,函数将一个新的旋转值发往事件出口revolve,这个旋转值通过路由进入cube的外露域rotation,修改了方块的旋转角,引起它的朝向变化鼠标指针在cube上面的每次方位变化都引起isOver事件发送一次,从而导致方块旋转一次⑵时间传感器为了使方块能够连续旋转,需要引进等间隔连续发送的时间序列,这正是时间检测器的用武之地时间检测器随着时间推移不断产生事件,可用于多种目的,包括a.驱动连续性的仿真和动画b.控制周期性的活动(如每分钟一次)c.初始化单独事件,如报警钟下面是我们要用的时间检测器和修改后的路由关系DEF tickerTimeSensor{clelnterval
0.1loop TRUEenabled FALSEROUTE TouchS.isOver TOticker.set_enabledROUTE ticker.cycleTime TOrevolver.startRevolvingROUTE revolver.revolve TOcube.set_rotationenabled用于启用和停用时间检测器,开始时它处于停用状态,以后由接触检测器的isOver事件修改这一状态启用的时间检测器每隔
0.1秒送出一个cycleTime事件,并用它来触发revolver的startRevolving事件,注意,cycleTime事件的类型为SFTime,而路由两端事件的类型必须匹配,所以尽管这里我们不关心这个事件表示的具体时刻,还是把revolver的startRevolving事件类型也改为SFTime.这样,revolver的函数startRevolving就会每
0.1秒调用一次,从而驱动方块连续旋转完整的代码是#VRML V
2.0utf8DEF cubeTransform{rotation1110children[Shape{appearance Appearance{material Material{diffuseColor100}geoemtry Box{}DEF TouchSTouchSensor{}]DEF revolverScript{eventin SFTimestartRevolving eventOutSFRotationrevolvefield SFFloatangle0url^vrmlscript:function startRevolving{revolve
[0]=l;revolve[l]=l;revolve⑵=1;revolve
[3]=angle;angle+=
0.1;DEF tickerTimeSensor{cyclelnterval
3.14159),这样方位插补器输出的旋转值的旋转轴固定不变,旋转角从0递增到
3.14159,然后不断重复#VRML V
2.0utf8DEF cubeTransform{rotation1110children[Shape{appearance Appearance{material Material{diffuseColor010学生可以以浏览探索的方式汲取知识,如进入虚拟太空学习天文知识,利用虚拟地球学习地理知识,穿过历史长廊与历史人物交流,进入分子世界游历化学殿堂等等,这些曾经是梦想中的学习方式都可以逐步实现在这个虚拟教育世界中,甚至可以有利用VRML制作的动画人物扮演教师,其面部表情和形体动作利用动作跟踪系统捕捉下来,这样得到的讲课节目将是三维的如果把这种方式扩大到教学双方,则可实现具有实时交互性的虚拟教学一一教师控制的虚拟教师和学生控制的虚拟学生就可以在一个虚拟教室中相互交流
4.VRML的工作组及其研究目标为了推动VRML技术的发展,VRML协会组织了很多工作组,每个工作组都是自愿组织、自我约束、并经VRML协会认可的技术委员会,负责某个与VRML有关的专题技术的研究和实现工作人性动画工作组Humanoid AnimationWG利用VRML表现人类行为特性色彩保真工作组Color FidelityWG确保采用任何平台的观众所看到的效果都和创作者的原始作品一样,颜色应相当一致元形式工作组Meta FormsWG针对利用形式文法生成的作品,提出一般性的方法论和一般性规范,使之能够映射为某种特定形式首要目标是能够表示〃数字生命格式〃Digital Life-Forms结构和增长面向对象扩展工作组Object-Oriented ExtensionsWG探讨和推动对VRML进行面向对象扩展的方法数据库工作组Database WG推进基于VRML商业应用的创建,利用数据库维护VRML内容的持久性、升级能力和安全传输能力外部创作接口工作组External AuthoringInterface WG在VRML境界和外部环境之间建立标准接口界面组件工作组Widgets WG为开发者和用户提供一套基础性的、可自由使用的标准用户界面组件集,并提供支持基本组件集和所有VRML组件的理论框架二进制压缩格式工作组Compressed BinaryFormat WG探讨并开发VRML文件的二进制编码方法,重点是研究为了快速传送目的而尽量缩小文件尺寸,同时为了快速解码B的而尽量简化文件结构通用媒体库工作组Universal MediaLibraries WG为了提高VRML境界的真实感,同时减少网络的下载量,而定义一种由驻留本地的媒体元件纹理、声音和VRML对象组成的小型跨平台媒体库同时定义一种统一机制,通过这种机制,VRML内容创作者可以在自己的境界中使用这些媒体元件活动境界工作组Living WorldsWG为多用户包括多个开发者应用的产生和进化定义概念框架,并确定一组界面键盘输入工作组Keyboard InputWG为了使内容创作者能够在自己的境界中访问键盘输入,定义一个或多个扩充节点一致性工作组Conformance WG为与一致性测试有关的问题提供一个讨论场所,特别地,本组将辨别VRML实现发生分歧的地方以及相应的动作序列生物圈工作组Biota WG为生命系统Living System的研究和学习建立、配备数字式工具和环境分布式交互仿真工作组Distributed InteractiveSimulation WG为建立有多广播能力Mu11icast-Capab1e的大规模虚拟环境Large-Scale VirtualEnvironments,LSVEs确立初始网络约定VRML脚本工作组VRML ScriptWG向VRML监查组VRML ReviewBoard,VRBgeometry Box{}}DEF TouchSTouchSensor{}DEF revolverOrientationinterpolator{key[0,1]keyValue[
0.
50.
50.50,
0.
50.
50.
53.14159])DEF tickerTimeSensor{cyclelnterval2loopTRUE enabledFALSE)ROUTE TouchS.isOver TOticker.set_enabledROUTE ticker.fraction_changed TOrevolver.set_fractionROUTE revolver.value_changed TOcube.set_rotation小结本节实现连续动向,动画由接触检测器记动,由时间检测器驱动,动画本身比较简单,就是不断地旋转产生不断变化的旋转值的方法有两种自己编写脚本,或者利用插补器节点
3.动态修改场景图场景图是描述境界结构的基本概念,节点是构成场景图的基本单元组节点是能够包含子节点的节点,组节点本身还可作为其他组节点的子节点,从而形成层次性体系结构VRML中的组节点包含Anchor(锚)、Billboard(布告牌)、Collision(碰撞)、(Group)(组)、Inline(内联)、LOD(细节层次)、Switch(开关)、Transform(变换)共8种,除Inline.LOD、Switch这几个具有特殊功能外,它们都定义了人事件addChild和removeChildren,前者用于向组节点的子节点域children中增加新的子节点,后备用于从中删除子节点,这样就可以动态修改场景图的结构下面是我们这一节要建立的境界,开始的时候球体位于左边红色方块的内部,在按动底部的绿色方块后,球体进人右边蓝包入块之内#VRML V
2.0utf8Viewpoint{position0015}DEF leftBoxTransform{translation-500children[Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}DEF rightBoxTransform{translation500children[Shape{appearance Appearance{material Material{diffuseColor001}geometry Box{}DEF onoffTransform{translation0-50children[Shape{appearance Appearance{material Material{diffuseColor010}geometry Box{}其中,左边的方块为红色,右边的方块为蓝色,下边的方块为绿色,都是Transform类型,三者都位于场景图的最高层,都是场景图的根节点,都包含一个Box几何体作为子节点下面为红方块增加一个球体子节点DEF leftBoxTransform{translation-500children[Shape{appearance Appearance{material Material{diffuseColor100}DEF SphereChildShape{appearance Appearance{material Material{diffuseColor101}geometry Sphere{radius
1.2}为了以后引用方便,这里为球体子节点起了名字SphereChildo为了让用户能够增删这个儿子,把绿方块定义成接触传感器DEF onoffTransform{translation0-50children[Shape{appearance Appearance{material Material{diffuseColor010}geometry Box{}}DEF TSTouchSensor{}]子节点增删的具体任务由Script节点来完成DEF SScript{eventin SFBoolisActive eventOutMFNode childfield MFNodetestNode USESphereChildurl“javascript:function isActivevalue{if valuechi Id=testNode;}”请注意,它的出事件child的类型是MFNode,也就是说,通过这个事件送出的是节点节点S的testNode域是对球体SphereChild引用USE语句,引用不复制该节点,而是把同一节点再次插入场景图,从而导致SphereChild拥有多个父亲,所以场景图仪仅是层次结构,而不是树形结构加上下面的路由语句,建立事件联系ROUTE TS.isActive TOS.isActiveROUTE S.child TOleftBox.removeChiIdrenROUTE S.child TOrightBox.addChiIdren接触传感器TS的激活事件isActive链接到脚本节点S的isActive,这样用户一旦按动绿方块,就会启动脚本节点的事件处理函数isActive,此函数把testNode节点即球体节点SphereChild送至出事件S.child根据路由,左边红方块的事件人口leftBox.removeChildren收到此事件,按照removeChildren的语义,球体节点SphereChild从leftBox的子节点列表中删除与此同时,右边蓝方块的事件入口rightBox.addChiIdren也收到S.child出事件,根据addChildren的语义,球体节点SphereChild加入rightBox的子节点列表通过这个过程,球体节点SphereChild的父节点从leftBox更换成rightBoxo
4.扩充节点类型VRML提供了54种节点类型,称为内部节点类型然而实际应用中可能要求新的节点类型,原型prototype是VRML实现节点类型扩充的基本机制新节点类型是根据已定义的内部的或原型的节点类型定义的,一旦定义,原型节点类型就可以像内部节点类型一样在场景图中实例化原型可以在当前文件中定义并使用,也可以在其他文件中定义,即外部原型外部原型提供了一种使节点类型能够跨越网络的机制本节的原型例子取自VRML97标准,它定义的是一个桌子类型,这个原型为#VRML V
2.0utf8PROTO TwoColorTable[field SFColorlegColor
0.
80.
40.7field SFColortopColor
0.
60.
60.1]Transform{Children{Transform{#桌面translation
0.
00.
60.0children_Shape{appearance Appearance{material Material{diffuseColor IStopColor}geometry Box{size
1.
20.
21.2}]}Transform{translation-
0.50-
0.5children[DEF LegShape{appearance Appearance{material Material{diffuseColor ISlegColorgeometry Cylinder{height1radius
0.1Transform{#另一条桌腿translation
0.50-
0.5children USELeg}Transform{#另一条桌腿translation-
0.
500.5children USELeg)Transform{#另一条桌腿translation
0.
500.5children USELeg)]#根节点Transform的儿子结束}#根节点Transform结束}#原型结束原型语句PROTO分为原型接口声明和原型定义两部分接口声明包括原型的入事件和出事件的类型和名称,以及原型的域的类型、名称和缺省值这里的接口声明为PROTO TwoColorTable[field SFColorlegColor
0.
80.
40.7field SFColortopColor
0.
60.
60.1]这个原型的类型名称为“TwoColorTable”(双色桌),它有两个域;legColor(桌腿色)和topColor(桌面色)作为节点类型,TwoColorTable的用法和其他内部节点类型一样接口声明之后是原型的主体,称为原型定义原型定义实际上是一个场景图,由一个或多个根节点、嵌入的PROTO语句和ROUTE语句构成,其中的第一个节点类型确定原型实例在VRML文件中的使用方法例如,如果原型定义中的第一个节点是Material节点,则只要可以使用Material节点的地方,原型实例都可以使用原型定义中定义的其他节点及其附带的场景图都不进入原型实例所在的变换层系,但可以被原型定义中的ROUTE语句或Script节点引用TwoColorTable原型中的第一个节点是Transform组节点,它决定了TwoColorTable型节点在场景图中的方法,在场景图中添加一个TwoColorTable型节点.相当于增加Transformo原型定义中节点的域、人事件、出事件可以通过IS语句和接口声明中的域、入事件、出事件建立关联,关联实际上相当于把原型定义中的这些域和事件公开作为原型的域和事件关联的基本规则是域和域、入事件和入事件、出事件和出事件对应关联,原型定义中的外露域可以和接口声明中的域、入事件、出事件或外露城关联本例中的关联有两个桌面diffuseColor域和接口声明中的topColor域,桌腿的diffuseColor域和接口声明中的legColor域之间也就是说,TwoColorTable型节点中的topColor和legColor值实际上分别确定了桌面和桌腿的漫反射色diffuseColoro提供有关Java和JavaScript的问题列表、修改建议和评论自然语言处理和动画工作组NLPAnimations WG为了使用户能使用自然语言和VRML动画形象进行交流,从而使交互更自然,增强用户和动画形象之间的信息流动,研究如何使用“问题/回答、“命令/响应”式的对话以及基于操作系统命令和字符控制的自然语言VRML-DHTML集成工作组VRML-DHTML IntegrationWG为VRML和DHTML在文档对象模型、组件Component接口和绘制等三个层次的紧密集成开发一种概念模型
6.研究现状VRML97发布后,互联网上的3D图形儿乎都使用了VRML由于技术的局限性,如带宽不够,需要下栽插件浏览,文件量大,真实感、交互性需要进一步加强等原因,最近一二年,许多制作Web3D图形的软件公司的产品,并没有完全遵循VRML97标准,而是使用了专用的文件格式和浏览器插件,开发了比较实用的VR软件这些软件有些比VRML有了进步,在渲染速度、图像质量、造型技术、交互性以及数据的压缩与优化上,都有胜过VRML之处比如,Cult3D、Viewpoint、GL4JavaPulse3D FlatlandFlash JPEG2000等CULT3D.VIEWPOINT、360度环视等技术正被应用以Blaxxun和ParallelGraphics公司为代表,它们都有各自的VR浏览器插件,并各自开发基于VRML标准的扩展节点功能X3D,使3D的效果,交互性能更加完美;支持MPEG,Mov、Avi等视频文件,Rm等流媒体文件,Wav、Midi.Mp
3、Aiff等多种音频文件,Flash动画文件,多种材质效果,支持Nurbs曲线,粒子效果,雾化效果;支持多人的交互环境,VR眼镜等硬件设备;在娱乐、电子商务等领域都有成功的应用,并各自为适应X3D的发展,以X3D为核心,有Blaxxim3D等相关产品在虚拟场景,尤其是大场景的应用方面,以VRML标准为核心的技术具有独特的优势
二、初识VRML一VRML的文件结构
1.文件头VRML
2.0VRML97开头如下#VRML V
2.0utf8VRML是大小写敏感的,utf8是指一种纯文本编码方式
2.场景图Scene Graph由描述“对象及其属性”的节点组成,节点是VRML的基本单元,场景图的第一类节点用于从视觉和听觉角度表现对象,它们是按照层次体系结构组织的;另一类节点,则参与事件产生和路由机制
3.原型Prototype用户可以通过原型扩充VRML的节点类型集原型的定义可以包含在使用该原型的文件中,也可以在外部定义
4.事件路由Route有些VRML节点能通过产生事件响应环境变化或用户交互事件一旦产生,就按时间顺序向路由目标节点发送目标节点接收后进行相应处理,可改变节点状态,产生其他事件,或者修改场景图的结构利用脚本节点Script,作者可以Java或JavaScript语言自定义任意事件处理
(二)VRKL节点和数据类型虚拟场景由对象构成,对象及其属性用节点(Node)描述,节点是构成VRML文件的基本单元VRML97定义了54种基本节点类型(内部节点类型),用户也可以通过原型机制定义自己的节点类型节点由域和事件组成
1.域(field)描述了节点的当前状态其中外露域(exposedField)是域和事件的统一体,它既作为域描述节点,又隐含着形如“set_域名”的入事件和“域名.changed”的出事件
2.事件(event)分为入事件和出事件,入事件将导致节点状态的改变;出事件向外报告自身状态的变化
(三)VRML浏览器Blaxxun Contact3DCosmo PlayerVisvape等Microsoft VRML
2.0Viewer
(四)编写VRML境界L制作第一个虚拟境界#VRML V
2.0utf8Group{children[Shape{geometry Box{})])将它保存为SimpleWorld.wrl文件,则可以用浏览器看到它
2.定义外观-----第二场景再定义立方体的外观,即改变Shape节点的appearance域(外观),appearance域是——个节点,止匕节点的material域定义为——个Material节点则Shape节点变成了Shape{appearance Appearance{material Material{}}geometry Box{})修改它的diffuseColor域(漫射色),应该是{100},3个数字分别表示红色、绿色和蓝色,取值范围是0到1material Material{diffuseColor100}这样,生成了第二个场景文件#VRML V
2.0utf8Group{children[Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}]
3.定义变换一一第三个场景若想移动这个红色的立方体,可以通过为它外套一个Transform节点来实现Transform{translation500children[Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}]}Transform节点的translation500表示x轴向上右移5个单位米则第三个场景完整代码如下#VRML V
2.0utf8Group{children[Transform{translation500children[Shape{appearanceAppearance{material Material{diffuseColor
1004.复制节点一一第四个场景复制节点,并将各自的几何形状定义为方块、球体和圆椎Group{children[Transform{translation500children[Shape{...geometry Box{}Transform{translation000children[Shape{...geometry Sphere{}]Transform{translation-500children[Shape{geometry Cone{}・・・]#end ofGroup children}为了以后引用方便,分别给这3个Transform节点指定一个名称:DEF boxTransform{...}DEF SphereTransform{...}DEF coneTransform{...}则第四个场景的完整代码是#VRML V
2.0utf8Group{children[DEF boxTransform{translation500children[Shape{appearance Appearance{material Material{diffuseColor100}geometry Box{}DEF sphereTransform{translation000children[Shape{appearance Appearance{material Material{diffuseColor010}}geometry Sphere{}DEF coneTransform{translation-500children[Shape{appearance Appearance{material Material{diffuseColor001}geometry Cone{}]}]#end ofGroup children}将此文件保存为FirstWorld.wri,用浏览器观看,可从多个方位浏览自己的作品五交互能力的加入
1.传感器是交互能力的基础,共9种在场景中,传感器节点一般是以其他节点的子节点的身份存在的,它的父节点称为可触发节点,触发条件和时机由传感器节点类型确定接触传感器(TouchSensor)是最常用的传感器,先了解一下开关节点lightSwitch(组节点),并定义一个接触传感器作为它的子节点DEF lightSwitchGroup{children[各几何造型节点……DEF touchSensorTouchSensor{}])传感器能引起某种变化,下面看场景变化
2.视点当你拖动鼠标或按动箭头键时(按照VRML术语,称为航行),虚拟境界就会旋转或缩放,这实际上是在调整你的视点位置或视角在虚拟场景的重要位置可以定义视点节点(Viewpoint),它们是境界作者给用户推荐的上佳观赏方位,在CosmoPlayer浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点这里我们定义两个视点节点DEF viewlViewpoint{#viewl”是编程时引用的名字position0020description〃Viewl〃#“Viewl”是浏览器上显示的名字}DEF view2Viewpoint{position5020description〃view2〃)目的是使用户可以通过触发开关节点来切换视点视点节点中的坐标表示视点在场景中的位置,坐标的单位是米,视点的名称将会在浏览器菜单中提示出来供用户选择把上述视点说明加入helloworld
2.wrl中(放在Group节点之前),并把其中的方块节点修改成可触发节点DEF boxTranform{children[Shape{Box...}・・・・DEF touchBoxTouchSensor{}#定义触发节点])把修改过的文件另存为“touchme.wrl”
3.事件传递下面把触发(用鼠标箭头按动方块)和场景变化(视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成能够接收事件的节点都应具有事件入口(eventin),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也就是说,事件入口象节点的域一样是有类型的同样,发送事件的节点应有事件出口(eventOut),事件出口也是有类型的例如ViewPoint节点就有一个事件入口set_bind,当向此事件送入一个值“TRUE”(即所谓的入事件)时,该viewpoint节点成为当前视点又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口送出一个“TRUE”(即所谓的出事件),在下一个事件发送之前,此事件一直保存在事件出口中(作为记录)事件出口和事件入口通过路径相连,这就是VRML文件中除节点以外的另一基本组成部分ROUTE语句ROUTE语句把事件出口和事件入口联系在一起,从而构成事件体系在这里,我们是把接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind:ROUTE touchBox.isActive TOview
2.set bind现在我们得到的VRML文件是:#VRML V
2.0utf8DEF viewlViewpoint{#视点position0020description〃viewl〃DEF view2Viewpoint{position5020description〃view2〃Group{children[DEF boxTransform{translation500children[Shape{appearance Appearance{material Material{diffuseColor100geometry Box{}DEF touchBoxTouchSensor{}#触感DEF sphereTransform{translation000children[Shape{appearance Appearance{material Material{diffuseColor010。
个人认证
优秀文档
获得点赞 0