Extensible 3D (X3D)
Part 1: Architecture and base components

30 Event Utilities component

事件工具组件

--- X3D separator bar ---

cube 30.1 介绍

30.1.1 名称

这部分组件的名称是 “EventUtilities” 。当在 COMPONENT 语句中引用这个组件时需要使用这个名称(参见 7.2.3.4 Component 语句)。

30.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Event Utilities component(事件工具组件)。这其中包括触发器(Trigger)和过滤器(Sequencer)节点类型,作者通过这些节点,不需要使用 Script {} 节点就可以为一般的交互应用众多门功能、转换功能、序列化操作的功能。表 30.1 列出了这一条款的主要主题。

表 30.1: 本条款的主题

cube 30.2 概念

30.2.1 事件工具节点概述

Event Utilities 组件由三个基本概念构成:给定类型的 SF 单个域Single Field)事件的变化(Mutating),由其它类型事件导致的给定类型的 SF 单个域事件的触发(Triggering),沿时间线产生 SF 单个域事件的序列化(Sequencing)(作为离散值发生器)。这些节点结合 ROUTE 路由可以建立复杂交互行为,而不需要使用脚本节点。这在某些对交互有重要影响的 Profiles 概貌中很有用,例如这些概貌中不一定支持 Script 节点(6.17.3.2)。

事件工具节点在变换层级中的位置不会影响其运作效果。例如如果一个 BooleanSequencer 节点为一个 Switch 节点的子节点,即使 whichChoice 设置为 -1(忽略此子节点),BooleanSequencer 也会继续按指定的方式运作(接收和发送事件)。

30.2.2 SF 单个域事件的变化

变化节点允许内容作者改变给定类型的值。例如 BooleanFilter 节点接收单个 boolean 输入事件,并根据输入值产生 TRUE 或 FALSE 输出事件;同时还产生和输入事件相反的事件。这些事件允许建立条件化的行为,而不需要使用脚本。

30.2.3 SF 单个域事件的触发

触发节点在输入一个不同类型的事件时,产生一个给定类型的输入事件。例如当接收到一个 boolean 输入事件时,TimeTrigger 节点产生一个输出时间事件,以允许内容作者根据某个 boolean 事件来起动一个 TimeSensor,此时和改变其 isActive 域的效果相同。

所有触发节点衍生于 X3DTriggerNode 基本节点类型。

30.2.4 SF 单个域事件的序列化

序列节点设计用来让内容作者根据 TimeSensor 运行时的输出来产生离散事件系列中的一个指定序列。他们是由抽象节点类型 X3DSequencerNode 衍生而成,因而都有 set_fraction (SFFloat [in]) 和 key (MFFloat [in,out])。

set_fraction eventIn 接收一个 SFFloat 事件并用序列化函数求职,结果输出一个和 set_fraction 事件时间戳相同的 value_changed eventOut 事件。输出域和 keyValue 的用法依赖于序列器节点的类型。

BooleanSequencerIntegerSequencer 输出一个单值域到 value_changed。每个 keyValue 域中的值按顺序对应 key 域中的参数值。如果序列器 key 域中的值的数目和 keyValue 域中的值的数目不等,则结果未定义。

指定的 X3D 序列器节点被设计用来沿时间线产生离散事件。每一个此类节点定义了在一定区间 (-infinity, +infinity) 中分段线型函数 f(t)。分段线型函数由 t 的称为 key(键)的 n 值定义,n 对应 f(t) 的值称为 keyValue(关键值)。键应为单一非渐减的值,否则结果未定义。键并不严格限制为一定间隔。

每一个此类节点按照以下方式计算给定 t 值(经由 fraction 域输入)f(t) 函数值:以 n 个键 t0, t1, t2, ..., tn-1 划分负无穷到正无穷 (-infinity, +infinity) 的区间为 n+1 个子区间 (-infinity, t0), [t0, t1), [t1, t2), ... , [tn-1, +infinity)。同时以 n 个值 v0, v1, v2, ..., vn-1 定为 f(t) 中对应的关键值。序列化函数的离散值 f(t) 定义为:

 
    f(t) = vn, if tn ≤ t < tn-1
= v0, if t ≤ t0, = vn-1, if t ≥ tn-1

cube 30.3 抽象类型

30.3.1 X3DSequencerNode

X3DSequencerNode : X3DChildNode { 
  SFFloat      [in]     set_fraction     (-∞,∞)
  MFFloat      [in,out] key           [] (-∞,∞)
  MF<type>     [in,out] keyValue      []
  [S|M]F<type> [out]    value_changed
}

这个抽象类型是衍生所有序列器(Sequencer)节点的基本节点类型30.2 概念中包含了序列器节点的详细讨论。

30.3.2 X3DTriggerNode

X3DTriggerNode : X3DChildNode  {
}

这个抽象类型是衍生所有触发器(Trigger)节点的基本节点类型。30.2 概念中包含了触发器节点的详细讨论。

cube 30.4 节点参考

30.4.1 BooleanFilter

BooleanFilter : X3DChildNode {
  SFBool [in]  set_boolean
  SFBool [out] inputFalse
  SFBool [out] inputNegate
  SFBool [out] inputTrue
}

BooleanFilter 过滤性地发送 boolean 事件,允许选择性的路由 TRUE 值、FALSE 值或相反值。

当接收到 set_boolean 事件时,BooleanFilter 节点生成两个事件:基于接收到的 boolean 值输出 inputTrue 事件(接收 True 时)或 inputFalse 事件(接收到 False 时)事件;输出包含和接收值相反值的 inputNegate 事件。

30.4.2 BooleanSequencer

BooleanSequencer : X3DSequencerNode {
  SFFloat [in]     set_fraction
  MFFloat [in,out] key           [] (-∞,∞) 
  MFBool  [in,out] keyValue 	 [] 
  SFBool  [out]    value_changed
}

BooleanSequencer 生成由某个 TimeSensor 时钟驱动的序列化的 SFBool 事件。它可以控制其它的动作,比如可以激活/禁止灯光或传感器,或通过 set_bind 绑定/解除绑定 Viewpoints 或其它 X3DBindableNodes 可绑定子节点。

keyValue 域由一个 FALSE 值和 TRUE 值的列表构成。

对每个节点的单独激活或被绑定,BooleanSequencer 应为每个节点单独实例化。

30.4.3 BooleanToggle

BooleanToggle : X3DChildNode {
  SFBool [in]     set_boolean
  SFBool [in,out] toggle      FALSE 
}

BooleanToggle 存储 boolean 值以触发开/关。

当接受到一个 set_boolean TRUE 事件时,BooleanToggle 反转 toggle 域的值并生成相应 toggle 域输出事件。set_boolean FALSE 事件将被忽略。

通过直接设置 inputOutput toggle 域的值,BooleanToggle 可以被复位到指定状态。

30.4.4 BooleanTrigger

BooleanTrigger : X3DChildNode {
  SFTime [in]  set_triggerTime
  SFBool [out] triggerTrue 
}

BooleanTrigger 是一个触发器节点,在接收到时间事件时生成 boolean 事件。

当 BooleanTrigger 接收到一个 set_triggerTime 事件时,生成 triggerTrue 事件。triggerTrue 的值应总为 TRUE。

30.4.5 IntegerSequencer

IntegerSequencer : X3DSequencerNode {
  SFFloat [in]     set_fraction
  MFFloat [in,out] key           [] (-∞,∞) 
  MFInt32 [in,out] keyValue      [] -1|[1, ∞)
  SFInt32 [out]    value_changed
}

IntegerSequencer 是一个离散值生成器,它根据单一 TimeSensor 时钟生成序列化的 SFInt32 事件。这可以用来驱动 Switch 节点的 set_whichChoice 域。

30.4.6 IntegerTrigger

IntegerTrigger : X3DChildNode {
  SFBool  [in]     set_boolean
  SFInt32 [in,out] integerKey   -1|(-∞,∞)
  SFInt32 [out]    triggerValue
}

IntegerTrigger 处理单一域 Boolean 事件并设置一个 SFInt32 整数值输出事件。这对于连接环境化事件到 Switch 节点的 whichChoice 域这类情况很有用。

一旦接受到一个 set_boolean 事件,IntegerTrigger 节点将生成一个 triggerValue 事件,其事件值为当前的 integerKey 值。

30.4.7 TimeTrigger

TimeTrigger : X3DTriggerNode {
  SFBool [in]  set_boolean
  SFTime [out] triggerTime
}

TimeTrigger 是一个触发器节点,在接收到 boolean 事件时生成时间事件。

当 TimeTrigger 接收到一个 set_boolean 事件时,生成 triggerTime 事件。triggerTime 的值应为 set_boolean 事件接受的时间。set_boolean 的值应被忽略。

cube 30.5 支持层

Event Utilities 组件提供 表 30.2 中规定的支持层(levels)。
Level 1 提供了以上定义所有节点的完全支持。

Table 30.2: Event utilities 组件支持层

Level 必备条件 节点 支持
1 Core 1; Grouping 1    
  X3DSequencerNode (抽象) 所有域
  X3DTriggerNode (抽象) 所有域
  BooleanFilter 所有域
  BooleanSequencer 所有域
BooleanToggle 所有域
BooleanTrigger 所有域
  IntegerSequencer 所有域
  IntegerTrigger 所有域
NodeSequencer 所有域
  TimeTrigger 所有域

--- X3D separator bar ---