一. 编程的知识
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字段
阅读(1650) | 评论(0) | 转发(0) |