欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年VRML基础教程 .pdf

    • 资源ID:33387455       资源大小:172.64KB        全文页数:29页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年VRML基础教程 .pdf

    VRML 基础教程VRML创作工具很多是“所见即所得”式的,通过图形界面可以方便地创作虚拟境界,但VRML不仅仅是普通的三维设计,尽管这些工具很容易上手,却往往屏蔽掉了 VRML 标准的具体细节, 因为如果想深入掌握VRML , 还需要全面了解节点、域、检测器等技术细节,而达成此目的的最好方法就是用编写文本文件的方式创作 VRML境界。本教程提供了六个典型例子,这些例子并不复杂,也不精彩,但涵盖了 VRML的关键内容。在开始创作之前,应作好下面的准备。文本编辑器:随便你喜欢的文本编辑器,如Win95 下的 NotePad,Dos 下的 Edit等等。VRML浏览器:若用的Web浏览器是Netscape4.0一下版本,可下载CosmoPlayer( http:/);若用的是Netscape4.0或更高版本,则已内置 CosmoPlayer2.0,只是安装 Netscape 时请注意是否选中了相应选项;若用的是 Internet Explore4.0,则有可能已经内置了VRML2.0浏览器,判断是否内置的方法很简单,就是看它能否打开VRML文件( *.wrl,*.wrz), 如果不行,可以从(http:/ VRML浏览器插件, 对于 IE3.x,还需要下载一些辅助插件。当然在开始之前应基本熟悉VRML浏览器的操作方法。硬件: VRML和硬件平台无关,只要能提供VRML浏览器。在下面的教程中,我们假定硬件平台是微机,输出设备是图形窗口,输入设备为鼠标器和键盘。当然,如果有更先进的虚拟现实设备和支持它的VRML浏览软件效果会更好。对于我们将要创作的境界,微机就足够了。第一节 Hello,World!按照惯例,我们以 Hello,World!作为我们的第一个虚拟境界,它由立方体、圆锥和球体组成,你可能已经注意到,VRML的标志正是由这三个几何形状构成的。输入的第一行文字是:#VRML V2.0 utf8 这是 VRML 文件的标志, 所有 2.0 版本的 VRML 文件都以这行文字打头,VRML97是由 VRML2.0版修订而成的,符合VRML97规范的 VRML文件也以这行文字打头。其中“#”表示这是一个注释。而utf8表示此文件采用的是utf8编码方案,这在标准中有详细说明。先加入一个Group 节点(组节点):Group 组节点的花括号之内的所有内容视为一个整体,利用组节点可以把虚拟场景组织成条理清晰的树形分支结构。下面定义组节点的children域(孩子域):名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 29 页 - - - - - - - - - children 在 children后的方括号内定义Group 节点的所有孩子对象,第一个孩子是一个 Shape 节点(形态节点),它描述一个几何形状及其颜色等特征:Shape 在 Shape 节点内定义一个几何体Box(方盒节点):geometry Box 注意我们没有为Box 定义任何域, 这意味着它的尺寸和坐标位置等特性取缺省值(单位立方体)。随后补齐各右括号: 至此,我们已经成功地制作了第一个虚拟境界,把它保存为Hello World.wrl,下面是完整的文件:#VRML V2.0 utf8 Group children Shape geometry Box 用浏览器打开这个文件,你会看到一个灰色的立方体,尽管不太好看,但你还是可以通过改变视点位置从不同方位观察它,初步体验“三维交互”的感觉。下面定义立方体的外观,这只需改变Shape 节点的 appearance 域 (外观) ,appearance 域是一个 Appearance 节点,此 Appearance 节点的 material域 (材质)定义为一个Material 节点:appearance Appearance material Material 这样,上面的Shape 节点变成了:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 29 页 - - - - - - - - - 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 utf8 Group children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 在这个场景中,红色的立方体位于屏幕的中心,它的中心坐标为0 0 0 。若想把它移动一个位置,可以通过为它外套一个Transform(变换节点 ) 来实现:Transform translation 5 0 0 children Shape appearance Appearance material Material geometry Box 在 VRML中, Transform节点除了可以引进平移、旋转和缩放变换以外,其作用和 Group 节点的作用一样。把Transform 节点的 translation域(平移)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 29 页 - - - - - - - - - 设置为 5 0 0,意味着 Transform节点所在的坐标系相对于其上层坐标系向右平移(即 x 轴方向) 5 个单位,在其它两个方向不移动,VRML的距离单位是米,5个单位相当于5 米。我们第三个场景的完整代码是:#VRML V2.0 utf8 Group children Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box 接下来我们把方块所在的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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 29 页 - - - - - - - - - #end of Group children 你可能已经感觉到,VRML文件中有许多括号(花括号“ ”和方括号“ ”),所以务请注意括号的配对,建议采用本教程的缩进风格。注意上面的VRML文件中三个Transform节点的平移量是不同的,因而三个几何体的位置也就不同。另外,还可以修改三个几何体的颜色:球面Sphere 为绿色( 0 1 0 ),圆锥为蓝色 ( 0 1 0 )。最后, 为了以后引用方便,分别给这三个Transform 节点指定一个名称:DEF box Transform . DEF sphere Transform . DEF cone Transform . 这个 VRML场景的完整代码是:#VRML V2.0 utf8 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 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0 children Shape 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 29 页 - - - - - - - - - appearance Appearance material Material diffuseColor 0 0 1 geometry Cone # end of Group children 把此文件保存为helloworld.wrl,用 VRML浏览器打开这个文件,通过调整视点从多个方位浏览自己的作品。小结:在这一节, 我们创建了第一个虚拟境界,涉及到如何用几何体构建境界,以及如何设定几何体的颜色与材质。尽管这个由方块、圆锥和球体组成的场景图比较简单,但已经反映了VRML的基本功能。当然,除了可用鼠标改变视点外,这还只是一个静态世界,在下一节,我们将引进VRML的动态特征。第二节增加交互能力上一节我们学习了用几何体建立虚拟境界以及为几何体赋予色彩和材质的方法, 这样建立的虚拟境界是静态的。这一节我们将使一个几何体(为了更具一般性,下面我们称之为对象)能够根据用户动作做出反应,即交互能力,这是VRML2.0最突出的特征。1、检测器在 VRML中,检测器 (Sensor )节点是交互能力的基础。检测器节点共九种。在场景图中, 检测器节点一般是以其它节点的子节点的身份而存在的,它的父节点称为可触发节点,触发条件和时机由检测器节点类型确定。接触检测器 ( TouchSensor )是最常用的检测器之一,最典型的应用例子是开关。其它检测器将在后续教程中陆续介绍。这里我们定义一个开关节点lightSwitch(这是一个组节点),并定义一个接触检测器作为它的子节点:DEF lightSwitch Group children 各几何造型子节点. DEF touchSensor TouchSensor 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 29 页 - - - - - - - - - 这样开关节点lightSwitch就是一个可触发节点。当然,检测器存在的理由是它被触发时能够引起某种变化,所以在更深入讨论开关节点之前,我们先讨论一下场景变化。2、视点最常见的变化是视点的变化,在我们的第一个境界中你可能已经体验到视点变化:当你拖动鼠标或按动箭头键时(按照VRML术语,称为航行),虚拟境界就会旋转或缩放, 这实际上是在调整你的视点位置或视角。在虚拟场景的重要位置可以定义视点节点 (ViewPoint ) , 它们是境界作者给用户推荐的上佳观赏方位,在 CosmoPlayer 浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点。这里我们定义两个视点节点:DEF view1 Viewpoint position 0 0 20 description View1 DEF view2 Viewpoint position 5 0 20 description view2 我们的潜在目的是使用户可以通过触发开关节点来切换视点。现在先研究一下这两个视点节点,其中的坐标表示视点在场景中的位置,坐标的单位是米,这在前面已经提到过,视点的名称将会在浏览器菜单中提示出来供用户选择。把上述视点说明加入helloworld.wrl中(放在Group 节点之前),并把其中的方块节点修改成可触发节点:DEF box Tranform children Shape . Box . DEF touchBox TouchSensor 把修改过的文件另存为“ touchme.wrl ”。3、事件传递下面我们把触发(用鼠标箭头按动方块)和场景变化(视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“事件体系”,事件体系由相互通讯的节点组成。能够接收事件的节点都应具有事件入口(eventIn ),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口,也就是说,事件入口象节点的域一样是有类型的。同样,发送事件的节点应有事件出口(eventOut ), 事件出口也是有类型的。例如ViewPoint节名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 29 页 - - - - - - - - - 点就有一个事件入口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 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 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 29 页 - - - - - - - - - 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 ROUTE touchBox.isActive TO view2.set_bind 把这个文件调入浏览器,然后把鼠标指向方块并按下左钮(先别松开!),可以看到视点已经变为view2, 内部的机制我们已经很清楚:左钮按下时方块节点的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE ”,这个事件通过路由进入视点节点view2 的事件入口set_bind,view2收到“TRUE ”后成为当前视点,所以在我们眼前场景发生了变化。现在松开左钮,可以看到场景恢复到原来方位,这种功能称为视点回跳,其原因是松开左钮后接触检测器向view2 发送了一个“ FASLE ”事件,这样view2当前的地位被解除,原来的视点成为系统视点栈的栈顶节点(即当前视点),详细说明可参见标准中对视点节点的专门论述。如果我们不想视点回跳,就想停留在 view2 视点,那该怎么办呢?这种非系统缺省功能要自己来定义。4、利用脚本编写自定义行为在 VRML中,利用 Script节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚本的过程。VRML97支持的脚本描述语言目前有两种:Java 和 EMCAScript( 这是 JavaScript标准化后的名称) ,关于这两种语言本身,请参考相应参考书,VRML97标准中定义了它们和VRML的接口方法。应提请注意的是:VRML是基于节点的语言,所以脚本也是封装在Script这个特殊节点中的。这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法。上面我们曾把接触检测器touchBox 和视点 view2 直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯: ROUTE touchBox.isActive TO touchScript.touchBoxIsActive 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 29 页 - - - - - - - - - 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 仍然保持为当前视点。本节的完整代码是:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 29 页 - - - - - - - - - #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 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 appearance Appearance material Material diffuseColor 0 0 1 geometry Cone 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 29 页 - - - - - - - - - #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.bindView2 TO view2.set_bind 小结:本节建立的虚拟境界并不复杂,但涉及到了VRML2.0最基础性的功能和概念:利用检测器产生事件、利用路由传递事件以及利用脚本编写自定义行为,掌握了这些内容也就掌握了VRML2.0的核心。 在后面的几节中,我们将探索一些专题性的有趣功能,而本节是基础,因而必须透彻理解。第三节邻近检测器本节讨论邻近检测器(proximitySensor),当用户进入或离开邻近检测器所划定的区域时就会触发它。正如你在标准中可以查到的那样,ProximitySensor节点定义为:ProximitySensor exposedField SFVec3f center 0 0 0 exposedField 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 ). 出事件我们已经熟悉,是节点状态发生改变时用来通知其它节点的, 这里的出事件isActive 用于 ProximitySensor通报自己已被激活。 enterTime和 exitTime通报用户(代表用户的用户化身或指示器)进入和退出 ProximitySensor检测区的时刻。 若用户已在检测器之内,则当用户的位置或方位发生变化时,送出position_changed和 orientation_changed出事件这五个出事件联合起来,就定义了邻近检测器的功能。外露域则集域(Field )、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 29 页 - - - - - - - - - 入事件( eventIn )和出事件( eventOut )三者的功能于一身,也就是说,它既象域一样描述了节点的当前状态,又可以作为入事件由其它节点修改这种状态,并作为出事件把这种改变通知其它节点。这里的 enabled 外露域是布尔型的,用于 ProximitySensor的启用和停用, center和 size定义形为长方体的邻近检测区。我们的出发点是第一节中建造的境界helloworld,它是由方块、 球体和圆柱这三个物体构成的静态世界,现在在球体周围增加一个邻近检测区:DEF sphere Transform translation 0 0 0 children Shape ,.DEF comeClose ProximitySensor center 0 0 0 size 4 4 4 ProximitySensor的名字为 comeCloser, 邻近区的中心和球体的球心重合,形状为正方体, 边长为 4 米,是球体直径的两倍。当用户走进球体时就会触发这个邻近检测器,检测器发出isActive事件,我们把这个事件出口通过路由指向Script节点(用来绑定视点2):DEF comeCloserScript Script eventIn SFBool enterProximitySensorIsActive eventOut SFBool bindView2 url javascript : function enterProximitySensorIsActive (active) bindView2=TRUE; 随后, 我们在邻近检测器的出事件isActive和脚本节点comeCloserScript的入事件enterProximitySensorIsActive之间建立路由,后者收到事件后执行函数 enterProximitySensroIsActive,函数发出 bindView2出事件, 这个出事件通过路由连接到视点节点View2: ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActive ROUTE comeCloserScript.bindView2 TO view2.set_bind 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 29 页 - - - - - - - - - 也就是说,一旦用户进入邻近区,境界的当前视点将转换成View2. 这个由两个视点、 三个物体、 一个邻近检测器和一个脚本节点组成的境界的完整代码如下:#VRML 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 children 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 29 页 - - - - - - - - - Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Cone #end of Group children DEF comeCloserScript 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 启动 VRML浏览器进入境界,面向球体一直走过去,当你刚刚感到靠近球体时,会突然感到自己后退了一大步(或者说物体跳到前方更远的地方),这表明邻近检测器已经检测到你的靠近,它把这件事通知脚本节点,脚本节点把视点View2 绑定成当前视点,从而使你感到视点突然改变。再稍稍修改一下邻近检测器,把它的中心位置向右移了2 米:DEF comeCloser ProximitySensor center 2 0 0 size 4 4 4 这样你就可以从左边(方块那一边)走进球体(视点不跳),但不能从右边(圆锥那一边)走近它(视点跳转)。总之, ProximitySensor能够检测用户是否进入或离开检测器指定的空间区域,典型用法是当用户走进房间时开启灯光,当用户离开时关闭灯光,从而建立功能丰富的“智能”空间。第四节连续动画名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 29 页 - - - - - - - - - 在第二节中我们已经使用过接触检测器,当我们把鼠标指针放到方块(这个几何节点包含接触检测器)上面时, 指针形状发生变化,这意味着我们已经进入检测区,如果按下鼠标左钮,则按照我们的定义,当前视点会发生变化。这一节仍然制作这样一个对接触有反应的方块,只是接触后它会连续不断地转动,动画行为可以用时间检测器(TimeSensor )驱动,而不断变化的旋转值可用脚本节点或朝向插补器(orientationInterpolator)给出。1、接触检测器作为开始的基本代码是:#VRML V2.0 utf8 DEF 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 29 页 - - - - - - - - - url javascript : function startRevolving () revolve0=1; 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 ”,其中前三个数值定义旋转轴,最后一个值定义旋转角。由于它是外露域,因而可以通过入事件(名为set_rotation)进行修改,下面定义的动态行为就是这样实现的。Script节点 revolver的核心是内联的ECMAScript 脚本函数。它给定一个不断变化的旋转值。当鼠标指针移动到方块之上时,接触检测器发出isOver,和第一节中采用的isActive事件不同, isOver只有在鼠标左钮按下时才会发出。isOver事件通过路由传递给脚本节点的事件入口startRevolving,从而启动函数 startRevolving,函数将一个新的旋转值发往事件出口revolve,这个旋转值通过路由进入cube 的外露域rotation,修改了方块的旋转角,引起它的朝向变化。鼠标指针在cube 上面的每次方位变化都引起isOver事件发送一次, 从而导致方块旋转一次。2、时间检测器为了使方块能够连续旋转,需要引进等间隔连续发送的时间序列,这正是时间检测器的用武之地。时间检测器随着时间推移不断产生事件,可用于多种目的,包括:a. 驱动连续性的仿真和动画名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 29 页 - - - - - - - - - b. 控制周期性的活动(如每分钟一次)c. 初始化单独事件,如报警钟下面是我们要用的时间检测器和修改后的路由关系:DEF ticker TimeSensor cleInterval 0.1 loop TRUE enabled FALSE ROU

    注意事项

    本文(2022年VRML基础教程 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开