我们知道,对于visual c++而言,交互的实现是通过消息映射来进行的。同样,x3d的交互实现也是通过类似的映射机制。用户事件的产生是通过相应的传感器产生的,而route语句就是相当于事件的映射,它映射到另一个输入事件中。
x3d中,用户事件的传感器有:keysensor(键盘传感器) 、stringsensor(字符串传感器)、 touchsensor(触摸传感器)、planesensor(平移传感器) 、spheresensor(绕点旋转感器)和cylindersensor(y轴旋转传感器)等。由于bs浏览插件对x3d新增的keysensor和stringsensor节点的支持不够好,故这里暂不讨论。
一、 touchsensor(触摸传感器)节点
touchsensor(触摸传感器)节点产生基于定点输入设备(通常是鼠标)的事件。这些事件表明用户是否正在点选某个几何体和用户在什么地方,以及在什么时候按了定点设备的键。它的主要域或事件有:
description -- 这个节点功能的文字提示。
enabled -- 设置传感器节点是否有效。默认值为true。
isactive -- 当点击或移动鼠标(指点设备时)发送事件。按下鼠标主键时isactive=true, 放开时
isactive=false。
isover -- 当指点设备移动过传感器表面时发送事件。
hitpoint_changed -- 事件输出在子节点局部坐标系统点击点的定位。
hitnormal_changed -- 事件输出了点击点的表面的法线向量。
hittexcoord_changed -- 事件输出了点击点的表面的纹理坐标。
touchtime -- 当传感器被指点设备点击时产生时间事件。
需要说明的是:
(1) 若定点设备未指向传感器的兄弟几何体,而用户开始将定点设备移到传感器的兄弟几何体时,传感器将产生一个isover事件,并将其值设置为true;相反,若定点设备已经指向传感器的兄弟几何体,此时用户将定点设备移出传感器的兄弟几何体,传感器将产生一个isover事件,并将其值设置为false。
(2) 当用户将定点设备从几何体的一点移动到另一点时,传感器将发送一系列事件: hitpoint_changed、hitnormal_changed、hittexcoord_changed,分别表明用户所指的位置、该点的法向量和纹理坐标。
(3) 当用户点击被touchsensor监视的对象时,传感器将产生值为true的isactive事件;而当用户释放定点设备的键时,传感器将产生isactive为false的事件。
(4) 若用户在指向几何体时按下鼠标键,然后在仍然指向这个几何体(或又回到这个几何体)时释放鼠标键,传感器将要发送一个touchtime事件,表明键被释放的时间。可以使用这一事件来模拟许多常用的用户接口(如只有在用户点击和释放定点设备按键时才产生的动作)。
下面举两个例子来说明:
示例1:当鼠标处在立方体的时候,就会有一个小球跟随鼠标移动。
示例代码如下:
(图片较大,请拉动滚动条观看)
示例的结果如下图所示:
说明:需要将触摸传感器节点和要触摸的形体节点放在同一个父节点处。
示例2:当单击中间小球时,将打开点光源,照亮周围的两个球。
示例代码如下:
示例的结果如下图所示:
二、 planesensor(平移传感器)节点
planesensor 传感器节点用于指点设备在平行于z=0平面上的动作,只要用户点按、拖动该传感器的兄弟几何体,此节点均将拖动(如用户使用鼠标进行的拖动)解释为在传感器的局部xy平面上的变换。其主要域或事件如下:
description -- 这个节点功能的文字提示。
enabled -- 设置传感器节点是否有效。默认值为true。
minposition -- 在xy平面内限制当前点向上和向右的translation事件。
maxposition -- 在xy平面内限制当前点向下和向左的translation事件。
offset -- 该域指出相关几何体被移动后相对于初始点的位置。
autooffset -- 指示是否在拖动结束时将当前位置保存在offset中来实现在两次拖动之间跟踪当前位置(true表示跟踪)。若autooffset值为false,则用户每次开始新一轮拖动时,被拖动的几何体都自动先复位到初始位置。
isactive -- 指示定点设备当前按钮是否按下。此事件仅当按钮被按下或释放时才发出,拖动期间则不生成。
isover -- 当指点设备移动过传感器表面时发送事件。
trackpoint_changed -- 拖动期间任何给定时刻用户的定点设备在xy平面上的实际点(忽略 minposition和 maxposition)。
translation_changed -- 拖动期间任何给定时刻用户的定点设备在xy平面上的锁定点(受限于minposition和 maxposition)。
示例如下:
(图片较大,请拉动滚动条观看)
结果如下:
说明:当拖动小立方体的时候,无论如何也出不了白色的矩形框。
三、 spheresensor(绕点旋转感器)节点
spheresensor节点将二维的拖动解释为三维空间中绕局部原点的旋转。若在该节点的兄弟几何体处按下鼠标,浏览器会以点击鼠标的点到原点的距离为半径作一个想象中的球。随后的拖动将解释为旋转球体。它的主要域或事件如下:
description -- 这个节点功能的文字提示。
enabled -- 设置传感器节点是否有效。默认值为true。
offset -- 在一次拖动后,相关几何体相对于初始位置的旋转角度。
autooffset -- 设置为true,表示在拖动结束时,将当前的方位值存储到offset中,若autooffset设置为false,在用户每次开始一个新的托动时,几何体复位到初始值。
isactive -- 当点击或移动鼠标(指点设备时)发送事件。按下鼠标主键时isactive=true, 放开时isactive=false。
isover -- 当指点设备移动过传感器表面时发送事件。
trackpoint_changed -- 用户在拖动过程中任意时刻定点设备在假想的球体表面上的实际位置。
rotation_changed -- 用户在拖动过程中任意时刻假想球体的当前朝向。
示例如下:
结果如下:
四、 cylindersensor(y轴旋转传感器)节点
cylindersensor节点把二维的拖曳输入(如拖曳鼠标)转变为三维空间中沿y轴的旋转。其主要域或事件如下:
description -- 这个节点功能的文字提示。
enabled -- 设置传感器节点是否有效。默认值为true。
minangle -- 允许旋转的最小角度(旋转角小于此范围时,仍被限制在这一范围内)。
maxangle -- 允许旋转的最大角度(旋转角大于此范围时,仍被限钳制在这一范围内)。
diskangle -- 决定节点动作是像一个圆柱或像磁碟绕y轴旋转。若用户在圆柱轴附近点击,传感器的兄弟几何体的动作像磁碟转动,否则像圆柱一样转动。
offset -- 指出从初始方向转动的角度值。
autooffset -- 指出是否在每次拖动完成后将当前的方向角存入offset域,以达到跟踪当前方位的目的。如果autooffset是false,每当用户开始一个新的拖动动时,被拖动几何体恢复至最初的方位。
isactive -- 当点击或移动鼠标(指点设备时)发送事件。按下鼠标主键时isactive=true, 放开时isactive=false。
isover -- 当指点设备移动过传感器表面时发送事件。
说明:
如果用户点中圆柱的顶或低面,拖曳动作就会被解释为和旋转一个平面圆盘一样。如果用户点中圆柱的侧面部分,拖曳动作就会被解释为旋转这个圆柱。如果仅仅对特殊的旋转范围有兴趣,可以通过设置minangle和maxangle的值把旋转限制在那一范围内。如果minangle大于maxangle,就没有任何限制了。
在上述代码中,只要将spheresensor节点改成cylindersensor节点就可以了,因此这里不再举例。
除了上述传感器外,x3d还有visibilitysensor、proximitysensor等感知传感器,这里不再介绍。在下一讲中,我们将讨论x3d的嵌入脚本编程技术。
闽公网安备 35060202000074号