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

19 Interpolation component

插值器组件

--- X3D separator bar ---

cube 19.1 介绍

19.1.1 名字

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

19.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Interpolation component(插值器组件)。表 19.1 列出了这一条款的主要主题。

表 19.1 — 本条款的主题

cube 19.2 概念

此条款描述了六种插值器(Interpolator)节点,这些插值器提供了建立关键帧动画的能力。

19.2.1 插值器

插值器节点提供了动画关键帧的值之间的线性插值。以下节点类型是基于每种值类型的插值器节点:

所有的插值器节点基于 X3DInterpolatorNode 抽象类型。

19.2.2 线性插值

此条款中定义的 X3D 插值器节点是为线性关键帧动画插值而设计的。每一个此类节点定义了一个 (-∞,∞) 区间中的分段线性函数 f(t)。此线性函数定义 nt 的值,称为 key(关键点),以及 n 个对应的 f(t) 的值称为 keyValue(关键值)。关键点应为单调非减的,否则结果未定义。

对于给定的某一 t 值(通过 fraction 域给定),插值器节点按以下描述计算 f(t) 。假设 n 个关键点 t0, t1, t2, ..., tn-1(-∞,∞) 区域分割为 n+1 个给定子区间 (-∞, t0), [t0, t1), [t1, t2), ... , [tn-1, +)。同时又设定 n 个对应关键点值的 f(t)v0, v1, v2, ..., vn-1 。则分段线性插值函数 f(t) 定义为:

    f(t) = v0,    if t ≤ t0,
         = vn-1,   if t ≥ tn-1,
         = linterp(t, vi, vi+1),    if ti ≤ t ≤ ti+1,

     其中 linterp(t,x,y) 为线性插值,
          i 属于 {0,1,..., n-2}.

f(t) 值的第三种取值条件允许为一个关键点定义多个值,(例如不连续区域的 f(t) 中的左极限和右极限)。第一次指定的值被用作左边区域的 f(t) 的极限值,最后一次指定的值被用作右边区域的 f(t) 的极限值。在多次定义关键值的关键点上,f(t) 的值是不确定的,当应总是相关的极限值中的一个。

cube 19.3 抽象类型

19.3.1 X3DInterpolatorNode

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

抽象节点 X3DInterpolatorNode 是此条款中规定的所有插值器类型的基本类型。

key(关键点)域包含了关键点时间的列表,其表现为:

    key [0 0.25 0.65 0.75 1]
这指示了此节点中有五个关键帧。keyValue 域包含目标域的值,即一组完全对应每个关键点的值。在 key 域中不包含关键点的插值器节点将不产生事件。然而,如果一个包含关键点的输入事件替换了空的 key 域,那么在下次接受到 set_fraction 事件时此插值器节点将产生事件。

set_fraction inputOnly 域接受 SFFloat 事件,使插值器节点函数开始计算,并用 value_changed 输出事件返回计算结果,输出事件和 set_fraction 事件相同类型且具有相同的事件戳。

keyValuevalue_changed 域的内容依赖于节点的类型(例如 PositionInterpolator 域使用 MFVec3f 值)。keyValue 域中的值或值的集按顺序对应 key 域中的参数值。

对于插值器节点将产生一个单值,如果 key 域中值的数量和 keyValue 域中值的数量不同,则结果不确定。

对于产生多值的插值器节点,其 keyValue 域为一个值的 nxm 数组,其中 nkey 域中值的数量,m 为每个关键帧中值得数量。 keyValue 域中每个 m 值按顺序按顺序对应 key 域中的参数值。每一个 value_changed 事件应包括内插的 m 个值。keyValue 域中的值的数量如果不是 key 域中值的数量的整数倍,则结果未定义。

X3DInterpolatorNode 在接收到任何输入之前读取其 value_changed outputOnly 域,如果 keyValue 不为空则返回 keyValue[0] 的值,如果 keyValue 为空(例如 [ ]),则返回相应域类型的初始值(例如 SFVec3f 为 (0, 0, 0));初始事件值见 5, 域类型参考 Field type reference

X3DInterpolatorNode 节点在场景图变换层级中的位置对其运作效果没有影响。例如,即使插值器节点的父节点为一个 whichChoice 设置为 "-1" 的节点(即忽略子),插值器节点任继续按规格运作(即接受和发送事件)。

一个简化的执行关键帧动画的典型结构中包括一个 TimeSensor、ROUTE 和目标节点。

  Transform { 
    Shape 
       IndexedFaceSet { coordIndex='... -1 ... >
           Coordinate DEF='Moved' point [ x y z, ... ] # t0Geometry
       }                  
    } 
  } 

  CoordinateInterpolator DEF='Mover' 
      key [t0 t1 t2 ]            #   list of key times, 0 to 1
      keyValue ' x y z, ... '    #   one geometry per key time 

  TimeSensor DEF='Timer' cycleInterval 5 loop TRUE 

  ROUTE Timer.fraction_changed TO Mover.set_value  
  ROUTE Mover.value_changed TO Moved.point 

在典型的运作中,TimeSensor 送达的关于关键帧的 set_fraction 事件值将指示正在变化的时间。基于 TimeSensor 在循环周期中的时间,此值在 0 到 1 之间变化。例如,如果 TimeSensor 的循环时间为 10 秒,则在其周期中经过 5 秒时set_fraction 值将为 0.5。

在这个结构范例中,IndexedFaceSet 中包含了一个名为 Moved 的坐标域。这定义了一个时间等于 0 时此节点的几何体。名为 Mover 的 CoordinateInterpolator 节点包含了一个关键帧时间的列表以及在 keyValue 域中包含了对应关键帧的一组坐标。当 set_fraction 时间到达 key 域时,相应的插值后的 keyValue 被发送到将渲染的目标坐标节点。

cube 19.4 节点参考

19.4.1 ColorInterpolator

ColorInterpolator : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFColor [in,out] keyValue      [] [0,1]
  SFColor [out]    value_changed
}

这个节点在一个 MFColor 关键值列表中插值以产生一个 SFColor (RGB) value_changed 事件。keyValue 域中的颜色值的数量应和 key 域中关键帧的数量相同。keyValue 域和 value_changed 事件在 RGB 色彩空间中定义。线形插值使用 set_fraction 的值为输入值在 HSV 空间space(RGB 和 HSV 色彩空间的描述见 [FOLE] for description of)中执行。 如果在两个连续关键帧之间进行补色之间的插值,则结果不确定。

19.4.2 CoordinateInterpolator

CoordinateInterpolator : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFVec3f [in,out] keyValue      [] (-∞,∞)
  MFVec3f [out]    value_changed
}

这个节点在一个 MFVec3f  关键值列表中插值以产生一个 MFVec3f value_changed 事件。keyValue 域中的坐标值的数量应为 key 域中关键帧的整数倍。这个整数的倍数定义了 value_changed 事件中包含坐标的数量。

19.4.3 CoordinateInterpolator2D

CoordinateInterpolator2D : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFVec2f [in,out] keyValue      [] (-∞,∞)
  MFVec2f [out]    value_changed
}

这个节点在一个 MFVec2f  关键值列表中插值以产生一个 MFVec2f value_changed 事件。keyValue 域中的坐标值的数量应为 key 域中的坐标值的数量应为这个整数的倍数定义了 value_changed 事件中包含坐标的数量。

19.4.4 NormalInterpolator

NormalInterpolator : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFVec3f [in,out] keyValue      [] (-∞,∞)
  MFVec3f [out]    value_changed
}

NormalInterpolator 节点在一个由 keyValue 域指定的法线向量集内插值以产生一个 MFVec3f value_changed 事件。value_changed 输出向量的应是一组法线化的向量。

keyValue 域中的值应是单位长度的向量。keyValue 域中的法线的数量应为 key 中关键帧的整数倍。这个整数的倍数定义了 value_changed 事件中包含法线的数量。

法线的插值应在单位球体的表面执行。这就是说,从单位球上点 P 到单位球上点 Q 的线形插值的输出值位于连接点 P 和点 Q 的短弧上(短弧也在单位球上)。而且等间隔的输入 fractions(片断)也将导致弧长上的等分。如果 P 和 Q 在对角的相反的位置,则结果不确定。

19.4.5 OrientationInterpolator

OrientationInterpolator : X3DInterpolatorNode {
  SFFloat    [in]     set_fraction     (-∞,∞)
  MFFloat    [in,out] key           [] (-∞,∞)
  MFRotation [in,out] keyValue      [] [-1,1] or (-∞,∞)
  SFRotation [out]    value_changed
}

The OrientationInterpolator 在一个由 keyValue 指定的旋转值列表内插值以产生一个 SFRotation value_changed 事件。这些旋转值是绝对值不受对象空间影响,因此不是累积的。keyValue 域中包含的值的数量应和 key 域包含的值的数量相同。

方向值(orientation)表示了一个对象应用了旋转之后的最终方位。OrientationInterpolator 中两个方向值之间插值通过两个方位值在单位球上的最短路径计算,并在弧长上沿路径线形插值。如果两个点在对角的相反的位置,则结果不确定。

如果两个前后连续的 keyValue 值之间的弧长大于 π,则插值将在补角的弧上进行。例如方向  (0, 1, 0, 0) 和 (0, 1, 0, 5.0) 之间的插值与 (0, 1, 0, 2π) 和 (0, 1, 0, 5.0) 之间的旋转是等效的。

19.4.6 PositionInterpolator

PositionInterpolator : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFVec3f [in,out] keyValue      [] (-∞,∞)
  SFVec3f [out]    value_changed
}

PositionInterpolator 节点在一个 3D 向量的列表中线形插值以产生一个 SFVec3f value_changed 事件。keyValue 域中包含的值的数量应和 key 域包含的值的数量相同。

19.4.7 PositionInterpolator2D

PositionInterpolator2D : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFVec2f [in,out] keyValue      [] (-∞,∞)
  SFVec2f [out]    value_changed
}

PositionInterpolator 节点在一个 2D 向量的列表中线形插值以产生一个 SFVec2f value_changed 事件。keyValue 域中包含的值的数量应和 key 域包含的值的数量相同。

19.4.8 ScalarInterpolator

ScalarInterpolator : X3DInterpolatorNode {
  SFFloat [in]     set_fraction     (-∞,∞)
  MFFloat [in,out] key           [] (-∞,∞)
  MFFloat [in,out] keyValue      [] (-∞,∞)
  SFFloat [out]    value_changed
}

这个节点在一个 SFFloat 关键值列表中线形插值以产生一个 SFFloat value_changed 事件。此插值器适用于为任何使用单精度浮点值定义的参数插值。例如宽度,半径,强度域。keyValue 域中包含的值的数量应和 key 域包含的值的数量相同。

cube 19.5 支持级别

Interpolation 组件提供 表 19.2 中规定的两个支持级别(levels)。

表 19.2Interpolation 组件支持级别

级别
Level
必备条件 节点 支持
1 Core 1; Aggregation and transformation;
Geometric properties 1
InterpolatorNodeType (abstract) n/a
ColorInterpolator 所有域
CoordinateInterpolator 所有域
OrientationInterpolator 所有域
PositionInterpolator 所有域
ScalarInterpolator 所有域
NormalInterpolator 所有域
2 Core 1; Aggregation and transformation; Geometric properties 1
Level 1 的所有 Interpolation 节点 Level 1 中支持的所有域
    CoordinateInterpolator2D 所有域
    PositionInterpolator2D 所有域

--- X3D separator bar ---

Site Meter