📄 第二十章 动画效果.txt
字号:
第二十章 动画效果.txt
在VRML 2.0中同时也给出了动画虚拟世界的各种节点,通过这些节点不但可以使空间造型在空间位置上发生动画,还可以产生缩放的动画以及造型外观的动画效果。
VRML的动画效果其实就是依靠一个给定的时间传感器和一系列各种各样的内插节点来控制场景中各种动画效果。其基本的方法就是时间传感器给出一个控制动画效果的时钟,这个时钟包含了动画效果的开始时间、停止时间、时间间隔和是否循环等动画控制参数,然后通过这个时钟的输出在虚拟世界中驱动世界各种内插节点产生各种相应的动画效果、而在内插节点中将给出各种动画效果的关键点和关键值,VRML浏览器将自动地根据这些关键点通过线性插值的方法来完成整个的动画过程。
1、TimeSensor节点(时间传感器)
TimeSensor节点将在虚拟空间中创建一个驱动动画效果的时钟。
TimeSensor节点语法
TimeSensor {
enabled TRUE #域值类型 SFBool
startTime 0.0 #域值类型 SFTime
stopTime 0.0 #域值类型 SFTime
cycleInterval 1.0 #域值类型 SFTime
loop FALSE #域值类型 SFBool
isActive #输出接口 SFBool
time #输出接口 SFTime
cycleTime #输出接口 SFTime
fraction_changed #输出接口 SFFloat
}
enable用来控制这个时间传感器是否打开。(可以使用事件接口)
startTime用来指定这个时间传感器开始驱动输出的时间,缺省值为0.0s。(可以使用事件接口)
stopTime用来指定这个时间传感器停止驱动的时间。(可以使用事件接口)
cycleInterval域值给出的是一个时间长度,就是这个时间传感器从0.0时刻到1.0时刻之间的周期间隔,单位是秒。(可以使用事件接口)
loop用来指定这个时间传感器是否在虚拟空间中循环输出,也就是说当域值为TRUE时这个时间传感器将在这个TimeSensor节点所在的VRML文件打开的时间内自动地重复输出动画驱动。(可以使用事件接口)
输出接口isActive在时间传感器开始输出的同时向外输出一个TRUE值,而当时间传感器停止输出或被设置无效的同时isActive输出接口将输出一个FALSE值。
输出接口cycleTime在时间传感器每次循环的开始输出一个当前的时间绝对值,当然在loop域值为FALSE的时候其只是在一开始输出一次。
输出接口fraction_changed用来输出时间传感器运行时的一些浮点时刻,其结果在0.0时刻和1.0时刻之间,并且在每一个循环开始的时候输出为0.0,而在每一个循环结束的时候输出为1.0。
TimeSensor节点在VRML文件中通常被放在最外层编组节点的最后面,当然也可以作为任意编组节点的子节点出现,但是TimeSensor节点总是独立于所有的空间坐标系之外,并且在虚拟空间中也不会产生任何的造型效果,其作用只是驱动各种内插节点产生所需要的动画效果。
★使用技巧:TimeSensor其实就是给出了动画效果的时间上的控制,但是对于不同的浏览器和不同档次的计算机来说,动画效果也将存在着一些差别。
2、空间位置动画
对于VRML空间中的动画效果而言TimeSensor节点还需要各种内插节点的配合。
1.PositionInterpolator节点
PositionInterpolator节点给出的是一些空间点参数组成关键点和关键值。
PositionInterpolator节点语法
PositionInterpolator {
key [] #域值类型 MFFloat
keyValue [] #域值类型 MFVec3f
set_fraction #输入接口 SFFloat
value_changed #输出接口 SFVec3f
}
key域值用来指定一个浮点时刻的关键值列表,时刻在0.0和1.0之间,所给出的关键值列表必须是依次递增列出的。(可以使用事件接口,此输入接口为key_loop,输出接口为key_changed)
keyValue域值给出的是一个关键位置的空间点坐标列表,其中的坐标点和前面的key域值中给出的关键时刻列表中的关键时刻点相对应。(可以使用事件接口,此输入接口为keyValue_loop,输出接口为key_changed)
key域值和keyValue域值中给出的各个时刻关键值和空间位置关键值依次一一对应,可见两个域中所给出的关键值数目必须是完全相同的,但是其中所包含关键值的个数是不受限制的。
输入接口set_fraction通常是接受到TimeSensor节点中的输出接口fraction_changed中传送出来的时刻,当然也可以通过其他产生浮点值的方法输入到set_fraction输入接口中。
和TimeSensor节点一样,所有的内插节点独立于所有的空间坐标系之外,在虚拟空间中并不产生任何的造型效果,而是用来产生所需要的动画效果。
[空间位置的动画效果.wrl] 这个例子创建了一个使用了PositionInterpolator节点和TimeSensor节点产生的空间球体的动画效果。该VRML文件用TimeSensor节点驱动了PositionInterpolator节点,然后再通过PositionInterpolator节点来控制Transform节点的输入接口set_translation来指定了球体在空间中的位置变化。
[缩放动画.wrl] 用PositionInterpolator节点中通过value_changed输出接口输出的是一些每个由3个浮点数所组成的数组,很容易想到可以用其来输入到Transform节点的set_scale输入接口中来实现空间造型的缩放动画,而实际上这也是可以实现的。
2.OrientationInterpolator节点
给出的的一些空间旋转参数组成关键点和关键值,语法如下
OrientationInterpolator {
key [] #域值类型 MFFloat
keyValue [] #域值类型 MFVec3f
set_fraction #输入接口 SFFloat
value_changed #输出接口 SFVec3f
}
key(同上)(可以使用事件接口,set_key和key_changed)
keyValue域值给出的是一个关键位置的空间旋转坐标列表,其中的坐标点和前面的key域值中给出的关键时刻列表中的关键时刻点相对应。(可以使用事件接口,此输入接口为keyValue_loop,输出接口为key_changed)
key域值和keyValue域值中给出的各个时刻关键值和空间位置关键值依次一一对应,可见两个域中所给出的关键值数目必须是完全相同的,但是其中所包含关键值的个数是不受限制的。
输入接口set_fraction通常是接受到TimeSensor节点中的输出接口fraction_changed中传送出来的时刻,当然也可以通过其他产生浮点值的方法输入到set_fraction输入接口中。
可以看到OrientationInterpolator节点和PositionInterpolator节点基本相同,不过前者输出的不是空间位置的列表,而是一个空间旋转参数的列表,通常会被输出到Transform节点的输入接口set_rotation中来控制空间造型在虚拟空间中的旋转动画。
[旋转动画.wrl] 这是一个正在旋转的空间长方体。
当然在一个VRML文件中可以同时给出不止一个的内插节点和TimeSensor节点,可以同时产生数个不同的动画效果。
[多个内插节点的使用.wrl] 该例,创建了一个部分太阳系的模型,动画包括了太阳的自转,月球围绕地球的转动和其他行星围绕太阳的转动。并且为不同的行星指定了不同的旋转内插节点,给出了各自不同的转动周期。
另外在这个VRML文件中还能看到可以在Transform节点中给出center域值来指定旋转动画旋转的中心。
3、外观材料动画
在VRML中Material节点中给定的空间造型的外观材料参数同样可以产生动画效果。其中将要涉及到的内插节点包括ColorInterpolator节点和ScalarInterpolator节点,前者输出的是一些颜色值,可以用来动画诸如diffseColor和emissiveColor这样的域值,产生造型颜色变化的动画效果;而后者输出的是一个浮点数值,可以用来控制Appearance节点中的transparency域值,产生透明度的变化动画效果。
1.ColorInterpolator节点的作用是给出一个关键颜色值的列表。语法如下
ColorInterpolator {
key [] #域值类型 MFFloat
keyValue [] #域值类型 MFVec3f
set_fraction
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -