WEB开发网
开发学院WEB开发Jsp X3D实战基础讲座之十二 阅读

X3D实战基础讲座之十二

 2008-01-05 08:17:41 来源:WEB开发网   
核心提示:在X3D中,通过使用程序化的节点Script来嵌入脚本程序,X3D实战基础讲座之十二,它支持ECMAScript/javascript 或 Java语言,这里解释一下什么是ECMAScript,本讲座仅仅是一个入门的基础教程,更深层次的探索还需要我们慢慢去体验,ECMAScript也是一种脚本语言,由Netscape和

  在X3D中,通过使用程序化的节点Script来嵌入脚本程序。它支持ECMAScript/javascript 或 Java语言。这里解释一下什么是ECMAScript,ECMAScript也是一种脚本语言,由Netscape和Microsoft使用开发,它是一种面向对象语言,ECMAScript和DOM一起十分接近于现在对Javascript和JScript的实现,虽然说是用于网络环境,但它可以用于任何脚本环境中,并且其语法与JavaScript基本相同。



  在本讲中,我们先来看一个实例过程,然后说明其简单编程方法。

  一、 一个嵌入脚本程序的实例过程

  这个示例是当鼠标点击圆柱体时,圆柱体移出和它相连的球,再单击圆柱体,圆柱体回到原来的位置。示例过程如下:


(图片较大,请拉动滚动条观看)

  (1) 创建一个12..x3d新文档,其初始化程序如下:

X3D实战基础讲座之十二(图二)

  (2) 由于球不需要移动,因此,我们先构造一个球,颜色为黄色。如下面的代码:

X3D实战基础讲座之十二(图三)

  (3) 对于圆柱体的鼠标事件映射,我们使用触摸传感器,见下面的代码:

X3D实战基础讲座之十二(图四)

  (4) 在Group后面添加Script节点。

  (5) 为Script节点添加Field子节点,如下所示:

X3D实战基础讲座之十二(图五)

  (6) 选中Field子节点,在其属性窗口中设置相关属性,结果如下所示:

X3D实战基础讲座之十二(图六)

  说明:name是用来指定域名,accessType是用来设置域的访问类型,通常可以是inputOnly(输入)、outputOnly(输出)和inputOutput(输入输出)。Type指定域变量的数据类型,类型中前缀是SF表示单值,MF表示多值。Value为域变量提供缺省的初始值。

  (7) 再为Script节点添加两个Field子节点,用于输出程序中指定的坐标值和记录是否移出。结果如下面的代码:


(图片较大,请拉动滚动条观看)

  其中,SFBool为单值的布尔型,SFVec3F为单值的三维坐标的实数型。

  (8) 为Script节点CDATA用于添加嵌入脚本程序,然后在CDATA的属性窗口中输入如下的脚本程序:

ecmascript:
function set_translation( isActive ) {
 if (isActive == true) {
  if (isTrans == false) {
   value_changed[0] = 5;
  } else {
   value_changed[0] = 0;
  }
  value_changed[1] = 0;
  value_changed[2] = 0;
  isTrans = ! isTrans;
 }
}
  (9) 单击CDATA的属性窗口中的Apply按钮,程序代码输入有效。此时节点CDATA变成了ecmascript节点。

  (10) 将Script节点命名为USESCRIPT,然后添加ROUTE语句。整个代码如下所示:

X3D实战基础讲座之十二(图八)X3D实战基础讲座之十二(图九)

  编译并预览,结果正如我们一开始设定那样,单击圆柱体,移出,再单击圆柱体,圆柱体回到原来的位置。如下所示:

X3D实战基础讲座之十二(图十)

  二、 分析

  我们来看看代码的运行过程。首先第一条ROUTE语句将ToUChSensor传感器的isActive事件传递给函数set_translation。该函数只有一个形参isActive,这个形参名可以是其他名称,形参的数据类型取决于该函数的类型。当鼠标单击圆柱体时,isActive事件为True,该值传到set_translation,并执行函数代码。由于第一次单击,IsTrans为False,这样该函数运行后,value_changed的值就变为[5,0,0],IsTrans为True。

  value_changed的值改变后,通过第二条ROUTE语句,将其传递给圆柱体所在的父节点Transform的translation域,从而使圆柱体位置发生改变。

  若再单击圆柱体,则仍然会沿着刚才的路由进行数值的传递,从而圆柱体又回到了原来的位置。
从上述示例可以看出,实际上这种嵌入式脚本程序其目的是答应用户自己定义带有输入输出事件的节点。

  三、 多传感器和多个嵌入脚本

  上述示例中,圆柱体位置是直接变化的,能否使圆柱体的位置慢慢变化到指定的位置。也就是说,当单击圆柱体,圆柱体慢慢地移动到[5,0,0]位置,而再单击圆柱体,圆柱体又慢慢回到原来的位置。为了不使程序代码过于复杂,我们只实现前一个动作,即当单击圆柱体,圆柱体慢慢地移动到[5,0,0]位置。

  首先我们构思一下其路由:单击鼠标,激活时间触发器,继而通过位置插补器,使圆柱体慢慢移出。然后根据移出的结果,再通过程序设置时间触发器停止。

  具体程序如下:

X3D实战基础讲座之十二(图十)

  上述代码,读者完全可以自己分析,这里不再赘述。

  总之,通过对X3D的节点,我们可以构造出不一般的场景,这样就可以用于基于WEB的产品展示、网络教学、仿真等一系列领域。本讲座仅仅是一个入门的基础教程,更深层次的探索还需要我们慢慢去体验。进入讨论组讨论。

Tags:XD 实战 基础

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接