当前位置:
多媒体应用基础
>> 网络多媒体应用设计>>朝向插补器
3. 朝向插补器
插补器节点可认为是VRML内置的脚本节点,它们执行简单的动态计算,通常和时间检测器或者能够使对象产生动作的节点结合在一起使用,生成线性关键帧动画。插补器节点实际上是一个由关键点和对应关键值定义的分段线形函数。根据插值类型的不同,VRML共定义六个插补器节点:
ColorInterpolator(颜色插补器)、CoordinateInterpolator(坐标插补器)、NormalInterpolator(法线插补器)、OrientationInterpolator(朝向插补器)、positionInterpolator(位置插补器)、ScalarInterpolator(标量插补器)。
所有插补器的域和事件都是类似的:
eventIn SFFloat set_fruction
exposedField MFFloat key [...]
exposedField MF
keyValue
[.....]
eventOut [S|M]F
value_changed
关键值域keyValue的类型决定了插补器的类型(例如,OrientationInterpolator的keyValue域的类型是MFFloat)。入事件set_fraction接收SFFloat型的事件,插补器随即根据它进行插值,并通过出事件value_changed送出插值结果。
这里我们把时间检测器的fraction_changed事件作为插补器的输入,这个事件是一个[0,1]区间的值,每个时间步都送出一次,表示当前周期内已过去的时间相对于整个周期的比例,是插补器常用的输入源之一。与此对应,我们把插补器关键帧的取值也定义在[0,1]范围内。与0和1这两个关键帧对应的关键值的旋转轴是相同的,只是旋转角度不同(0,3.14159),这样方位插补器输出的旋转值的旋转轴固定不变,旋转角从0递增到3.14159,然后不断重复。
#VRML V2.0 utf8
DEF cube Transform { rotation 1 1 1 0
children [ Shape { appearance Appearance {
material Material { diffuseColor 1 0 0 } }
geometry Box {} } DEF TouchS TouchSensor {}
] }
DEF revolver OrientationInterpolator {
key [0,1]
keyValue [ 0.5 1 0.5 0,1 0.5 0 3.14149] }
DEF ticker TimeSensor { cycleInterval 2
loop TRUE
enabled FALSE }
ROUTE TouchS.isOver TO ticker.set_enabled
ROUTE ticker.fraction_changed TO revolver.set_fraction
ROUTE revolver.value_changed TO cube.set_rotation
小结:本节实现连续动画,动画由接触检测器启动,由时间检测器驱动,动画本身比较简单,就是不断地旋转。产生不断变化的旋转值的方法有两种:自己编写脚本,或者利用插补器节点。
|
|
|