总体导航图
学习指南
主要内容
网页制作软件

当前位置:多媒体应用基础 >> 网络多媒体应用设计 >>编写自定义行为

利用脚本编写自定义行为

    在VRML中,利用Script 节点(脚本节点)定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚本的过程。VRML97支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML97标准中定义了它们和VRML的接口方法。应提请注意的是:VRML是基于节点的语言,所以脚本也是封装在Script这个特殊节点中的。这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法。

    上面我们曾把接触检测器touchBox和视点view2直接通过路径连接起来,现在要定义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯:
ROUTE touchBbox.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

url"javescript:
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语言的 接口约定,表示相应事件入口收到事件后调用此函数进行处理。


事件流程与小结
下面我们整理一下事件流程:
(1)用户在方块上按下鼠标左键。
(2)接触检测器发出一个“TRUE”事件。
(3)此事件进入脚本节点touchScript的事件入口touchBoxIsActive。
(4)调用脚本函数touchBoxIsActive(注意函数并没有判断入事件的值)。
(5)函数向touchScript的事件出口bindView2发送一个“TRUE”事件(还可以进行其它判断或执行其它事件)。
(6)view2节点收到“TRUE”事件,成为当前视点。按照VRML约定,“认为”上述事件是同时发生的,也就是这些事件的时间戳相同。
(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 { 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 Tranform { transltion -5 0 0 children [
Shape { appearance Appearance { material 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.bindView2 TO view2.set_bind
    小结:本节建立的虚拟境界并不复杂,但涉及到了VRML2.0最基础性的功能和概念: 利用检测器产生事件、利用路由传递事件以及利用脚本编写自定义行为,掌握了这些内容也就掌握了VRML2.0的核心。在后面的几节中,我们将探索一些专题性的有趣功能,而本节是基础,因而必须透彻理解。

相关知识点
VRML学习

精品展示

浏览器插件