Extensible 3D (X3D)
Part 1: Architecture and base components
19 Interpolation component
插值器组件
这部分组件的名称是 "Interpolation"”。当在 COMPONENT 语句中引用这个组件时需要使用这个名称(参见 7.2.3.4 Component 语句)。
本条款描述了 ISO/IEC 19775 标准这部分中的 Interpolation component(插值器组件)。表 19.1 列出了这一条款的主要主题。
此条款描述了六种插值器(Interpolator)节点,这些插值器提供了建立关键帧动画的能力。
插值器节点提供了动画关键帧的值之间的线性插值。以下节点类型是基于每种值类型的插值器节点:
所有的插值器节点基于 X3DInterpolatorNode 抽象类型。
此条款中定义的 X3D 插值器节点是为线性关键帧动画插值而设计的。每一个此类节点定义了一个 (-∞,∞) 区间中的分段线性函数 f(t)。此线性函数定义 n 个 t 的值,称为 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) 的值是不确定的,当应总是相关的极限值中的一个。
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 事件相同类型且具有相同的事件戳。
keyValue 和 value_changed 域的内容依赖于节点的类型(例如 PositionInterpolator 域使用 MFVec3f 值)。keyValue 域中的值或值的集按顺序对应 key 域中的参数值。
对于插值器节点将产生一个单值,如果 key 域中值的数量和 keyValue 域中值的数量不同,则结果不确定。
对于产生多值的插值器节点,其 keyValue 域为一个值的 nxm 数组,其中 n 为 key 域中值的数量,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 被发送到将渲染的目标坐标节点。
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)中执行。 如果在两个连续关键帧之间进行补色之间的插值,则结果不确定。
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 事件中包含坐标的数量。
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 事件中包含坐标的数量。
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 在对角的相反的位置,则结果不确定。
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) 之间的旋转是等效的。
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 域包含的值的数量相同。
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 域包含的值的数量相同。
ScalarInterpolator : X3DInterpolatorNode { SFFloat [in] set_fraction (-∞,∞) MFFloat [in,out] key [] (-∞,∞) MFFloat [in,out] keyValue [] (-∞,∞) SFFloat [out] value_changed }
这个节点在一个 SFFloat 关键值列表中线形插值以产生一个 SFFloat value_changed 事件。此插值器适用于为任何使用单精度浮点值定义的参数插值。例如宽度,半径,强度域。keyValue 域中包含的值的数量应和 key 域包含的值的数量相同。
Interpolation 组件提供 表 19.2 中规定的两个支持级别(levels)。
级别 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 | 所有域 |
翻译 m17 保留版权 如需转载请联系http://17de.com/x3d/