查看: 1876|回复: 0
打印 上一主题 下一主题

[VRML] VRML动画程序编程

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-9-13 16:36:33 |只看该作者 |倒序浏览
一. 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}



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




2. 利用CoordinateInterpolator使形体产生动态变形 作用:可用来动态改变形体的坐标,主要用在下面节点上:
In***dFaceSet、In***dLineSet、PointSet、Ex***sion


步骤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



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





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字段
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-22 04:12 , Processed in 0.132722 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部