VRML动画编程的基础知识

1. Transform节点

作用:
建立局部坐标系,对形体进行坐标变换,从而使形体发生移动、旋转、比例变化

常用的字段:

rotation 提供旋转的角度
(四个数字,头三个数和原点构造旋转轴,第四个数给出旋转角度,右手逆时针为正方向)
scale 提供比例放大的系数
translation 提供平移的数值

children 提供坐标变换的对象,可以是形体或另一个局部坐标系

利用Transform的translation字段,书中的EX2_01.WRL经过下面的简单变化,使形体由中间移到左边

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}
Background{skyColor 1 1 1}
#程序结束
2. Group节点作用: 无坐标变换功能的Transform节点,因而可以用Transform替代
常用的字段:

children 提供Group的组成部分
3. DEF和USE 作用: 用于给节点语句命名,从而重复使用,DEF和USE缩短程序的好方法
4. Anchor节点作用: 使多个VRML产生链接

常用的字段:

url 提供链接的文件名
description 提供链接文件的说明

parameter 提供链接的方式(开新窗口或覆盖旧的)

children 产生链接的载体(鼠标应点击的对象)

5. Billboard节点作用: 产生广告牌效果
常用的字段:

axisOfRotation 旋转轴,(三个常用的数值:0 1 0、1 0 0、0 0 0)
children (产生广告牌效应的形体或文字)

6. Viewpoint节点作用: 确定观察位置
常用的字段:

orientation 提供观察角度
position 提供观察位置

7. Background节点作用: 设置显示背景,也可以在背景上设置图片,最多可贴六张图片
常用的字段:

skyColor 设置背景为白色

8. Fog节点
作用:使形体产生雾化效果

常用字段:

color 设置雾的颜色
visibilityRange 给出雾的影响范围
(当形体离观察点的距离大于此值时,形体的颜色与雾相同)

9. NavigationInfo节点作用: 设定程序运行方式,主要有:ANY、WALK、EXAMINE、FLY、NONE

二. VRML动画编程初步 1. 问题:如何使一个立方体动起来?

步骤1: 编写一个立方体,设定背景为白色,程序通过Transform节点,改变了形体的原始位置

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}
Background{skyColor 1 1 1}
#程序结束
步骤2: 定义一个时间周期TS,用的是一个时间传感器节点TimeSensor
里面给出周期数值字段cycleInterval,通过loop字段指定是否循环

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

#下面四行是增加的部分
DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

Background{skyColor 1 1 1}

步骤3: 利用PositionInterpolator节点,定义形体的运动轨迹,用DEF命名为PI
意思是在十秒钟内,形体由(-5 0 0)移到(5 0 0),再回到(-5 0 0)

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

#下面四行是增加的内容
DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0]
}

Background{skyColor 1 1 1}

步骤4: 利用DEF给立方体所在的局部坐标系命名为T

#VRML V2.0 utf8
#下面一行是改变的内容,只加了头几个字符
DEF T Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0]
}

Background{skyColor 1 1 1}

步骤5: 通过两条ROUTE语句,使形体动起来

ROUTE TS.fraction_changed TO PI.set_fraction
(时间的变化传到位置内插器)
ROUTE PI.value_changed TO T.translation
(位置内插器将特定时间的位置数值传给形体所在的局部坐标系)

下面是最终的程序:

#VRML V2.0 utf8
DEF T Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0 -5 0 0]
}

#下面两行是增加的内容
ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation

Background{skyColor 1 1 1}

点击这里可运行上面的程序(ex2_02.wrl)

点击这里可阅读上面的程序(ex2_02.wrl)
2. 路由语句(P40)作用: VRML动画及交互作用的桥梁

内容: ROUTE 事件出 TO 事件进

编写步骤:

对于发出事件的传感器节点(如TimeSensor)和接收事件的节点
(如内插器节点),编写具体的内容,并用DEF命名
对于接收事件的其它节点(如定义局部坐标系的TransformGroup)
也用DEF命名,并根据具体需要,将收到的事件进传给具体参数,
从而产生动画效果

注意1:同一行ROUTE语句的事件进(eventIn)和事件出(eventOut)的类型必须相同

注意2:上面介绍的两个ROUTE语句:

ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation
也可以写成:
ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation

也就是说:_changed (用于事件出)、set_ (用于事件进)可写可不写,不影响程序的运行
三. 用于VRML动画编程的内插器节点语句

用于VRML动画编程的内插器节点名称最后均为Interpolator
1. 利用ColorInterpolator产生颜色的动态变化

步骤1: 给需要变化颜色的形体材值Material命名

… DEF COLORA Material{diffuseColor 1 0 0} …

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个ColorInterpolator节点,给出颜色变化的具体方式

DEF CI ColorInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给ColorInterpolator
一个将ColorInterpolator的变化传给Material

点击这里可运行书中P54页的EX6_01.WRL(一个不断改变颜色的圆柱)

点击这里可阅读书中P54页的EX6_01.WL(一个不断改变颜色的圆柱)
2. 利用CoordinateInterpolator使形体产生动态变形 作用:可用来动态改变形体的坐标,主要用在下面节点上:

IndexedFaceSet、IndexedLineSet、PointSet、Extrusion

步骤1: 给一个Coordinate节点命名,作为相应形体coord字段的具体内容

… DEF AAA Coordinate{point […]} …

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个CoordinateInterpolator节点,给出坐标变化的具体方式

DEF CI CoordinateInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给CoordinateInterpolator
一个将CoordinateInterpolator的变化传给Coordinate

点击这里可运行书中P55页的EX6_02.WRL(不断变形的长方体)
点击这里可阅读书中P55页的EX6_02.WRL(不断变形的长方体)

点击这里可运行书中P55页的EX6_03.WRL(可变形的拉伸体,需要点击一下)

点击这里可阅读书中P55页的EX6_03.WRL(可变形的拉伸体,需要点击一下)

点击这里可运行书中P54页的EX6_04.WRL(跳动着的点和线)

点击这里可阅读书中P54页的EX6_04.WRL(跳动着的点和线)

3. 利用OrientationInterpolator动态改变观察方向,或这改变形体的方向

作用: 可用来动态改变Viewpoint节点的方向(ex5_02.wrl)
或用来动态改变形体的方向,使形体旋转(ex6_05.wrl)

步骤1: 给需要变化方向的Viewpoint节点命名,或者给需要旋转形体所在的Transform节点命名

DEF AAA Transform{…}
DEF AAA Viewpoint{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个OrientationInterpolator节点,给出变化的具体方式

DEF OI orientationInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给OrientationInterpolator
一个将OrientationInterpolator的变化传给Transform或Viewpoint

点击这里可运行书中P44页的EX5_02.WRL(不断移动的圆柱)

点击这里可阅读书中P44页的EX5_02.WRL(不断移动的圆柱)

点击这里可运行书中P58页的EX6_05.WRL(三个转动形体)

点击这里可阅读书中P58页的EX6_05.WRL(三个转动形体)

4. 利用PositionInterpolator动态改变观察位置,或这改变形体的位置

作用:

可用来动态改变Viewpoint节点的位置(ex5_01.wrl)
或用来动态改变形体的位置,使形体动态移动(ex6_07.wrl)

怪异使用:可用来改变形体所在局部坐标系的scale字段(ex6_06)

步骤1:

给需要变化方向的Viewpoint节点命名
或者给需要动态移动形体所在的Transform节点命名

DEF AAA Transform{…}
DEF AAA Viewpoint{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个PositionInterpolator节点,给出变化的具体方式

DEF PI PositionInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给PositionInterpolator
一个将PositionInterpolator的变化传给Transform或Viewpoint

5. 利用ScalarInterpolator动态改变透明程度、雾的影响范围

作用:

可用来动态改变Material节点的transparency字段,从而改变形体的透明效果(ex6_08.wrl)
或用来动态改变Fog节点visibilityRange字段,从而雾的影像范围(ex6_10.wrl)

步骤1: 给Material或Fog节点命名,Material通常是Appearance节点material字段的具体内容
DEF MMM Material{…}
DEF FFF Fog{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个ScalarInterpolator节点,给出变化的具体方式

DEF SI ScalarInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4:
给出两个ROUTE语句:

一个将TimeSensor的变化传给ScalarInterpolator
一个将ScalarInterpolator的变化传给Material的transparency字段,或Fog的visibilityRange字段

发布于 :未分类

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注