版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、虚拟现实技术VRML篇一、VRML介绍1.什么是VRML?VRML是“Virtual Reality Modeling Language”的缩写形式,意思是“虚拟现实造型语言”。 第一代Web是以HTML为核心的二维扫瞄技术,受HTML语言的局限性,VRML之前的网页只能是简单的平面结构,而且实现环境与参与者的动态交互是特不烦琐的。第二代Web是以VRML为核心的三维扫瞄技术。第二代Web把VRML与HTML、Java、媒体信息流等技术有机地结合起来,形成一种新的三维超媒体Web。 VRML是用来描述三维物体及其行为的,能够构建虚拟境地(Virtural World), 能够集成文本、图像、音
2、响、MPEG影像等多种媒体类型,还能够内嵌用Java、ECMAScript等语言编写的程序代码。以VRML为核心构建的虚拟世界中用户如身处真实世界,能够和虚拟物体交互,人们能够以适应的自然方式访问各种场所,在虚拟社区中“直接”交谈和交往。事实上,目前采纳VRML技术取得成功的案例差不多专门多,例如探路者到达火星后的信息确实是利用VRML在因特网上即时公布的,网络用户能够以三维方式随探路者探究火星。 2.VRML的工作原理VRML定义了一种把3D图形和多媒体集成在一起的文件格式。从语法角度看,VRML文件是显式地定义和组织起来的3D多媒体对象集合;从语义角度看,VRML文件描述的是基于时刻的交互
3、式3D多媒体信息的抽象功能行为。VRML文件描述的基于时刻的3D空间称为虚拟境地(Virtual World),简称境地,所包含的图形对象和听觉对象可通过多种机制动态修改。 VRML文件能够包含对其他标准格式文件的引用。能够把JPEG、PNG和MPEG文件用于对象纹理映射,把WAV和MIDI文件用于在境地中播放的声音。另外,还能够引用包含Java或ECMAScript代码的文件,从而实现对象的编程行为。 VRML使用场景图(Scene Graph)数据结构来建立3D实境,VRML的场景图是一种代表所有3D世界静态特征的节点等级:几何关系、质材、纹理、几何转换、光线、视点以及嵌套结构。几乎所有生
4、产厂商,不管是CAD、建模、动画、VR,依旧VRML,他们的结构核心都有场景图。 境地中的对象及其属性用节点(Node)描述,节点按照一定规则构成场景图(Scene Graph),也确实是讲,场景图是境地的内部表示。场景图中的第一类节点用于从视觉和听觉角度表现对象,它们按照层次体系组织起来,反映了境地的空间结构。另一类节点参与事件产生和路由机制,形成路由图(Route Graph),确定境地随时刻的推移如何动态变化。 VRML文件的解释、执行和呈现通过扫瞄器实现,这与利用扫瞄器显示HTML文件的机制完全相同。扫瞄器把场景图中的形态和声音呈现给用户,这种视听觉呈现即所谓的虚拟世界(境地)。用户通
5、过扫瞄器获得的视听觉效果如同从某个特定方位体验到的,境地中的这种位置和朝向称为取景器(Viewer)。 3.VRML的应用VRML在电子商务、教育、工程技术、建筑、娱乐、艺术等领域有广泛的应用。 例如在教育上,VRML不仅仅是HTML功能更强的替代品,其潜在意义在于突破上述基于WWW的教学模型建立更自然、更真实的虚拟教育环境。在这种环境中学生能够以扫瞄探究的方式汲取知识,如进入虚拟太空学习天文知识,利用虚拟地球学习地理知识,穿过历史长廊与历史人物交流,进入分子世界游历化学殿堂等等,这些曾经是梦想中的学习方式都能够逐步实现。在那个虚拟教育世界中,甚至能够有利用VRML制作的动画人物扮演教师,其面
6、部表情和形体动作利用动作跟踪系统捕捉下来,如此得到的讲课节目将是三维的。假如把这种方式扩大到教学双方,则可实现具有实时交互性的虚拟教学教师操纵的虚拟教师和学生操纵的虚拟学生就能够在一个虚拟教室中相互交流。 4.VRML的工作组及其研究目标 为了推动VRML技术的进展,VRML协会组织了专门多工作组,每个工作组差不多上自愿组织、自我约束、并经VRML协会认可的技术委员会,负责某个与VRML有关的专题技术的研究和实现工作。人性动画工作组(Humanoid Animation WG)利用VRML表现人类行为特性。 色彩保真工作组(Color Fidelity WG)确保采纳任何平台的观众所看到的效果
7、都和创作者的原始作品一样,颜色应相当一致。 元形式工作组(Meta Forms WG)针对利用形式文法生成的作品,提出一般性的方法论和一般性规范,使之能够映射为某种特定形式。首要目标是能够表示数字生命格式( Digital Life-Forms)结构和增长。 面向对象扩展工作组(Object-Oriented Extensions WG)探讨和推动对VRML进行面向对象扩展的方法。 数据库工作组(Database WG)推进基于VRML商业应用的创建,利用数据库维护VRML 内容的持久性、升级能力和安全传输能力。 外部创作接口工作组(External Authoring Interface W
8、G)在VRML境地和外部环境之间建立标准接口。 界面组件工作组(Widgets WG)为开发者和用户提供一套基础性的、可自由使用的标准用户界面组件集,并提供支持差不多组件集和所有VRML组件的理论框架。 二进制压缩格式工作组(Compressed Binary Format WG)探讨并开发VRML文件的二进制编码方法,重点是研究为了快速传送目的而尽量缩小文件尺寸,同时为了快速解码目的而尽量简化文件结构。 通用媒体库工作组(Universal Media Libraries WG)为了提高VRML境地的真实感,同时减少网络的下载量,而定义一种由驻留本地的媒体元件(纹理、声音和VRML对象)组成
9、的小型跨平台媒体库。同时定义一种统一机制,通过这种机制,VRML内容创作者能够在自己的境地中使用这些媒体元件。 活动境地工作组(Living Worlds WG)为多用户(包括多个开发者)应用的产生和进化定义概念框架,并确定一组界面。 键盘输入工作组(Keyboard Input WG)为了使内容创作者能够在自己的境地中访问键盘输入,定义一个或多个扩充节点。 一致性工作组(Conformance WG)为与一致性测试有关的问题提供一个讨论场所,特不地,本组将辨不VRML实现发生分歧的地点以及相应的动作序列。 生物圈工作组(Biota WG)为生命系统(Living System)的研究和学习建
10、立、配备数字式工具和环境。 分布式交互仿真工作组(Distributed Interactive Simulation WG)为建立有多广播能力(Multicast-Capable)的大规模虚拟环境(Large-Scale Virtual Environments,LSVEs)确立初始网络约定。 VRML脚本工作组(VRML Script WG)向VRML监查组(VRML Review Board,VRB)提供有关Java和JavaScript的问题列表、修改建议和评论。 自然语言处理和动画工作组(NLP & Animations WG)为了使用户能使用自然语言和VRML动画形象进行交流,从而
11、使交互更自然,增强用户和动画形象之间的信息流淌,研究如何使用“问题/回答”、“命令/响应”式的对话以及基于操作系统命令和字符操纵的自然语言。 VRML-DHTML集成工作组(VRML-DHTML Integration WG)为VRML和DHTML在文档对象模型、组件(Component)接口和绘制等三个层次的紧密集成开发一种概念模型。 6.研究现状VRML97公布后,互联网上的3D图形几乎都使用了VRML。由于技术的局限性,如带宽不够,需要下栽插件扫瞄,文件量大,真实感、交互性需要进一步加强等缘故,最近一二年,许多制作Web3D图形的软件公司的产品,并没有完全遵循VRML97标准,而是使用了
12、专用的文件格式和扫瞄器插件,开发了比较有用的VR软件。这些软件有些比VRML有了进步,在渲染速度、图像质量、造型技术、交互性以及数据的压缩与优化上,都有胜过VRML之处。比如,Cult3D、Viewpoint、GL4Java、Pulse3D、Flatland、Flash、JPEG2000等。 CULT3D、VIEWPOINT、360度环视等技术正被应用。以Blaxxun和ParallelGraphics公司为代表,它们都有各自的VR扫瞄器插件,并各自开发基于VRML标准的扩展节点功能(X3D),使3D的效果,交互性能更加完美;支持MPEG,Mov、Avi等视频文件,Rm等流媒体文件,Wav、M
13、idi、Mp3、Aiff等多种音频文件,Flash动画文件,多种材质效果,支持Nurbs曲线,粒子效果,雾化效果;支持多人的交互环境,VR眼镜等硬件设备;在娱乐、电子商务等领域都有成功的应用,并各自为适应X3D的进展,以X3D为核心,有Blaxxun3D等相关产品。在虚拟场景,尤其是大场景的应用方面,以VRML标准为核心的技术具有独特的优势。二、初识VRML(一)VRML的文件结构1.文件头VRML2.0(VRML97)开头如下:# VRML V2.0 utf8VRML是大小写敏感的,utf8是指一种纯文本编码方式2.场景图(Scene Graph)由描述“对象及其属性”的节点组成,节点是VR
14、ML的差不多单元,场景图的第一类节点用于从视觉和听觉角度表现对象,它们是按照层次体系结构组织的;另一类节点,则参与事件产生和路由机制。3.原型(Prototype)用户能够通过原型扩充VRML的节点类型集。原型的定义能够包含在使用该原型的文件中,也能够在外部定义。4.事件路由(Route)有些VRML节点能通过产生事件响应环境变化或用户交互。事件一旦产生,就按时刻顺序向路由目标节点发送。目标节点接收后进行相应处理,可改变节点状态,产生其他事件,或者修改场景图的结构。利用脚本节点Script,作者能够Java或JavaScript语言自定义任意事件处理。(二)VRKL节点和数据类型虚拟场景由对象
15、构成,对象及其属性用节点(Node)描述,节点是构成VRML文件的差不多单元。VRML97定义了54种差不多节点类型(内部节点类型),用户也能够通过原型机制定义自己的节点类型。节点由域和事件组成:1.域(field) 描述了节点的当前状态。其中外露域(exposedField)是域和事件的统一体,它既作为域描述节点,又隐含着形如“set_域名”的入事件和“域名_changed”的出事件。2.事件(event)分为入事件和出事件,入事件将导致节点状态的改变;出事件向外报告自身状态的变化。(三)VRML扫瞄器 Blaxxun Contact 3DCosmo PlayerVisvape等Micros
16、oft VRML2.0 Viewer(四)编写VRML境地1.制作第一个虚拟境地#VRML V2.0 utf8Group children Shape geometry Box 将它保存为SimpleWorld.wrl文件,则能够用扫瞄器看到它。 2.定义外观第二场景再定义立方体的外观,即改变Shape节点的appearance域(外观),appearance域是一个节点,此节点的material域定义为一个Material节点: 则Shape节点变成了:Shape appearance Appearance material Material geometry Box 修改它的diffuse
17、Color域(漫射色),应该是 1 0 0 ,3个数字分不表示红色、绿色和蓝色,取值范围是0到1:material Material diffuseColor 1 0 0 如此,生成了第二个场景文件:#VRML V2.0 utf8Group children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 3.定义变换第三个场景若想移动那个红色的立方体,能够通过为它外套一个Transform节点来实现: Transform translation 5 0 0 children Shape
18、 appearance Appearance material Material diffuseColor 1 0 0 geometry Box Transform节点的translation 5 0 0表示x轴向上右移5个单位(米)则第三个场景完整代码如下:# VRML V2.0 utf8Group children Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 4.复制节点第四个场景 复制节点,并将各自的几何
19、形状定义为方块、球体和圆椎Group children Transform translation 5 0 0 children Shape . . . geometry Box Transform translation 0 0 0 children Shape . . . geometry Sphere Transform translation -5 0 0 children Shape . . . geometry Cone # end of Group children 为了以后引用方便,分不给这3个Transform节点指定一个名称: DEF box Transform . . .
20、 DEF Sphere Transform . . . DEF cone Transform . . . 则第四个场景的完整代码是:# VRML V2.0 utf8Group children DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF sphere Transform translation 0 0 0 children Shape appearance Appearance mate
21、rial Material diffuseColor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone # end of Group children将此文件保存为FirstWorld.wrl,用扫瞄器观看,可从多个方位扫瞄自己的作品。(五)交互能力的加入1.传感器 是交互能力的基础,共9种。在场景中,传感器节点一般是以其他节点的子节点的身份存在的,它
22、的父节点称为可触发节点,触发条件和时机由传感器节点类型确定。 接触传感器(TouchSensor)是最常用的传感器,先了解一下开关节点lightSwitch(组节点),并定义一个接触传感器作为它的子节点: DEF lightSwitch Group children 各几何造型节点 DEF touchSensor TouchSensor 传感器能引起某种变化,下面看场景变化。2.视点当你拖动鼠标或按动箭头键时(按照VRML术语,称为航行),虚拟境地就会旋转或缩放,这实际上是在调整你的视点位置或视角。在虚拟场景的重要位置能够定义视点节点(ViewPoint),它们是境地作者给用户推举的上佳观赏方
23、位,在CosmoPlayer扫瞄器中,用户就能够通过鼠标右键选择作者推举的各个视点。那个地点我们定义两个视点节点:DEF view1 Viewpoint “view1”是编程时引用的名字position 0 0 20 description View1 “View1”是扫瞄器上显示的名字 DEF view2 Viewpoint position 5 0 20 description view2 目的是使用户能够通过触发开关节点来切换视点。视点节点中的坐标表示视点在场景中的位置,坐标的单位是米,视点的名称将会在扫瞄器菜单中提示出来供用户选择。把上述视点讲明加入helloworld2.wrl中(放
24、在Group节点之前),并把其中的方块节点修改成可触发节点: DEF box Tranform children Shape . Box . DEF touchBox TouchSensor 定义触发节点 把修改过的文件另存为“touchme.wrl”。3.事件传递下面把触发(用鼠标箭头按动方块)和场景变化(视点切换)这两件情况联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成。能够接收事件的节点都应具有事件入口(eventIn),假如它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也确实是讲,事件入口象节点的域一样是有类型的。同样
25、,发送事件的节点应有事件出口(eventOut),事件出口也是有类型的。例如ViewPoint节点就有一个事件入口set_bind,当向此事件送入一个值“TRUE”(即所谓的入事件)时,该viewpoint节点成为当前视点。又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口送出一个“TRUE”(即所谓的出事件),在下一个事件发送之前,此事件一直保存在事件出口中(作为记录)。 事件出口和事件入口通过路径相连,这确实是VRML文件中除节点以外的另一差不多组成部分:ROUTE 语句。ROUTE语句把事件出口和事件入口联系在一起,从而构成事件体系。在那个
26、地点,我们是把接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind: ROUTE touchBox.isActive TO view2.set_bind 现在我们得到的VRML文件是: #VRML V2.0 utf8 DEF view1 Viewpoint 视点position 0 0 20 description view1 DEF view2 Viewpoint position 5 0 20 description view2 Group children DEF box Transform translation 5 0 0 child
27、ren Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF touchBox TouchSensor 触感 DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0 children Shape appearan
28、ce Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children ROUTE touchBox.isActive TO view2.set_bind 传递把那个文件调入扫瞄器,然后把鼠标指向方块并按下左钮(先不松开!),能够看到视点差不多变为view2,内部的机制我们差不多专门清晰:左钮按下时方块节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE”,那个事件通过路由进入视点节点view2的事件入口set_bind,view2收到“TRUE”后成为当前
29、视点,因此在我们眼前场景发生了变化。 当松开鼠标左键,又回到原来的视点,称为视点回跳。因为松开鼠标左键后,接触传感器向view2发送了“FALSE”事件,如此view2的当前地位被解除。若不想回跳,则要自己来定义。4.利用脚本编写自定义行为在VRML中,利用Script节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚本的过程。VRML97支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML97标准中定义了它们和VRML的接口方法。应提请注意
30、的是:VRML是基于节点的语言,因此脚本也是封装在Script那个专门节点中的。那个地点我们只是多讨论脚本描述语言的细节,要紧讨论把脚本集成到VRML文件中的方法。 上面我们曾把接触检测器touchBox 和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也确实是让路径绕个弯: ROUTE touchBox.isActive TO touchScript.touchBoxIsActive ROUTE touchScript.bindView2 TO view2.set_bind 其中的脚本节点touchScript有一个事件人口touchBoxI
31、sActive和一个事件出口bind_View2,前者接收来自接触检测器touchBox的事件,然后经自己的脚本处理后,把结果发送给视点节点view2: DEF touchScript Script eventIn SFBool touchBoxIsActive 入口eventOut SFBool bindView2 出口urljavescript: 脚本function touchBoxIsActive(active) 与入口同名的函数被调用bindView2= TRUE; 返回到出口 关于那个Script节点,请注意一下几点:(1)它的事件入口touchBoxIsActive和事件出口bi
32、ndView2是自定义的,其它VRML节点的域和事件差不多上固定的。(2)那个地点定义的事件入口touchBoxIsActive(即入事件)和事件出口bindView2(即出事件)的类型差不多上SFBool(单值布尔型),它们与touchBox的事件出口isActive和view2的事件入口set_bind的类型保持一致。(3)“url”是脚本节点的一个域,能够直接包含脚本,也能够包含一个或多个用URL地址指示的脚本,若有多个地址,则按照先后次序猎取第一个可得到的脚本。(4)脚本是以函数(function)的形式给出的,函数名touchBoxIsActive 与事件入口的名称相同,这是和ECM
33、AScript语言的接口约定,表示相应事件入口收到事件后调用此函数进行处理。5.事件流程与小结 下面我们整理一下事件流程: (1)用户在方块上按下鼠标左键。 (2)接触检测器发出一个“TRUE”事件。 (3)此事件进入脚本节点touchScript的事件入口touchBoxIsActive. (4)调用脚本函数touchBoxIsActive(注意函数并没有推断入事件的值)。 (5)函数向touchScript的事件出口bindView2发送一个“TRUE”事件(还能够进行其它推断或执行其它事件)。 (6)view2节点收到“TRUE”事件,成为当前视点。按照VRML约定,“认为”上述事件是同
34、时发生的,也确实是这些事件的时刻戳相同。 (7)若用户松开鼠标左键,则接触检测器发出一个“FALSE”事件,此事件同样引起脚本函数调用并发送“TRUE”事件,因此view2仍然保持为当前视点。 本节的完整代码是: #VRML V2.0 utf8 DEF view1 Viewpoint position 0 0 20 description view1 DEF view2 Viewpoint position 5 0 20 description view2 Group children DEF box Transform translation 5 0 0 children Shape app
35、earance Appearance material Material diffuseColor 1 0 0 geometry Box DEF touchBox TouchSensor DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone Tranform transaltion -5 0 0 children Shape appearance Appearance mat
36、erial Material diffuseColor 0 0 1 geometry Cone #end of Group children DEF touchScript Script eventIn SFBool touchBoxIsActive eventOut SFBool bindView2 url javascript : function touchBoxIsActive (active) bindView2 = TRUE; ROUTE touchBox.isActive TO touchScript.touchBoxIsActive ROUTE touchScript.bind
37、View2 TO view2.set_bind那个地点所建立的虚拟境地并不复杂,但涉及到了VRML2.0最基础性的功能和概念:利用检测器产生事件、利用路由传递事件以及利用脚本编写自定义行为,掌握了这些内容也就掌握了VRML2.0的核心。在后面的几节中,我们将探究一些专题性的有味功能,而本节是基础,因而必须透彻理解。 (六)进一步的完善与修饰1.邻近传感器当用户进入或离开邻近检测器所划定的区域时就会触发它。正如你在标准中能够查到的那样,ProximitySensor节点定义为:ProximitySensor exposedField SFVec3f center 0 0 0 exposedFie
38、ld SFVec3f size 0 0 0 exposedField SFBool enabled TRUE eventOut SFBool isActive eventOut SFVec3f position_changed eventOut SFRotation orientation_changed eventOut SFTime enterTime eventOut SFTime exitTime ProximitySensor节点共有三个外露域(exposedField)和五个出事件(eventOut).出事件我们差不多熟悉,是节点状态发生改变时用来通知其它节点的,那个地点的出事件i
39、sActive 用于ProximitySensor通报自己已被激活。enterTime和exitTime通报用户(代表用户的用户化身或指示器)进入和退出ProximitySensor检测区的时刻。若用户已在检测器之内,则当用户的位置或方位发生变化时,送出position_changed和orientation_changed出事件。这五个出事件联合起来,就定义了邻近检测器的功能。外露域则集域(Field)、入事件(eventIn)和出事件(eventOut)三者的功能于一身,也确实是讲,它既象域一样描述了节点的当前状态,又能够作为入事件由其它节点修改这种状态,并作为出事件把这种改变通知其它节点
40、。那个地点的enabled外露域是布尔型的,用于ProximitySensor的启用和停用,center和size定义形为长方体的邻近检测区。我们要在方块、球体和圆柱这三个物体构成的静态世界,现在在球体周围增加一个邻近检测区:DEF sphere Transform translation 0 0 0 children Shape . DEF comeClose ProximitySensor center 0 0 0 size 4 4 4 ProximitySensor的名字为comeCloser,邻近区的中心和球体的球心重合,形状为正方体,边长为4米,是球体直径的两倍。当用户走进球体时就会
41、触发那个邻近检测器,检测器发出isActive事件,我们把那个事件出口通过路由指向Script节点(用来绑定视点2):DEF comeCloserScript Script eventIn SFBool enterProximitySensorIsActive eventOut SFBool bindView2 url javascript : function enterProximitySensorIsActive (active) bindView2=TRUE; 随后,我们在邻近检测器的出事件isActive和脚本节点comeCloserScript的入事件enterProximityS
42、ensorIsActive之间建立路由,后者收到事件后执行函数enterProximitySensroIsActive,函数发出bindView2出事件,那个出事件通过路由连接到视点节点View2:ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActive ROUTE comeCloserScript.bindView2 TO view2.set_bind 也确实是讲,一旦用户进入邻近区,境地的当前视点将转换成View2.那个由两个视点、三个物体、一个邻近检测器和一个脚本节点组成的境地的完整代码如下:#V
43、RML V2.0 utf8 DEF view1 Viewpoint position 0 0 20 description view1 DEF view2 Viewpoint position 0 0 20 description view2 Group children DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF sphere Transform translation 0 0 0 c
44、hildren Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF comeCloser ProximitrySensor center 0 0 0 size 4 4 4 DEF cone Transform translation -5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children DEF co
45、meCloserScript Script eventIn SFBool enterProximitySensorIsActive eventOut SFBool bindView2 url javascript : function enterProximitySensorIsActive(active) bindView2=TRUE; ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActive ROUTE comeCloserScript.bindView2 TO view2.set_bind 启动V
46、RML扫瞄器进入境地,面向球体一直走过去,当你刚刚感到靠近球体时,会突然感到自己后退了一大步(或者讲物体跳到前方更远的地点),这表明邻近检测器差不多检测到你的靠近,它把这件事通知脚本节点,脚本节点把视点View2绑定成当前视点,从而使你感到视点突然改变。再稍稍修改一下邻近检测器,把它的中心位置向右移了2米: DEF comeCloser ProximitySensor center 2 0 0 size 4 4 4 如此你就能够从左边(方块那一边)走进球体(视点不跳),但不能从右边(圆锥那一边)走近它(视点跳转)。 总之,ProximitySensor能够检测用户是否进入或离开检测器指定的空间
47、区域,典型用法是当用户走进房间时开启灯光,当用户离开时关闭灯光,从而建立功能丰富的“智能”空间。2.连续动画我们差不多使用过接触检测器,当我们把鼠标指针放到方块(那个几何节点包含接触检测器)上面时,指针形状发生变化,这意味着我们差不多进入检测区,假如按下鼠标左钮,则按照我们的定义,当前视点会发生变化。 这一节仍然制作如此一个对接触有反应的方块,只是接触后它会连续不断地转动,动画行为能够用时刻检测器(TimeSensor)驱动,而不断变化的旋转值可用脚本节点或朝向插补器(orientationInterpolator)给出。接触传感器作为开始的差不多代码是: #VRML V2.0 utf8 DE
48、F cube Transform rotation 1 1 1 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF TouchS TouchSensor DEF revolver Script eventIn SFBool startRevolving eventOut SFRotation revolve field SFFloat angle 0 url javascript : function startRevolving () revolve0=1;
49、revolve1=1; revolve2=1; revolve3=angle; angle+=0.1; ROUTE TouchS.isOver TO revolver.startRevolving ROUTE revolver.revolve TO cube.set_rotation 其中,方块cube包含两个子节点,前者定义了它的形态(红色的单位立方体),后者把它定义成接触检测器。注意,cube的类型是Transform节点,它的rotation 域是外露域,指定本组相关于上层坐标系的旋转值,那个地点指定的初始值是“1 1 1 0 ”,其中前三个数值定义旋转轴,最后一个值定义旋转角。由于它是
50、外露域,因而能够通过入事件(名为set_rotation)进行修改,下面定义的动态行为确实是如此实现的。Script节点revolver的核心是内联的ECMAScript脚本函数。它给定一个不断变化的旋转值。当鼠标指针移动到方块之上时,接触检测器发出isOver,和第一节中采纳的isActive事件不同,isOver不需鼠标左钮按下时即可发出。isOver事件通过路由传递给脚本节点的事件入口startRevolving,从而启动函数startRevolving,函数将一个新的旋转值发往事件出口revolve,那个旋转值通过路由进入cube的外露域rotation,修改了方块的旋转角,引起它的朝
51、向变化。鼠标指针在cube上面的每次方位变化都引起isOver事件发送一次,从而导致方块旋转一次。时刻传感器为了使方块能够连续旋转,需要引进等间隔连续发送的时刻序列,这正是时刻检测器的用武之地。时刻检测器随着时刻推移不断产生事件,可用于多种目的,包括: a. 驱动连续性的仿真和动画 b. 操纵周期性的活动(如每分钟一次) c. 初始化单独事件,如报警钟 下面是我们要用的时刻检测器和修改后的路由关系: DEF ticker TimeSensor cleInterval 0.1 loop TRUE enabled FALSE ROUTE TouchS.isOver TO ticker.set_en
52、abled ROUTE ticker.cycleTime TO revolver.startRevolving ROUTE revolver.revolve TO cube.set_rotation enabled用于启用和停用时刻检测器,开始时它处于停用状态,以后由接触检测器的isOver事件修改这一状态。启用的时刻检测器每隔0.1秒送出一个cycleTime事件,并用它来触发revolver的startRevolving事件,注意,cycleTime事件的类型为SFTime,而路由两端事件的类型必须匹配,因此尽管那个地点我们不关怀那个事件表示的具体时刻,依旧把revolver的startR
53、evolving事件类型也改为SFTime.如此,revolver的函数startRevolving()就会每0.1秒调用一次,从而驱动方块连续旋转。完整的代码是:#VRML V2.0 utf8 DEF cube Transform rotation 1 1 1 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geoemtry Box DEF TouchS TouchSensor DEF revolver Script eventIn SFTime startRevolving eventO
54、ut SFRotation revolve field SFFloat angle 0 url vrmlscript : function startRevolving () revolve0=1; revolve1=1; revolve2=1; revolve3=angle; angle+=0.1; DEF ticker TimeSensor cycleInterval 0.1 loop TRUE enabled FALSE ROUTE TouchS.isOver TO ticker.set_enabled ROUTE ticker.cycleTime TO revolver.startRe
55、volving ROUTE revolver.revolve TO cube.set_rotation上述脚本节点的功能比较简单,只是不断送出调整的旋转值,它是关键帧动画的一种。由于关键帧动画十分常用,故VRML专门定义了插补器节点来实现它。方位插值器插补器节点可认为是VRML内置的脚本节点,它们执行简单的动态计算,通常和时刻检测器或者能够使对象产生动作的节点结合在一起使用,生成线性关键帧动画。插补器节点实际上是一个由关键点和对应关键值定义的分段线形函数。依照插值类型的不同,VRML共定义六个插补器节点:ColorInterpolator(颜色插补器)、CoordinateInterpolat
56、or(坐标插补器)、NormalInterpolator(法线插补器)、OrientationInterpolator(朝向插补器)、positionInterpolator(位置插补器)、ScalarInterpolator(标量插补器)。 所有插补器的域和事件差不多上类似的: eventIn SFFloat set_fruction exposedField MFFloat key . exposedField MFtypekeyValue . eventOut S|MFtype keyValue_changed 关键值域keyValue的类型决定了插补器的类型(例如,Orientatio
57、nInterpolator的keyValue域的类型是MFFloat).入事件set_fraction接收SFFloat型的事件,插补器随即依照它进行插值,并通过出事件value_changed送出插值结果。 那个地点我们把时刻检测器的fraction_changed事件作为插补器的输入,那个事件是一个0,1区间的值,每个时刻步都送出一次,表示当前周期内已过去的时刻相关于整个周期的比例,是插补器常用的输入源之一。与此对应,我们把插补器关键帧的取值也定义在0,1范围内。与0和1这两个关键帧对应的关键值的旋转轴是相同的,只是旋转角度不同(0,3.14159),如此方位插补器输出的旋转值的旋转轴固定
58、不变,旋转角从0递增到3.14159,然后不断重复。 #VRML V2.0 utf8 DEF cube Transform rotation 1 1 1 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Box DEF TouchS TouchSensor DEF revolver OrientationInterpolator key 0,1 keyValue 0.5 0.5 0.5 0,0.5 0.5 0.5 3.14159 DEF ticker TimeSensor c
59、ycleInterval 2 loop TRUE enabled FALSE ROUTE TouchS.isOver TO ticker.set_enabled ROUTE ticker.fraction_changed TO revolver.set_fraction ROUTE revolver.value_changed TO cube.set_rotation 小结:本节实现连续动画,动画由接触检测器启动,由时刻检测器驱动,动画本身比较简单,确实是不断地旋转。产生不断变化的旋转值的方法有两种:自己编写脚本,或者利用插补器节点。3.动态修改场景图场景图是描述境地结构的差不多概念,节点是构
60、成场景图的差不多单元。组节点是能够包含子节点的节点,组节点本身还可作为其他组节点的子节点,从而形成层次性体系结构。VRML中的组节点包含Anchor(锚)、Billboard(布告牌)、Collision(碰撞)、(Group)(组)、Inline(内联)、LOD(细节层次)、Switch(开关)、Transform(变换)共8种,除Inline、LOD 、Switch这几个具有专门功能外,它们都定义了人事件addChild和removeChildren,前者用于向组节点的子节点域children中增加新的子节点,后备用于从中删除子节点,如此就可以动态修改场景图的结构。下面是我们这一节要建立的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水产品购销合同(标准版)
- 2025-2026学年大同市广灵县四年级数学第二学期期中考试模拟试题含答案
- 2025-2026学年四川省甘孜藏族自治州泸定县三下数学期末试题(含解析)
- 2025-2026学年四川省凉山彝族自治州宁南县四下数学期末调研模拟试题(含答案解析)
- 2026全球减贫促进减贫行业市场现状供需分析及投资评估规划分析研究报告
- 2026日本东京电子商务市场竞争行为法律监管评估规划分析
- 2026深圳智能照明系统需求分析及行业投资策略研究
- 成考历史地理综合试题及答案
- 2026中国跨境电商物流体系优化与全球市场拓展策略
- BMW GS 95014-2024 中文版(宝马汽车 高压电线电缆技术规范)
- 2026福建通陆桥港务有限公司招聘1人笔试参考题库及答案详解
- 特许经营管理操作手册
- 2026光伏开发面试题及答案
- 初中八年级科学(浙教版)上册“流体压强与流速的关系”巅峰知识清单
- 2026年驾校三力测试题库及答案
- 2026年全国一卷高考英语听力试题真题及答案(含MP3+文本)
- 二次供水设备维护方案
- 2025年矿山救护队理论考试题库(含答案)
- YY/T 0750-2026超声理疗设备0.5 MHz~5 MHz频率范围内声场要求和测量方法
- 阿巴嘎旗别力古台镇招聘社区网格员备考题库附答案详解
- AS9100D 航空航天质量管理体系培训课件
评论
0/150
提交评论