已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VRML编程实验指导2010年3月入门篇 VRML简介在本次实验中,我们来学习使用VRML编程。一、VRML的历史和现状VRML(Virtual Reality Modeling Language),意为虚拟现实建模语言。简单点说,VRML是一种用于描述三维造型与交互环境的简单的文本语言;复杂点说,VRML是在Internet上建立3D多媒体和共享虚拟世界的一个开放标准。VRML的基本目标是建立因特网上的交互式三维多媒体,基本特征包括分布式、三维、交互性、多媒体集成、境界逼真性等。VRML开始于20世纪90年代初期。1994年3月在日内瓦召开的第一届WWW大会上,首次正式提出了VRML这个名字。1994年10月在芝加哥召开的第二届WWW大会上公布了规范的VRML1.0草案。1996年8月在新奥尔良召开的3D图形技术会议Siggraph96上公布通过了规范的VRML2.0第一版。比VRML1.0增加了近30个节点,增强了静态世界,增加了交互性、动画功能、编程功能、原形定义功能。1997年12月VRML作为国际标准正式发布,1998年1月正式获得国际标准化组织ISO批准(国际标准号ISO/IEC14772-1:1997)。简称VRML97。VRML97只是在VRML2.0基础上进行了少量的修正。1999年底,VRML的又一种编码方案X3D草案发布。X3D整合正在发展的XML、JAVA等先进技术,包括了更强大、更高效的3D计算能力、渲染质量和传输速度。 2000年6月世界web3D协会发布了VRML2000国际标准(草案),2000年9月又发布了VRML2000国际标准(草案修订版)。VRML从此又进入了一个崭新的发展时代。二、VRML的功能和工作原理VRML包含3D动画、音效、传感器触发、事件输入输出、行为控制、支持多种脚本与多重使用者等功能,真正在Web上实现了动态页面,并加强了互动功能,达到真正虚拟的效果。VRML的访问方式是基于客户服务器模式,其中服务器提供VRML文件(后缀为WRL)及支持资源客户通过网络下载希望访问的文件,并通过本地平台上的VRML浏览器(Browse)交互式访问该文件描述的虚拟境界(Virtual World),因为浏览器是本地平台提供的,从而实现了和硬件平台的无关性。VRML象HTML一样,是一种ASCII码描述语言,它是一套告诉浏览器如何创建一个三维世界并在其中航行(Navigation)的指令,这些指令由绘制器(Render)解释执行,绘制器是一个内置于浏览器中或外部的程序。三、VRML的核心体系VRML文件描述的基于时间的三维空间称为虚拟境界(Virtual World),它由对象构成,而对象及其属性用节点描述,节点(Node)是VRML的基本单元。每个节点由类型、域(Field)、事件(Event)、实现、名字组成,节点按一定规则构成场景图(Scene graph),场景图中分两类节点,第一类节点用于视觉、听觉角度表现对象,它们按层次体系组织,反映境界的空间结构,提供颜色、灯光、超链接、材质、化身、重力、碰撞、地形随动、飞行等功能,支持局部坐标系;第二类节点参与事件产生和路由(Route)机制,形成路由图,确定境界随时间推移如何动态变化。环境变化、用户交互、时间推移产生事件,传感器(Sensor)检测并发出初始事件,实践产生其他事件或修改场景图结构,从而提供动态特性。插补器(Interpolator)是特殊事件处理器,利用它可以设计动画。对于复杂行为处理则须利用脚本节点(Script node),它包含一组脚本描述语言编写的函数,Script节点收到事件后,将执行相应的函数,该函数可以通过常规的事件路由机制发送事件或直接向Script节点指定节点发送事件,脚本也能动态增、删路由。四、VRML的使用与开发条件VRML的浏览环境:IE+VRML浏览插件(如Cosmo Player、Cortona等)VRML的开发工具:Windows记事本或专业VRML开发工具(如VRMLPad)五、VRML编程的一些基本概念1.虚拟世界中的坐标系:在VR世界中,X轴指向屏幕的右侧,Y轴指向屏幕的上方向,Z轴指向观察者,原点位于屏幕表面的中心,空间中的任何一点都可以用坐标(X,Y,Z)的形式表示。2.VRML程序的构成:所有的VRML文件都是以扩展名WRL结尾的文本文件或以WRZ(压缩格式)结尾的二进制文件,它一般包含如下4个部分:(1)文件头:位于VRML文件的首行,给浏览器提供文件的版本信息。对于VRML 2.0,它是:VRML V2.0 utf8。(2注释:以号开始的一段文字。(3)节点:场景信息的单位。可以用它来描述场景中的造型、灯光及声音等,如:Cylinder . 描述的就是场景中的一个圆柱形节点。(4)域值:域用于描述及改变节点的属性,值反应了域的大小。如: Cylinder height 2.0 radius 1.5 其中的height与radius就是域,而2.0和1.5就是值。域是可选的且顺序不限,如果一个节点中没有任何域,则域取内定的缺省值。 掌握了以上这些知识,我们就可以着手进行VRML简单编程的学习了!基础篇 VRML简单编程准备工作1.安装VRML的IE插件Cortona(可从服务器上下载,cortvrml.exe)2.打开Windows附件中的“记事本”程序,作为文本编辑器,也可以使用Vrmlpad编辑器(可从服务器下载)。第一节 Hello World一、实验目的掌握使用几何体构建境界及设定几何体的颜色与材质的方法二、实验内容创建一个由立方体、圆锥和球体组成的场景三、实验步骤1.创建立方体在文本编辑器中输入的第一行文字是: #VRML V2.0 utf8 这是VRML文件的标志,所有2.0版本的VRML文件都以这行文字打头,VRML97是由VRML2.0版修订而成的,符合VRML97规范的VRML文件也以这行文字打头。其中“#”表示这是一个注释。而utf8表示此文件采用的是utf8编码方案,这在标准中有详细说明。 先加入一个Group节点(组节点): Group 组节点的花括号之内的所有内容视为一个整体,利用组节点可以把虚拟场景组织成条理清晰的树形分支结构。下面定义组节点的children域(孩子域): children 在children后的方括号内定义Group节点的所有孩子对象,第一个孩子是一个Shape节点(形态节点),它描述一个几何形状及其颜色等特征: Shape 在Shape 节点内定义一个几何体Box(方盒节点):geometry Box 注意我们没有为Box定义任何域,这意味着它的尺寸和坐标位置等特性取缺省值(单位立方体)。随后补齐各右括号: 至此,我们已经成功地制作了第一个虚拟境界,把它保存为“01_白色立方体.wrl”,下面是完整的代码:#VRML V2.0 utf8Group children Shape geometry Box 用浏览器打开这个文件,你会看到一个白色的立方体,如图1.1所示。尽管不太好看,但你还是可以通过改变视点位置从不同方位观察它,初步体验“三维交互”的感觉。图1.12.定义立方体的外观 下面定义立方体的外观,这只需改变Shape节点的appearance域(外观),appearance 域是一个Appearance 节点,此Appearance节点的material域(材质)定义为一个Material 节点: appearance Appearance material Material 这样,上面的Shape节点变成了: Shape appearance Appearance material Material geometry Box 这是定义几何造型的基本格式。现在立方体还是白色的,这是因为其中的Material节点采用的还是缺省值,下面修改它的diffuseColor域(漫射色),VRML的颜色说明采用的是RGB颜色模型,所以要定义红色的立方体,漫射色应该是1 0 0,三个数字依次表示红色、绿色和蓝色,取值范围都是0到1: material Material diffuseColor 1 0 0 现在我们生成了第二个场景,完整的代码是:#VRML V2.0 utf8Group children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 将其保存为“01_红色立方体.wrl”。在这个场景中,红色的立方体位于屏幕的中心,它的中心坐标为0 0 0 ,如图1.2所示。图1.23.移动立方体若想把这个立方体移动一个位置,可以通过为它外套一个Transform(变换节点)来实现:Transform translation 5 0 0 children Shape appearance Appearance material Material geometry Box 在VRML中,Transform节点除了可以引进平移、旋转和缩放变换以外,其作用和Group节点的作用一样。把Transform 节点的translation域(平移)设置为5 0 0,意味着Transform节点所在的坐标系相对于其上层坐标系向右平移(即x轴方向)5个单位,在其它两个方向不移动,VRML的距离单位是米,5个单位相当于5米。第三个场景的完整代码是:#VRML V2.0 utf8Group children Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 将其保存为“01_平移.wrl”。在这个场景中,红色立方体向右平移了5个单位,如图1.3所示。图1.34.创建完整场景 接下来我们把立方体所在的Transform节点复制三份,并把各自包含的几何形状依次定义为立方体、球体和圆锥: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 由于VRML文件中有许多括号(花括号“”和方括号“”),所以务请注意括号的配对,建议采用本教程的缩进风格。注意上面的VRML文件中三个Transform节点的平移量是不同的,因而三个几何体的位置也就不同。另外,还可以修改三个几何体的颜色:球面Sphere为绿色(0 1 0),圆锥为蓝色( 0 0 1 )。最后,为了以后引用方便,分别给这三个Transform 节点指定一个名称:DEF box Transform .DEF sphere Transform .DEF cone Transform .这个VRML场景的完整代码是:#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 material 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 把此文件保存为“01_HelloWorld.wrl”,用IE浏览器打开这个文件,在Comso Player中,通过调整视点从多个方位浏览自己的作品。小结:在个实验中,我们创建了第一个虚拟境界,涉及到如何用几何体构建境界,以及如何设定几何体的颜色与材质。尽管这个由立方体、圆锥和球体组成的场景图比较简单,但已经反映了VRML的基本功能。当然,除了可用鼠标改变视点外,这还只是一个静态世界,在下一个实验中,我们将引进VRML的动态特征。四、练习1.尝试改变几何体的位置;2.尝试改变几何体的颜色。五、作业:根据以下图片调整几何体的位置和颜色,将结果保存为work_1.wrl。第二节 增加交互能力一、实验目的掌握视点触发和自定义脚本的编写方法二、实验内容创建一个场景,使场景中的对象能够根据用户动作做出反应三、实验步骤在实验一中我们学习了用几何体建立虚拟境界以及为几何体赋予色彩和材质的方法,这样建立的虚拟境界是静态的。现在我们将使一个几何体(为了更具一般性,下面我们称之为对象)能够根据用户动作做出反应,即交互能力,这是VRML2.0最突出的特征。1.检测器 在VRML中,检测器(Sensor)节点是交互能力的基础。检测器节点共九种。在场景图中,检测器节点一般是以其它节点的子节点的身份而存在的,它的父节点称为可触发节点,触发条件和时机由检测器节点类型确定。 接触检测器(TouchSensor)是最常用的检测器之一,最典型的应用例子是开关。其它检测器将在后续教程中陆续介绍。这里我们定义一个开关节点lightSwitch(这是一个组节点),并定义一个接触检测器作为它的子节点:DEF lightSwitch Group children 各几何造型子节点.DEF touchSensor TouchSensor 这样开关节点lightSwitch就是一个可触发节点。当然,检测器存在的理由是它被触发时能够引起某种变化,所以在更深入讨论开关节点之前,我们先讨论一下场景变化。2.视点最常见的变化是视点的变化,在我们的第一个场境中你可能已经体验到视点变化:当你拖动鼠标或按动箭头键时(按照VRML术语,称为航行),虚拟场境就会旋转或缩放,这实际上是在调整你的视点位置或视角。在虚拟场景的重要位置可以定义视点节点(ViewPoint),它们是场境作者给用户推荐的观赏方位,在Cosmo Player浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点。这里我们定义两个视点节点:DEF view1 Viewpoint position 0 0 20description View1 DEF view2 Viewpoint position 5 0 20description view2我们的潜在目的是使用户可以通过触发开关节点来切换视点。现在先研究一下这两个视点节点,其中的坐标表示视点在场景中的位置,坐标的单位是米,这在前面已经提到过,视点的名称将会在浏览器菜单中提示出来供用户选择。把上述视点说明加入01_HelloWorld.wrl中(放在Group节点之前),并把其中的立方体节点修改成可触发节点:DEF box Tranform children Shape . Box .DEF touchBox TouchSensor 把修改过的文件另存为“touchme.wrl”。3.事件传递 下面我们把触发(用鼠标箭头按动立方体)和场景变化(视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成。能够接收事件的节点都应具有事件入口(eventIn),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也就是说,事件入口象节点的域一样是有类型的。同样,发送事件的节点应有事件出口(eventOut),事件出口也是有类型的。例如ViewPoint节点就有一个事件入口set_bind,当向此事件送入一个值“TRUE”(即所谓的入事件)时,该viewpoint节点成为当前视点。又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口送出一个“TRUE”(即所谓的出事件),补充一句,在下一个事件发送之前,此事件一直保存在事件出口中(作为记录)。 事件出口和事件入口通过路径相连,这就是VRML文件中除节点以外的另一基本组成部分:ROUTE 语句。ROUTE语句把事件出口和事件入口联系在一起,从而构成事件体系。在这里,我们是把接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind:ROTUE touchBox.isActive TO view2.set_bind 好了!现在我们得到的VRML文件是:#VRML V2.0 utf8DEF view1 Viewpoint position 0 0 20description view1 DEF view2 Viewpoint position 5 0 20description view2 Group children DEF box Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF touchBox TouchSensor DEF sphere Transform translation 0 0 0children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children ROUTE touchBox.isActive TO view2.set_bind把这个文件保存为“02_视点触发.wrl”,将其调入浏览器,可以看到初始的视点为view1。首先把鼠标指向立方体,鼠标指针将变为图2.1所示的形状。然后按下鼠标左键(先别松开!),可以看到视点已经变为view2,如图2.2所示。内部的机制是这样:左键按下时立方体节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE”,这个事件通过路由进入视点节点view2的事件入口set_bind,view2收到“TRUE”后成为当前视点,所以在我们眼前的场景发生了变化。图2.1图2.2现在松开左键,可以看到场景恢复到原来方位,这种功能称为视点回跳,其原因是松开左键后接触检测器向view2发送了一个“FASLE”事件,这样view2当前的地位被解除,原来的视点成为系统视点栈的栈顶节点(即当前视点)。4.利用脚本编写自定义行为如果我们不想视点回跳,就想停留在view2视点,那该怎么办呢?这种非系统缺省功能要自己来定义。在VRML中,利用Script节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚本的过程。VRML97支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML97标准中定义了它们和VRML的接口方法。应提请注意的是:VRML是基于节点的语言,所以脚本也是封装在Script这个特殊节点中的。这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法。上面我们曾把接触检测器touchBox 和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯:ROUTE touchBox.isActive TO touchScript.touchBoxIsActive ROUTE touchScript.bindView2 TO view2.set_bind 其中的脚本节点touchScript有一个事件入口touchBoxIsActive和一个事件出口bind_View2,前者接收来自接触检测器touchBox的事件,然后经自己的脚本处理后,把结果发送给视点节点view2:DEF touchScript Script eventIn SFBool touchBoxIsActive eventOut SFBool bindView2 urljavescript: function touchBoxIsActive(active) 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”事件(还可以进行其它判断或执行其它事件)。(6)view2节点收到“TRUE”事件,成为当前视点。按照VRML约定,“认为”上述事件是同时发生的,也就是这些事件的时间戳相同。(7)若用户松开鼠标左键,则接触检测器发出一个“FALSE”事件,此事件同样引起脚本函数调用并发送“TRUE”事件,所以view2仍然保持为当前视点。本例的完整代码是:#VRML V2.0 utf8DEF view1 Viewpoint position 0 0 20description view1DEF view2 Viewpoint position 5 0 20description view2Group children DEF box Transform translation
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服务落地课件
- 河北邯郸市部分校2026-2027学年高一上学期期中考试语文试卷
- 房屋方案讲解课件
- 发通知的课件
- 防烫伤小班安全教育课件
- 飞天美术课件
- 伐檀课件中职课件
- 防台防汛演练课件
- 防台风模板封面课件
- 事业单位财会岗2026面试必练考题经典考题试卷及解析
- 新版2026年新教材统编版九年级上册道德与法治期末复习全册考点提纲
- 新版2026秋新苏教版小学科学五年级上册全册知识点考点合集
- 2027兴业银行校园招聘笔试参考题库及答案详解
- ASME B31.3-2024 中文版(工艺管道规范 引用 ASME V 卷无损检测要求)
- 武汉产业投资控股集团有限公司招聘笔试参考题库及答案详解
- 2026年海南发展控股公司招聘试题及答案
- 2025年山东公务员考试行测真题完整版(含答案+详细解析)
- 《JBT 20114.4-2009 糖浆剂瓶封口机》专题研究报告
- 喷涂工序低温烘干控制规范
- APQC跨行业流程分类框架 (8.0 版)( 中文版-2026年4月)
- 公司提质增效专项行动实施方案
评论
0/150
提交评论