VRML基础教程资料_第1页
VRML基础教程资料_第2页
VRML基础教程资料_第3页
VRML基础教程资料_第4页
VRML基础教程资料_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VRML基础教程资料第一个虚拟境界#VRMLV2.0utf8这是VRML文件的标志,所有2.0版本的VRML文件都以这行文字开头,VRML97是由VRML2.0版修订而成的,符合VRML97规范的VRML文件也以这行文字开头。其中“#”表示这是一个注释。而utf8表示此文件采用的是utf8编码方案,这在VRML标准中有详细说明。1第一个虚拟境界Group节点加入一个Group节点(组节点):Group{组节点花括号之内的所有内容视为一个整体,利用组节点可以把虚拟场景组织成条理清晰的树形分支结构。下面定义组节点的children域(孩子域):children[在children后的方括号内定义Group节点的所有孩子对象,第一个孩子是一个Shape节点(形态节点),它描述一个几何形状及其颜色等特征:Shape{在Shape节点内定义一个几何体Box(方盒节点):geometryBox{}注意,我们没有为Box定义任何域,这意味着它的尺寸和坐标位置等特性取缺省值(单位立方体)。随后补齐每个右括号:}]}2第一个虚拟境界():#VRMLV2.0utf8Group{children[Shape{geometryBox{}}]}3第一个虚拟境界下面定义立方体的外观,这只需改变Shape节点的appearance域(外观),appearance域是一个Appearance节点,此Appearance节点的material域(材质)定义为一个Material节点:4第一个虚拟境界下面定义立方体的外观,这只需改变Shape节点的appearance域(外观),appearance域是一个Appearance节点,此Appearance节点的material域(材质)定义为一个Material节点:5第一个虚拟境界Shape{appearanceAppearance{materialMaterial{}}geometryBox{}}6第一个虚拟境界diffuseColor域(漫反射颜色)VRML的颜色说明采用RGB颜色模型,所以要定义红色的立方体,漫反射颜色应该是{100},三个数字依次表示红色、绿色和蓝色,取值范围都是0到1:materialMaterial{diffuseColor100}7第一个虚拟境界():#VRMLV2.0utf8Group{children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}8第一个虚拟境界():#VRMLV2.0utf8Group{children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}9第一个虚拟境界红色的立方体位于屏幕的中心,它的中心坐标为{000}。移动位置可以外套一个Transform(变换节点)来实现:Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}10第一个虚拟境界在VRML中,Transform节点除了可以引进平移、旋转和缩放变换以外,其作用和Group节点的作用一样。把Transform节点的translation域(平移)设置为500,意味着Transform节点所在的坐标系相对于其上层坐标系向右平移(即x轴方向)5个单位,在其它两个方向不移动,VRML的距离单位是米,5个单位相当于5米11第一个虚拟境界():#VRMLV2.0utf8Group{children[Transform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}]}12第一个虚拟境界接下来我们把方块所在的Transform节点复制三份,并把各自包含的几何形状依次定义为方块、球体和圆锥13第一个虚拟境界():#VRMLV2.0utf8Group{children[Transform{translation500children[Shape{geometryBox{}}]}Transform{translation000children[Shape{geometrySphere{}}]}Transform{translation-500children[Shape{geometryCone{}}]}]#endofGroupchildren}14第一个虚拟境界VRML文件中有许多括号(花括号“{}”和方括“[]”),请注意括号的配对,建议采用本教程的缩进风格。上述VRML文件中三个Transform节点的平移量是不同的,因而三个几何体的位置也就不同。另外,还可以修改三个几何体的颜色:球面Sphere为绿色(010),圆锥为蓝色(010)。15第一个虚拟境界为了以后引用方便,分别给这三个Transform节点指定一个名称:DEFboxTransform{...}DEFsphereTransform{...}DEFconeTransform{...}16第一个虚拟境界():#VRMLV2.0utf8Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}17增加交互能力上一节我们学习了用几何体建立虚拟境界以及为几何体赋予色彩和材质的方法,这样建立的虚拟境界是静态的。这一节我们将使一个几何体(为了更具一般性,下面我们称之为对象)能够根据用户动作做出反应,即交互能力,这是VRML2.0最突出的特征。18增加交互能力1、检测器在VRML中,检测器(Sensor)节点是交互能力的基础。检测器节点共九种。在场景图中,检测器节点一般是以其它节点的子节点的身份而存在的,它的父节点称为可触发节点,触发条件和时机由检测器节点类型确定。19增加交互能力接触检测器(TouchSensor)是最常用的检测器之一最典型的应用例子是开关。其它检测器将在后续章节中陆续介绍。这里我们定义一个开关节点lightSwitch(这是一个组节点),并定义一个接触检测器作为它的子节点:DEFlightSwitchGroup{children[各几何造型子节点...DEFtouchSensorTouchSensor{}]}20增加交互能力这样开关节点lightSwitch就是一个可触发节点。当然,检测器存在的理由是它被触发时能够引起某种变化,所以在更深入讨论开关节点之前,我们先讨论一下场景的变化。21增加交互能力2、视点最常见的变化是视点的变化,在我们的第一个境界中你可能已经体验到视点变化:当你拖动鼠标或按动箭头键时(按照VRML术语,称为航行),虚拟境界就会旋转或缩放,这实际上是在调整你的视点位置或视角。在虚拟场景的重要位置可以定义视点节点(ViewPoint),它们是境界作者给用户推荐的最佳观赏方位,在CosmoPlayer浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点。这里我们定义两个视点节点:22增加交互能力这里我们定义两个视点节点:DEFview1Viewpoint{position0020description"View1"}DEFview2Viewpoint{position5020description"view2"}23增加交互能力我们的目的是使用户可以通过触发开关节点来切换视点。现在先研究一下这两个视点节点,其中的坐标表示视点在场景中的位置,坐标的单位是米,这在前面已经提到过,视点的名称将会在浏览器菜单中提示出来供用户选择。把上述视点说明加入helloworld5.wrl中(放在Group节点之前),并把其中的方块节点修改成可触发节点:24增加交互能力DEFboxTransform{children[Shape{....Box...}DEFtouchBoxTouchSensor{}]}把修改过的文件另存为“”。25增加交互能力3、事件传递把触发(用鼠标箭头按动方块)和场景变化(视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成。能够接收事件的节点都应具有事件入口(eventIn),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也就是说,事件入口象节点的域一样是有类型的。同样,发送事件的节点应有事件出口(eventOut),事件出口也是有类型的。例如ViewPoint节点就有一个事件入口set_bind,当向此事件送入一个值“TRUE”(即所谓的入事件)时,该viewpoint节点成为当前视点。又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口送出一个“TRUE”(即所谓的出事件),在下一个事件发送之前,此事件一直保存在事件出口中(作为记录)。26增加交互能力3、事件传递事件出口和事件入口通过路径相连,这就是VRML文件中除节点以外的另一基本组成部分:ROUTE语句。ROUTE语句把事件出口和事件入口联系在一起,从而构成事件体系。在这里,我们把接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind:ROUTE好了!现在我们得到的VRML文件是():27增加交互能力#VRMLV2.0utf8DEFview1Viewpoint{position0020description"view1"}DEFview2Viewpoint{position5020description"view2"}Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}DEFtouchBoxTouchSensor{}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}ROUTE28增加交互能力把文件调入浏览器,然后把鼠标指向方块并按下左钮,可以看到视点已经变为view2,内部的机制我们已经很清楚:左钮按下时方块节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE”,这个事件通过路由进入视点节点view2的事件入口set_bind,view2收到“TRUE”后成为当前视点,所以在我们眼前的场景发生了变化。29增加交互能力现在松开左钮,可以看到场景恢复到原来方位,这种功能称为视点回跳,其原因是松开左钮后接触检测器向view2发送了一个“FASLE”事件,这样view2的当前视点地位被解除,原来的视点成为即当前视点,详细说明可参考VRML标准中对视点节点的专门论述。如果我们不想视点回跳,就想停留在view2视点,那该怎么办呢?这种非系统缺省功能要自己来定义。30利用脚本编写自定义行为在VRML中,利用Script节点(脚本节点)定义用户自定义行为,所谓定义就是用脚本描述语言(ScriptingLanguage)编写脚本的过程。VRML97支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应的参考资料,VRML97标准中定义了它们和VRML的接口方法。应该注意的是:VRML是基于节点的语言,所以脚本也是封装在Script这个特殊节点中的。这里我们不能过多地讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法。31利用脚本编写自定义行为我们曾把接触检测器touchBox和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯:ROUTETO32利用脚本编写自定义行为其中的脚本节点touchScript有一个事件人口touchBoxIsActive和一个事件出口bind_View2,前者接收来自接触检测器touchBox的事件,然后经自己的脚本处理后,把结果发送给视点节点view2:DEFtouchScriptScript{eventInSFBooltouchBoxIsActiveeventOutSFBoolbindView2url"javescript:functiontouchBoxIsActive(active){bindView2=TRUE;}"}33利用脚本编写自定义行为关于这个Script节点,请注意以下几点:(1)它的事件入口touchBoxIsActive和事件出口bindView2是自定义的,而其它VRML节点的域和事件都是固定的。(2)事件入口touchBoxIsActive和事件出口bindView2的类型都是SFBool(单值布尔型),touchBox的事件出口isActive和view2的事件入口set_bind的类型也是相同的。(3)“url”是脚本节点的一个域,可以直接包含脚本,也可以包含一个或多个用URL地址指示的脚本,若有多个地址,则按照先后次序获取第一个可得到的脚本。(4)脚本是以函数(function)的形式给出的,函数名touchBoxIsActive与事件入口的名称相同,这是和ECMAScript语言的接口约定,表示相应事件入口接收到事件后应调用此函数进行处理。34事件流程下面我们整理一下事件流程:(1)用户在方块上按下鼠标左键。(2)接触检测器发出一个“TRUE”事件。(3)此事件进入脚本节点touchScript的事件入口touchBoxIsActive.(4)调用脚本函数touchBoxIsActive(注意,脚本函数并没有判断入事件的值)。(5)函数向touchScript的事件出口bindView2发送一个“TRUE”事件(还可以进行其它判断或执行其它事件)。(6)view2节点收到“TRUE”事件,成为当前视点。按照VRML约定,“认为”上述事件是同时发生的,也就是这些事件的时间戳相同。(7)若用户松开鼠标左键,则接触检测器发出一个“FALSE”事件,此事件同样引起脚本函数调用并发送“TRUE”事件,所以view2仍然保持为当前视点。本节的完整代码是()35事件流程#VRMLV2.0utf8DEFview1Viewpoint{position0020description"view1"}DEFview2Viewpoint{position5020description"view2"}Group{children[DEFboxTransform{translation500children[Shape{appearanceAppearance{materialMaterial{diffuseColor100}}geometryBox{}}DEFtouchBoxTouchSensor{}]}DEFsphereTransform{translation000children[Shape{appearanceAppearance{materialMaterial{diffuseColor010}}geometrySphere{}}]}DEFconeTransform{translation-500children[Shape{appearanceAppearance{materialMaterial{diffuseColor001}}geometryCone{}}]}]#endofGroupchildren}DEFtouchScriptScript{eventInSFBooltouchBoxIsActiveeventOutSFBoolbindView2url"javascript:functiontouchBoxIsActive(active){bindView2=TRUE;}"}ROUTETO36MAYA导入VRML

37MAYA导入VRML

38MAYA导入VRML

39MAYA导入VRML

40MAYA导入VRML打开VRMLPAD,打开导入的模型。41MAYA导入VRML打开VRMLPAD,打开导入的模型。手动进行调节模型42MAYA导入VRMLtranslation-5000

rotation0011.571、“translation”用于位置移动,此例中我们把物体沿-x轴方向移动50个单位。

2、“rotation”用于转动物体。它的前三个参数定下一点,从原点到该点形成一个转动轴,第四个参数表示沿该轴转动的弧度数。此例表示把物体沿z轴转动90度.43MAYA导入带材质VRMLFortextures,bydefault,Mayauseabsolutepath(url"D:/Mesdocuments/")Forthemoment,Webseedonlyreadsrelativepath(url"./").OnesolutiontosolvetheproblemistoeditthepathinVrmlfile.IfVrmlandTexturesareatsamelevel,theurlis:url"./“IfVrmlisatrootandtexturesinafolder,theurlis:url"./Folder/“IfVrmlandtexturesareinindividualfoldersatsameleveltheurlis:url"../Folder/"44MAYA导入带材质VRML实例中的草地图片45Text节点T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论