第12章脚本节点前面介绍了如何使用插补器在VRML场景中实现动画效果,但这些只能实现很简单的动画效果,是一种预定义的效果,远远不能满足设计需求,这时就需要使用到脚本。可通过VRML提供的Script节点来加入脚本程序语言,如Java(外部创作接口EAI是一套针对VRML浏览器的Java类),JavaScript。本章将简单介绍Script节点的功能和在VRML中如何使用Script节点来创建事件和控制动画。12.1Script节点Script节点可以描述一个由用户自定义制作的检测器和插补器,这些检测器和插补器需要一些有关域、事件出口和事件入口的列表以及处理这些操作时所需作的事情。所以该节点又定义了一个包含程序脚本节点的域(注意不能定义exposedField)、事件出口和事件入口及描述了用户自定义制作的检测器和插补器所作的事情。Script节点可以出现在文件的顶层,或者作为成组节点的子节点。其节点语法结构如下:12.1Script节点Script{ExposedFieldMFStringurl[]FieldSFBooldirectOutputFALSEFieldSFBoolmustEvaluateFALSEAnynumberofEventIneventTypeNameeventNameFieldfieldTypeNamefieldNameinitialValueEventOuteventTypeNameeventName}12.1Script节点url域的值指定了一个URL列表,该列表中的URL值所指定的程序脚本可以是由任何VRML浏览器支持的语言写成。通常情况下,VRML浏览器支持的语言有Java语言和JavaScript语言。而且JavaScript的函数和指令可以直接包含在url域中。DirectOutput域的值用来说明程序脚本的输出是否受到限制。当该域值为TRUE时,程序脚本可以直接对它能访问的任何节点的可见域进行些操作或对任何节点的eventIn事件发送,另外还可以在VRML场景中增加或删除一条通路。当该域值为FALSE时,程序脚本不能直接发送事件,不过可以访问。通常情况下,将directOutput域值设为FALSE。该域值的缺省值为FALSE。12.1Script节点MustEvaluate域的值指定了程序脚本是如何进行求值。当该域值为TRUE时,每当由节点的eventIn事件接收到一个新值时,浏览器就立即对该程序脚本进行计算。当该域值为FALSE时,则浏览器在此脚本不影响环境中任何可视部分的情况下,推迟对脚本的计算,直到合适的时间到来。这样就会出现事件到节点的传送和计算节点处理该事件动作的延迟。此时如果多个事件被传送,待处理的事件列表就会变长。为了尽量使其性能达到最优,mustEvaluate域值应设定为FALSE,因为浏览器的性能取决于一个事件被发出后必须进行计算的程序脚本数目,如果将其域值设为TRUE,就会增加浏览器的工作量,从而降低画面的刷新速度和交互性。该域值的缺省值为FALSE。12.1Script节点Script节点可以定义多个事件入口,多个事件出口,多个事件。接口域、接口eventIn和接口eventOut都可以任意取名字,但必须遵循DEF的命名约定。按照VRML的约定,名字必须以小写字母开头,而在名字内的每个子序列单词都必须大写,允许在名字中使用下划线和阿拉伯数字。EventIn事件通常以“set_”开始,除非它们具有对组内进行添加或删除子元素的操作权限。EventOut事件通常以“_changed”结尾,除非它们是一个布尔值或时间值,布尔类型的eventOut事件名以“is”开头,时间类型的eventOut事件名义“Time”结束。12.2使用Script节点处理事件当Script节点收到一个输入事件时,首先将事件值传送到由url指定的脚本中,通过这个脚本设置该Script节点输出事件的值。而当Script节点收到一组输入事件时,它把这些输入都送到由url指定的脚本中,根据所使用的脚本语言,通过不同方法依次处理每一个事件,并输出处理结果。而用JavaScript来处理输入事件的一般方法是为Script节点内的每一个输入事件都定义一个函数。当输入事件一到,浏览器就调用具有相同名字的函数。在JavaScript语言中,函数主要传递两个参数:新事件值和新事件时间标记。12.3RPOTO创建用户新节点VRML是一个丰富多彩的世界,如果想创建更加逼真、生动的场景和造型,需要更加复杂的设计,因此需要用户根据实际项目的需求,来设计和开发用户自己需要的新节点、节点类型及接口事件,以满足软件开发的需要。12.3RPOTO创建用户新节点PROTONodeName[#Anynumberof:FieldfieldTypeNamefieldNameinitialValueexposedFieldfieldTypeNamefieldNameinitialValueEventIneventTypeNameeventNameEventOuteventTypeNameeventName]{NodeBody}12.3RPOTO创建用户新节点(1)新定义的节点名字下方括号内包括域或事件、域值类型、域或事件名字及域的初值。(2)新节点体在一对花括号里,其中可以包括单个节点,组节点及节点的节口值。新创建的节点体中有时候会用到保留字“IS”,作用是将你自己定义的新域名与标准节点的域名联系起来。当这些新定义的域名不需要和标准节点的域名联系时,可直接在新定义的域名后加上域值即可。相当于“是”12.4EXTERNRPOTO创建外部定义的新节点EXTERNPROTONodeName[#Anynumberof:FieldfieldTypeNamefieldNameinitialValueexposedFieldfieldTypeNamefieldNameinitialValueEventIneventTypeNameeventNameEventOuteventTypeNameeventName]“VRML外部文件名#某新节点名”或urlor[urlList]12.4EXTERNRPOTO创建外部定义的新节点与PROTO定义的节点相比较,该节点没有新的节点体,但增加了一个调用VRML外部文件名VRML程序的发布embedsrc=“你的VRML程序路径”border=0height=“220”width=“300”VRML程序的发布Vrml发布前的优化处理,对Vrml的优化处理包括减少文件大小,提高渲染速度。减少文件大小的方法:(1)多采用DEF,USE方法(2)使用原型节点(3)多使用简单节点(4)压缩文件VRML程序的发布提高渲染速度的方法:(1)简化场景例如以纹理代替多边形,减少光源的使用。(2)采用Inline节点、Anchor节点将大型场景分段,以便浏览器渲染时能进行优化。(3)有效使用Script脚本X3D的概述X3D是VRML的继承。VRML(VirtualRealityModelingLanguage-虚拟现实建模语言)是原来的网络3D图形的ISO标准(ISO/IEC14772)。X3D相对VRML改进,提供了很多的新特性(见第一章)在2002年3月份X3D第一版发布以来,已经有基于Java的源码开放的网络3D软件问世。因此,Web3D联盟在制定标准时成立了Java语言翻译工作小组以便允许Java程序能够与新的3D标准程序相协调。这也最终结束与Sun的网络3D技术Java3Dtechnology之间的冲突。Web3D联盟于2003年10月份向国际标准组织提请标准申请,x3D已正式成为国际通用标准。X3D的编辑器二、X3D的编辑器--X3D-EditX3D-Edit是图形化Extensible3D(X3D)文件编辑器。X3D-Edit通过X3D3.0DTD定义的X3D3.0tagset标签集来定制Java平台下的通用XML编辑器,并使用IBMXeena为定制的X3D场景图编辑器。在编辑VRML或X3D场景图文件时,X3D-Edit可以提供简化的无错的创作和编辑方式。X3D-Edit通过XML文件定制了上下文相关的工具提示,提供了每个节点和属性的概要,以方便作者对场景图的创作和编辑,如下图所示。X3D-Edit具有下列特性:1、直观的图形化的用户界面2、建立符合规范的场景图文件:节点总是放置在合适的位置3、验证X3D场景是否符合VRML97概貌或Core概貌4、自动转换X3D场景到VRML并启动浏览器自动察看结果5、VRML97文件的导入与转换X3D的编辑器6、大量的X3D场景范例7、每个元素和属性的弹出式工具提示,帮助了解VRML/X3D场景图如何建立和运作,包括中文在内的多国语言提示。8、使用Java保证的平台通用性9、使用扩展样式表(XSL)自动转换:X3dToVrml97.xsl(VRML97向后兼容性)、X3dToHtml.xsl(标签集打印样式)、X3dWrap.xsl/X3dUnwrap.xsl(包裹标签的附加/移除)10、支持DIS-Java-VRML工作组测试和评估DIS-Java-VRML扩展节点11、支持GeoVRML节点和GeoVRML1.0概貌12、支持起草中的H-Anim2001人性化动画标准和替身的HumanoidAnimation人性化动画节点的编辑,同时也支持H-Anim1.1概貌13、支持新提议的KeySensor节点和StringSensor节点。14、支持提议的Non-UniformRationalB-Spline(NURBS)Surface扩展节点的评估和测试15、使用标签和图标的场景图打印X3D-Edit最基本的安装和配置三、X3D-Edit最基本的安装和配置安装和配置步骤如下1.安装VRML浏览器,推荐使用最新的blaxxunContact5.1()和BitmanagementBSContact6.1()VRML插件。2.安装Java虚拟机或JavaSDK()文件。a)运行下载后的可执行文件。b)按默认的路径C:\ProgramFiles\JavaSoft\JRE\1.3.1_09安装。3.安装IBM的Xeena1.2EAXML编辑工具()。X3D-Edit最基本的安装和配置a)运行下载后的可执行文件。b)在安装选择组件时,选择java2。c)单击Next后,出现选择目标安装路径。d)单击“Browse”按钮后,选择刚才Java虚拟机的安装路径。e)然后进行下一步安装。4.下载X3D-edit()。注意:用解压软件(如winrar)解压时一定要解压到windows安装所在的驱动器根目录。例如,windows安装到在C盘,则其根目录为C:\。5.可以安装一些示例。具体到最基本的安装和配置6.在C:\文件夹中双击X3D-Edit-Chinese.bat。(最好能将此文件做成桌面的快捷方式)