动画是物体随时间变化的动态效果。
实现动画的基本方法:由时间传感器控制动画的时钟,然后将时间控制参数作为事件传送给各种插补器节点,插补器依据事先设计好的时间关键点和动画关键值,在浏览器渲染时形成连续变化的动画效果。
描述动画必须具备两个要素:一个是动画过程的描述;一个是时间控制的描述。前者使用VRML提供的适用于不同数据类型的插补器节点或脚本节点,来实现各种数据类型的变化过程的描述。后者使用时间传感器TimeSensor节点来提供开始动画、结束动画和控制动画的播放速度的特性。

事件和路由的互访

节点由域和事件组成,域值决定了节点创建的造型或场景环境的状态,事件为节点提供了接收外界信息或向外界发送信息的能力。
事件是按照指定的路径从一个节点发往另一个节点的信息。节点通过事件入口接收来自其它节点的信息改变自己原有的域值,通过事件出口发送自己的信息以改变自己其它节点的域值。
从一个节点的事件出口到另一个节点的事件入口,用来传送事件的路径叫路由。
事件是VRML实现用户交互与场景动态变化的最主要方式。改变VRML节点域值的方法是通过路由发送一个事件到相应节点的对应域。
每一个节点一般都有两种事件,分别为入事件(eventIn)和出事件(eventOut)。
入事件接收改变的域值,使自己的域值发生变化,以改变虚拟场景。出事件对域值改变进行设置。
eventIn事件通常以“set_”开始,eventOut事件通常以“_changed”结尾,布尔类型的eventOut事件名以“is”开头,时间类型的eventOut事件名以“Time”结束。
exposedField域是一种特殊的数据类型,隐含着两种系统缺省定义的事件:一个是命名为“set_事件名”的入事件,用于设置节点域值;另一个是命名为“事件名_changed”的出事件,用于当域值发生变化时向外界发送新值。
exposedField域事件名字的set_和_changed部分可以省略,对于一些与exposedField域无关的事件名使用set_和_changed的名字时,不能省略set_和_changed部分。
路由是描述节点对象之间进行值传送的路线,实现了对象之间通过事件发生的节点域值、时间值的传送。按照指定的路由从一个节点发往另一个节点的消息,它是一个值,一般类似于节点的域值,可以是坐标值、颜色值或浮点值。
通过路由连接的两个节点,名称可以不同,但数据类型必须相同。
通过ROUTE语句创建一个信息通道来连接事件 的入口和出口。它可以出现在节点域允许的任何地方,但一般把所有的有ROUTE语句集中放置在末尾处。
ROUTE语句所引用的节点,必须在前面都是已经定义好的节点。

VRML动画流程

VRML中的动画由许多发送事件经过一系列的阶段组成,这些阶段主要有:触发阶段、逻辑处理阶段、计时阶段、引擎和目标阶段。

触发阶段

通常触发阶段是一个传感器,它在浏览者执行一个特定的动作时发出一个事件,在触发阶段产生的事件使动画开始启动。
不同的传感器提供了不同的产生事件的方法。当一个传感器被触发了,它总会产生一个事件。

逻辑处理阶段

这个阶段通常对简单的动画来说不是必须的。在启动计时阶段之前,逻辑处理阶段要对触发阶段发送的事件进行某种处理。
为了启动逻辑处理阶段,浏览器将触发阶段发送的事件传递到Script节点,并调用该节点中的相应的子程序。Script节点对事件进行处理时,通常要发送一个时间事件来启动计时阶段。

记时阶段

这个阶段浏览器将逻辑处理阶段或触发阶段发送的出事件传递到TimeSensor(时间传感器)节点中的startTime域,然后时间传感器产生事件,或是作用于保持一个特定的时间段,或是用于持续一段时间直到停止为止。
时间传感器直到给定startTime时才被激活,并产生事件。

引擎和目标阶段

在引擎阶段,浏览器将时间传感器的出事件发送到一个或一组节点,这些节点确定动画在已知时刻的实际参数值,并相应地产生更多的事件。通常引擎阶段由Interpolator(插补器)节点组成,也可以附加到一个Script节点。
在目标阶段浏览器将引擎阶段的出事件发送到场景结构中的一个相关节点,这个节点的域值也做相应的改变。

动画实现

   VRML动画基本思想是由时间传感器给出控制动画效果的时钟,然后通过时钟的事件输出到虚拟世界中,驱动插补器节点以产生动画效果。
当用户的交互操作(如鼠标单击,替身靠近)满足条件时,传感器便会借助路由发送出事件,启动时间传感器(复杂动画的启动、计时、停止);时间传感器同时向各种插补器发送出事件,插补器收到入事件后即向目标节点发送出事件,改变相应的域值。

时间传感器

    TimeSensor时间传感器节点用于创建一个系统虚拟时钟,并对动画插补器实施时间控制。
它可以在一个指定的时间引发动作或固定的时间间隔输出事件。

该节点通常放在最外层组节点的后面,可供任何组节点的子节点使用。但TimeSensor时间传感器节点部是独立于所选用的坐标系之外。

语法:

TimeSensor{

exposedFieldSFBoolenabled           TRUE

exposedFieldSFTimecycleInterval1.0

exposedFieldSFTimestartTime0

exposedFieldSFTimestopTime0

exposedFieldSFBoolloop                  FALSE

eventOutSFBoolisActive

eventOutSFTimetime

eventOutSFTimecycleTime

eventOutSFFloatfraction_changed

}

enable用于设定时间传感器的使用状态。TRUE(打开)或FALSE(关闭)。

cycleInterval域的域值用于设定一个时间长度,从0.0到1.0时刻之间的周期间隔,单位为秒。该域值必须大于0.0,其默认值为

1.0秒。

loop域的域值用于设定时间传感器是否循环输出。如果该域值为TRUE,则从0.0到1.0这段时间间隔内输出浮点时刻,而在时间

间隔的结尾,返回到0.0,开始新的循环。如果该域值为FALSE,时间传感器不循环。

Time出事件,在时间传感器开始运行后,不断向外输出当前时间,其值为从格林威治时间1970年1月1日0时(午夜12点)至今所
经过的时间。
cycleTime是出事件,在时间传感器每次循环开始时输出一个当前时间。
fraction_changed是出事件,在时间传感器开始运行时,输出0到1之间的时刻比例数。
startTime、stopTime、cycleInterval和loop域值共同控制着时间传感器的事件输出。

插补器节点

    插补器节点是为线性关键帧动画而设计的。它采用一组相对时间关键点,且每个关键点对应一种关键状态(关键值),用不同的数据形式表示。插补器节点可分为六种:
颜色插补器(ColorInterpolator)
位置插补器(PositionInterpolator) 
朝向插补器(OrientationInterpolator) 
标量插补器(ScalarInterpolator) 
坐标插补器(CoordinateInterpolator) 
法向量插补器(NormalInterpolator)

颜色插补器节点

颜色插补器ColorInterpolator节点是用于产生场景造型颜色变化的动画效果。该节点在一组MFColor值之间进行线性插值,使用该节点可使造型的颜色发生变化。
语法:

ColorInterpolator{

exposedFieldMFFloatkey       [ ]

exposedFieldMFColorkeyValue[ ]

eventInSFFloatset_fraction

eventOutSFColorvalue_changed

}

key用于设定一组时间关键点的列表。每一个关键点是一个浮点时刻值,与接收到的入事件set_fraction相对应。
keyValue用于设定一系列RGB颜色的关键色彩值,关键色彩值与key值时间关键点一一对应。
set_fraction为入事件,用于不断接收来自时间发出的时刻比例数值。颜色插补器在时间关键点上计算出一个RGB颜色值,由
value_changed出事件发送出去。
value_changed是出事件,用于输出计算后的RGB色彩值。
例子:
#VRML V2.0 utf8
Group{children [Shape {appearance Appearance {material DEF Bmeterial Material{diffuseColor 1.0 0.0 0.0}}geometry Cylinder {}}DEF  Clock  TimeSensor {cycleInterval 3.0loop TRUE}DEF  Bcolorpath  ColorInterpolator {key  [0.0 0.33 0.67 1]keyValue [1 0 0,0 1 0,0 0 1,1 0 0]}]
}
ROUTE  Clock.fraction_changed  TO  Bcolorpath.set_fraction
ROUTE  Bcolorpath.value_changed  TO  Bmeterial.set_diffuseColor

坐标插补器节点

坐标插补器CoordinateInterpolator节点用于产生基于坐标点的复杂造型变形动画效果。该节点在一组MFVec3F值之间进行线性
插值,通过使用该节点,一个造型的组成坐标就可以变化。
语法:

CoordinateInerpoator{

exposedFieldMFFloatkey             [ ]

exposedFieldMFVec3fkeyValue[ ]

eventInSFFloatset_fraction

eventOutMFVec3fvalue_changed

}

keyValue域的域值提供了一张关键三维坐标的列表。每一个坐标都包含三个浮点数值,分别为此向量的X、Y、Z分量。KeyValue

域可提供两个或更多的关键坐标点,如果有N个时刻值和每个时刻值对应的M个关键坐标点,那么该域就包含了N×M个坐标

点。其默认值为一张空列表。

当set_fraction入事件接收到一个时刻值时,CoordinateInterpolator节点就依据关键时刻列表和它们相对应的关键坐标点的子列表
计算出一张新的坐标子列表,并通过出事件value_changed输出新的坐标列表。
例子:
#VRML V2.0 utf8
Background {skyColor[ 0.9 0.9 0.9 ]
}
Shape {           #四棱锥体造型geometry  IndexedFaceSet{coord DEF slz Coordinate {      #定义四棱锥体坐标节点point [0 3 0,3 0 0,0 -3 0,-3 0 0,0 0 3]}coordIndex [0,3,4,-13,2,4,-12,1,4,-11,0,4,-10,1,2,3]colorPerVertex FALSEcolor Color{color [1 0 0,0 1 0,1 1 0,0 0 1,1 1 1]}}
}
DEF  clock  TimeSensor {      #定义时间传感器节点cycleInterval  8loop  TRUE
}
DEF  path  CoordinateInterpolator{    #定义坐标插补器节点key [                       #时间关键点0 0.25 0.5 0.75 1]keyValue [   #坐标关键值0 3 0,3 0 0,0 -3 0,-3 0 0,0 0 30 0 0,3 0 0,0 -3 0,-3 0 0,0 0 30 3 0,3 0 0,0 0 0,-3 0 0,0 0 30 3 0,3 0 0,0 -3 0,0 0 0,0 0 30 3 0,0 0 0,0 -3 0,-3 0 0,0 0 3]
}
ROUTE  clock.fraction_changed  TO  path.set_fraction
ROUTE  path.value_changed  TO  slz.point

位置插补器节点

位置插补器PositionInterpolator节点用于产生场景造型位移的动画效果。该节点在一组SFVec3f值之间进行线性插值。适合于
对平移进行插值。
语法:

PositionInterpolator{

exposedFieldMFFloatkey            [ ]

exposedFieldMFVec3fkeyValue[ ]

eventInSFFloatset_fraction

eventOutSFVec3fvalue_changed

}

keyValue域的域值用于设定了一个关键位置的列表。每一个关键位置都是一组由X、Y、Z浮点值组成的三维坐标或平移距
离。在一些运用中,关键值也可以是X,Y和Z的比例要素或其他三个浮点值的组。其默认值是一张空列表。
当set_fraction入事件接收到一个时刻值时,PositionInterpolator节点计算出基于关键位置表和相关的关键时刻的一个位置,并
通过出事件value_changed输出新的位置列表。
例子:
#VRML V2.0 utf8
Group{children[DEF  Bsphere  Transform{children[Shape{appearance  Appearance{material  Material{diffuseColor  0.2 0.9 0.2}}geometry Sphere{radius 1.0}}]}DEF  Clock TimeSensor {cycleInterval 5loop TRUE}DEF  BspherePath  PositionInterpolator {key[0.0 0.2 0.4 0.6 0.8 1.0]keyValue [0 0 -10,5 0 -10,5 5 -10,-5 -5 -10,-5 0 -10,0 0 -10]}]
}
ROUTE  Clock.fraction_changed  TO  BspherePath.set_fraction
ROUTE BspherePath.value_changed  TO  Bsphere.set_translation

朝向插补器节点

朝向插补器OrientationInterpolator节点用于产生场景造型旋转的动画效果。该节点在一组SFRotation值之间进行插
值,可以使造型旋转。  

OrientationInterpolator{

exposedFieldMFFloatkey            [ ]

exposedFieldMFVec3fkeyValue[ ]

eventInSFFloatset_fraction

eventOutMFVec3fvalue_changed

}

keyValue域的域值用于设定一个旋转关键值的列表。每一个旋转关键值是一个四个值的组。前三个值指定了旋转轴的
X、Y、Z坐标分量,第四个值指定了旋转角度。其默认值是一张空列表。
当set_fraction入事件接收到一个时刻值时,OrientationInterpolator节点根据关键时刻列表和与其对应的关键旋转值列
表,计算出一个新的关键旋转值子列表,并通过出事件value_changed输出新的旋转列表。
例子:
#VRML V2.0 utf8
DEF bar1 Transform {        #定义第一根棒坐标变换节点children [Shape{appearance Appearance {material DEF cbar1 Material {diffuseColor 0.5 0.5 0.7ambientIntensity 0.4specularColor 0.8 0.8 0.9shininess 0.2}}geometry  DEF  C1  Cylinder {height 5radius 0.2}}]
}
DEF bar2 Transform {        #定义第二根棒坐标变换节点children [Shape {appearance Appearance {material DEF cbar2 Material {diffuseColor 0.8 0.8 0.9ambientIntensity 0.4specularColor 0.8 0.8 0.9shininess 0.2}}geometry  USE  C1}]
}
DEF clock TimeSensor {           #定义时间传感器节点cycleInterval 9loop TRUE
}
DEF path1 OrientationInterpolator {   #定义第一根棒的朝向插补器key [0 0.5 1]                  #时间关键点keyValue [                     #朝向关键值0 0 1 0,0 0 1 3.141,0 0 1 6.281]
}
DEF path2 OrientationInterpolator {  #定义第二根棒的朝向插补器key[0 0.5 1]                  #时间关键点keyValue [                      #朝向关键值0 0 1 1.571,0 0 1 4.712,0 0 1 7.851]
}
DEF cpath1 ColorInterpolator {   #定义第一根棒的颜色插补器key[0 0.5 1]               #时间关键点keyValue [                  #颜色关键值1 0 0, 0 1 0, 0 0 1]
}
DEF cpath2 ColorInterpolator {  #定义第二根棒的颜色插补器key[0 0.5 1]              #时间关键点keyValue [               #颜色关键值0.8 0.6 0.2,0.6 0.4 0.9, 0.1 0.8 0.4]
}
ROUTE clock.fraction_changed TO path1.set_fraction
ROUTE clock.fraction_changed TO path2.set_fraction
ROUTE clock.fraction_changed TO cpath1.set_fraction
ROUTE clock.fraction_changed TO cpath2.set_fraction
ROUTE path1.value_changed TO bar1.rotation
ROUTE path2.value_changed TO bar2.rotation
ROUTE cpath1.value_changed TO cbar1.diffuseColor
ROUTE cpath2.value_changed TO cbar2.diffuseColor

标量插补器节点

标量插补器ScalarInterpolator节点用于产生标量值改变的动画。该节点在一组SFFloat值之间进行线性插值,适合
于用简单的浮点值定义的任何域值参数(如宽度、高度、亮度、透明度等)。

ScalarInterpolator{

exposedFieldMFFloatkey            [ ]

exposedFieldMFFloatkeyValue[ ]

eventInSFFloatset_fraction

eventOutSFFloatvalue_changed

}

key用于设定一组时间关键点的列表。每一个关键点是一个浮点时刻值,与接收到的入事件set_fraction相对应。
keyValue域的域值用于设定了一系列关键浮点值。其默认值为一个空的列表。
当set_fraction入事件收到一个时刻值时,ScalarInterolator节点根据关键值的列表和它们对应的关键时刻值,计算一
个浮点值,并通过出事件value_changed输出新的浮点值。
例子:
#VRML V2.0 utf8
Group{children[Shape{appearance  Appearance{material  DEF  Bboxmeterial  Material {diffuseColor  0 0 1}}geometry  Box {size  2 2 2}}Shape{appearance  Appearance{material  Material{diffuseColor  1 1 0}}geometry  Sphere{radius  0.5}}DEF  Clock TimeSensor {cycleInterval  10loop  TRUE},DEF  Btrancpath  ScalarInterpolator {key[ 0,0.5,1 ]keyValue[ 0,1,0 ]}]
}
ROUTE  Clock.fraction_changed  TO  Btrancpath.set_fraction
ROUTE  Btrancpath.value_changed  TO  Bboxmeterial.set_transparency

法向量插补器节点

法向量插补器NormalInterpolator节点用于产生光线明暗变化的动画效果。该节点在Normal节点中的法向量矢
量中进行插值,以产生动画效果。 

NormalInterpolator{

exposedFieldMFFloatkey            [ ]

exposedFieldMFVec3fkeyValue[ ]

eventInSFFloatset_fraction

eventOutMFVec3fvalue_changed

}

key用于设定一组时间关键点的列表。每一个关键点是一个浮点时刻值,与接收到的入事件set_fraction相对
应。
keyValue用于设定一组法向量的列表,关键法向量与key值时间关键点一一对应。
set_fraction为入事件,用于不断接收来自时间发出的时刻比例数值。法向量插补器在时间关键点上计算出一
个新的法向量子列表,由value_changed出事件发送出去。
value_changed是出事件,用于输出计算后的新的法向量子列表。
例子:
#VRML V2.0 utf8
Group{children[Shape{appearance  Appearance {material  Material {diffuseColor 1 1 0}}geometry  IndexedFaceSet{coord Coordinate {point[-2 -2 0,2 -2 0,2 2 0,-2 2 0]}coordIndex[ 0,1,2,3 ]normal  DEF  Bnormal  Normal {vector[1 0 0,0 0 1,0 0 1,0 0 1]}normalIndex [ 0,1,2,3 ]}}DEF  Clock  TimeSensor{cycleInterval  1loop TRUE}DEF Bpath NormalInterpolator {key[0,0.4,0.8,1]keyValue [1 0 0,0 0 1,0 0 1,0 0 10 0 1,1 0 0,0 0 1,0 0 10 0 0,0 0 1,0 0 1,1 0 01 0 0,0 0 1,0 0 1,0 0 1]}]
}
ROUTE  Clock.fraction_changed  TO  Bpath.set_fraction
ROUTE  Bpath.value_changed  TO  Bnormal.set_vector

触动传感器

VRML场景中的造型能够对浏览者的动作做出反应,称之为交互功能。共有七种传感器节点完成感知和反应的交互功能。
TouchSensor触摸传感器

PlaneSensor平面传感器

CylinderSensor圆柱体传感器

SphereSensor球体传感器

ProximitySensor接近传感器

VisibilitySensor可视传感器

Collision碰撞传感器

传感器共分为两类,第一类通过感知浏览者对于鼠标的操作行为触发并输出事件,实现人机交互功能。这类传感器有:触摸、平面、圆柱体、球体传感器。
第二类通过感知浏览者在虚拟场景中的观察位置,即浏览者的视点与造型接近程度大致一定范围时,触发并输出事件,实现人机交互功能节点。这类传感器有:接近、可视、碰撞传感器。

触摸传感器节点

   TouchSensor触摸传感器节点用于感知用户鼠标触发的动作。
当用户用鼠标触摸、单击、按下、松开被感应的造型时,将触发一个动画插补器节点,造型会产生各种动画效果。

TouchSensor{

exposedFieldSFBoolenabled  TRUE

eventOutSFBoolisOver

eventOutSFVec3fhitPoint_changed

eventOutSFVec3fhitNormal_changed

eventOutSFVec3fhitTexCoord_changed

eventOutSFBoolisActive

eventOutSFTimetouchTime

}

enable用于设定传感器的开与关状态。当域值为TRUE时处于打开、为FALSE时为关闭状态。
isOver出事件。当鼠标移动到造型时引发isOver=TRUE事件,当离开造型时引发isOver=FALSE事件。
isAcrive出事件。当在造型上按下鼠标时按键时,引发isActive=TRUE事件,当松开鼠标时按键时,引发isActive=FALSE事件。
tochTime出事件,当isOver=TRUE, isActive= FALSE时,引发该事件,发送当前时间值。常用这个事件来控制点击鼠标左键放开时
发的动作。
hitPoint_changed,在造型(由isOver指定)上单击鼠标时发送该值,为造型上点击处的坐标。
hitNormal_changed在造型(由isOver指定)上单击鼠标时发送该值,为造型上点击处的法向量。
hitCoord_changed在造型(由isOver指定)上单击鼠标时发送该值,为造型上点击处的纹理坐标。
例子:
#VRML V2.0 utf8
Background {skyColor [0.8 0.8 0.8]
}
DEF  TRANS  Transform{children[Shape{appearance  Appearance{material  Material{diffuseColor 1 0 0}}geometry  Sphere {}}DEF  Tou  TouchSensor{} ]
}
DEF  TS  TimeSensor{cycleInterval  5
}
DEF  PI  PositionInterpolator{key[0 0.5 1]keyValue[0 0 0,0 3 0,0 0 0]
}
ROUTE  Tou.touchTime  TO  TS.startTime
ROUTE  TS.fraction_changed  TO PI.set_fraction
ROUTE  PI.value_changed  TO  TRANS.translation

平面传感器节点

PlaneSensor平面传感器节点用于感知用户在XOY平面上鼠标拖拽的动作。
当用户用鼠标拖拽被感应的造型时,造型会按照用户的动作在XOY平面上任意移动,但不改变朝向。

PlaneSensor{

exposedField  SFBool   enabled     TRUE

exposedField  SFVec3f offset       0 0 0

exposedField  SFBool   autoOffset   TRUE

exposedField  SFVec2f maxPosition  -1 -1

exposedField  SFVec2f minPosition  0 0

eventOut        SFBool   isActive

eventOut        SFVect3 trackPoint_changed

eventOut        SFVect3 translation_changed

}

offset用于设定造型的初始位移量。是一个点坐标,表示造型相对于坐标原点的位移量。当用户首次在造型上单击鼠标时,造型移动的坐标值。
autoOffset 用于设定是否自动记忆上次移动的终点位置。默认为自动记忆上次移动的终点位置,再次移动时,造型由此位置开始新的位移。否则由原始位置开始新的位移。
isActive出事件用于当用户在被感应的造型上按下鼠标按键时,将引发isActive=TRUE的事件,表示当前用户松开鼠标按键时,将引发isActive=FALSE的事件
minPosition、maxPosition用于设定造型在X和Y轴上的最小、大移动位置。若最小小于最大时,可在两者之间移动,若相等时不能移动,若最小大于最大时,可在自由移动,不受限制。
trackPoint_changed出事件,当用户在造型上单击鼠标时,输出该值。为造型上所点击的坐标。
translation_changed出事件,当用户用鼠标拖拽造型时,传感器不断输出该事件,值为造型移动点的坐标。 此时不受minPosition和maxPosition的限制。
例子:
#VRML V2.0 utf8
DEF box Transform {children [Shape {appearance Appearance {material Material {}}geometry Box {}}]
}
DEF sensor PlaneSensor {offset 2 2 0       #设定造型的初始移动位置maxPosition 4 3   #设定造型的最大移动位置
}
ROUTE sensor.translation_changed TO box.translation

圆柱体传感器节点

CylinderSensor圆柱体传感器节点用于感知用户绕中心轴拖拽鼠标旋转的动作。
当用户用鼠标拖拽被感应的造型时,造型会按用户的动作绕中心轴(一般是造型所在坐标系的Y轴)任意旋转,造型旋转的轨迹类似于圆柱体。

CylinderSensor{

exposedFieldSFBoolenabled    TRUE

exposedFieldSFFloatoffset      0

exposedFieldSFBoolautoOffsetTRUE

exposedFieldSFFloatmaxAngle-1

exposedFieldSFFloatminAngle0

exposedFieldSFFloatdiskAngle0.262

eventOutSFBoolisActive

eventOutSFVec3ftrackPoint_changed

eventOutSFRotationrotation_changed

}

offset用于设定造型的初始旋转角度。是一个旋转角度。当用户首次在造型上单击鼠标时,造型绕圆柱体中心轴相对于初始位置旋转的角度。
autoOffset 用于设定是否自动记忆上次旋转的终点角度。默认为自动记忆上次旋转的终点角度,再次旋转时,造型由此位置开始新的旋转。否则由原始位置开始新的旋转。
diskAngle用于设定在圆柱体和圆盘之间的切换角度。该值决定造型绕中心轴旋转的轨迹像圆柱体还是圆盘。
minAngle、maxAngle用于设定造型绕中心轴旋转的最小、大角度。若最小小于最大时,可在两者之间旋转,若相等时不能旋转,若最小大于最大时,可在自由旋转,不受限制。
trackPoint_changed出事件,当用户在造型上单击鼠标时,输出该值。为造型上所点击的坐标。
rotation_changed出事件,当用户用鼠标拖拽造型时,传感器不断输出该事件,值为造型旋转的角度。
例子:
#VRML V2.0 utf8
Group {children [DEF    Btransbox Transform {rotation 0.0 1.0 0.0 0.785children[ Shape {appearance Appearance {material Material {diffuseColor 1.0 0.0 0.6}}geometry Box {size 2.0 2.0 2.0}}]}DEF  Bsensor  CylinderSensor {offset  0.785autoOffset  TRUEmaxAngle  1.0minAngle  0.0}]
}
ROUTE Bsensor.rotation_changed TO Btransbox.set_rotation

球体传感器节点

SphereSensor球面传感器节点用于感知用户绕中心点拖拽鼠标旋转的动作。
当用户用鼠标拖拽被感应的造型时,造型会按用户的动作绕中心点(一般是造型所在坐标系的原点)任意旋转,造型旋转的轨迹类似于球体。

SphereSensor{

exposedFieldSFBoolenabled   TRUE

exposedFieldSFRotationoffset      0 1 0 0

exposedFieldSFBoolautoOffsetTRUE

eventOuttrackPoint_changed

eventOutrotation_changed

}

球面传感器的域值设定与圆柱体的设定情况一样,可参考圆柱体传感器的域值设定。
例子:
#VRML V2.0 utf8
Group {children [DEF    BtransSphere Transform {children[Shape {appearance Appearance {material Material {diffuseColor 0.0 0.6 0.6}}geometry Cone {bottomRadius 1.0height 5.0}}]    }DEF    Bsensor SphereSensor {}]
}
ROUTE Bsensor.rotation_changed TO BtransSphere.set_rotation

感知传感器

可视传感器节点

VisiblitySensor可视传感器节点用于从浏览者所在的方位(包括位置和朝向),感知当前场景中是否可以被看见,据此输出事件触发动画效果。

VisibilitySensor{

exposedFieldSFBoolenabled  TRUE

exposedFieldSFVec3f center   0.0 0.0 0.0

exposedFieldSFVec3f size     0.0 0.0 0.0

eventOutSFBoolisActive

eventOutSFTimeenterTime

eventOutSFTimeexitTime

}

size用于设定传感器感知区域有尺寸。即在三个坐标方向的长、宽、高。默认为坐标原点。在这个区域中,具有可视性,传感器触
发动态行为。
isActive出事件。当感知区域在可视范围时,将引发isActive=TRUE的事件。不在可视范围时引发isActive=FALSE的事件。
enterTime出事件。isActive=TRUE时,输出该事件。发送的值为isActive=TRUE的时间。
exitTime出事件。isActive=FALSE时,输出该事件。发送的值为isActive= FALSE 的时间。

例子:
#VRML V2.0 utf8
Background {skyColor[ 0 0.6 0.8]
}
DEF rot Transform {children [Shape {appearance Appearance {material Material {diffuseColor 1 1 1}}geometry Box {size 2 2 2}}]
}
Transform {translation 0 5 0children [Shape {appearance Appearance {material Material {diffuseColor 1 0 1}}geometry Sphere{radius 0.3}}]
}
DEF sensor VisibilitySensor {center  0 5 0size  0.6 0.6 0.6
}
DEF clock TimeSensor{cycleInterval  5
}
DEF path OrientationInterpolator {key [0  0.5 1]keyValue [1 1 0 01 1 0 3.1411 1 0 6.281]
}
ROUTE sensor.enterTime TO clock.startTime
ROUTE sensor.isActive TO  clock.loop
ROUTE sensor.exitTime TO clock.stopTime
ROUTE clock.fraction_changed TO path.set_fraction
ROUTE path.value_changed TO rot.rotation

接近传感器节点

ProximitySensor接近传感器节点用于从浏览者所在的方位,感知用户进入、退出设定的空间长方体区域的动作。
设定的长方体区域是传感器的感知区域,在该区域内创建造型。当用户用户进入、退出感知区域时,造型会随用户与其接近程度
变化,将触发动画效果。

ProximitySensor{

exposedFieldSFBoolenabled  TRUE

exposedFieldSFVec3f   center    0 0 0

exposedFieldSFVec3f   size      0 0 0

eventOutSFBoolisActive

eventOutSFVec3fposition_changed

eventOutSFRotationorientation_changed

eventOutSFTimeenterTime

eventOutSFTimeexitTime

}

center用于设定传感器感知区域中心的坐标值。
size用于设定传感器感知区域有尺寸。即在三个坐标方向的长、宽、高。默认为坐标原点。
isActive出事件。当用户进入感知区域时,将引发isActive=TRUE的事件。退出时isActive=FALSE的事件。
position_changed出事件。当用户进入、退出或在感知区域移动时,输出浏览者当前的位置。
orientation_changed出事件。当用户进入、退出或在感知区域移动时,输出浏览者当前位置的坐标空间方向。
enterTime和exitTime出事件。用户进入、退出感知区域的正确时间。
例子:
#VRML V2.0 utf8
Background {skyColor [0.6 0.2 1]
}
Group {children [DEF ball Transform {               #设置小球位置和形状translation 0 0 -3children [Shape {appearance Appearance {material Material {diffuseColor 1 1 0}}geometry Sphere{radius 1}}]}DEF  prox ProximitySensor {size 2 2 2}DEF  clock  TimeSensor{cycleInterval  4}DEF  path  PositionInterpolator {key[0 0.2 0.4 0.6 0.8 1]keyValue [0 0 0, 0 0 -30,5 0 -10, -5 0 -10, 0 0 -30, 0 0 -10]}]
}
ROUTE prox.enterTime TO clock.startTime
ROUTE clock.fraction_changed TO path.set_fraction
ROUTE path.value_changed TO ball.translation

碰撞传感器节点

Collision碰撞传感器节点用于从浏览者所在的方位,感知子节点造型发生碰撞的动作。
当用户与造型发生碰撞时,传感器输出事件触发动画效果,也可启动声音节点为碰撞动作配上音效效果,使场景更加逼真。
碰撞传感器既可单独使用,也可作为其它编组节点的子节点使用。具有编组和感知双重功能。

Collision{

exposedfieldMFNodechildren  [ ]

exposedfieldSFBoolcollide      TRUE

field SFNodeproxy             NULL

field        SFVec3f bboxCenter0.0 0.0 0.0

field        SFVec3f bboxSize-1.0 1.01.0

eventInMFNodeaddChildren

eventOutMFNodereomveChildren

eventOutSFTimecollideTime

}

children用于设定进行碰撞检测的子节点或子节点列表。若使用碰撞代体,则用碰撞代体代替children设置的造型进行碰撞检测。
collide用于设定碰撞传感器节点所捆绑的造型是否进行碰撞检测。
proxy用于设定碰撞代体。代替children设置的造型进行碰撞检测。
bboxCenter和bboxSize用于设定包围碰撞传感器节点所有子节点的包围盒的中心点坐标和尺寸。
collideTime 出事件。输出传感器检测到的碰撞发生的时间。
addChildren和removeChildren将指定的节点碰从碰撞传感器节点的子节点列表中加入或删除。
例子:
#VRML V2.0 utf8
Group {children [DEF    Bcollision Collision {children [DEF LeftDoor Transform {children[ Transform {translation    -0.75 0.0 0.0children[ DEF Door Shape   {appearance Appearance {material Material {diffuseColor 0.30 0.11 0.00specularColor 0.70 0.33 0.00shininess 0.10ambientIntensity 0.30}}geometry Box {size 1.5 3.0 0.2}}] }]}DEF RightDoor Transform {children[ Transform {translation   0.75 0.0 0.0children[ USE Door ]}]}]}DEF    Clock TimeSensor {cycleInterval 5.0}DEF LeftOpen PositionInterpolator {key  [0.0,0.1,0.9,1.0]keyValue [0.0 0.0 -13.0,1.3 0.0 -13.0,-1.3 0.0 -13.0,0.0 0.0 -13.0]}DEF    RightOpen PositionInterpolator {key [0.0,0.1,0.9,1.0]keyValue [0.0 0.0 -13.0,1.3 0.0 -13.0,1.3 0.0 -13.0,0.0 0.0 -13.0]}]
}
ROUTE Bcollision.collideTime TO Clock.set_startTime
ROUTE Clock.fraction_changed TO LeftOpen.set_fraction
ROUTE Clock.fraction_changed TO RightOpen.set_fraction
ROUTE LeftOpen.value_changed TO LeftDoor.set_translation
ROUTE RightOpen.value_changed TO RightDoor.set_translation

VRML---第五章(动画流程和交互功能)相关推荐

  1. 莫烦Matplotlib可视化第五章动画代码学习

    5.1 Animation 动画 import numpy as np import matplotlib.pyplot as plt from matplotlib import animation ...

  2. spaa的交互式绘图_第五章:SPSS统计绘图功能详解

    5.1常用统计图 5.1.1操作界面介绍(条图) 5.1.1.1条图的通用界面 5.1.1.2复式条图与分段条图的界面 5.1.2其他常用统计图 5.1.2.1散点图 5.1.2.2线图 5.1.2. ...

  3. 《计算机组成原理》复习第五章—中央处理器

    第五章 中央处理器 5.1 CPU功能和组成 5.1.1 CPU的基本功能 CPU主要包括了运算器和控制器两大部分,运算器的功能实现第二章已经学过了,这里我们中点讨论一下控制器的内容. 当一条指令进入 ...

  4. 《GitHub入门与实战》第五章

    第五章 详细解说GitHub的功能 注意: 随着版本的更新,github上的界面也随之改变了很多,但是功能还是不变的,只是放在了不同的位置上.   GitHub 为实现社会化编程提供了诸多功能. 5. ...

  5. SRPG游戏开发(九)第五章 颜色映射与职业动画 - 一 颜色映射流程(Flow Chart)

    返回目录 第五章 颜色映射与职业动画 这一章我们来完成2D游戏中颜色映射(Palette Swap)调色盘的相关内容,并初步建立一个职业的动画控制器(Animator)与相关动画(Animations ...

  6. SRPG游戏开发(十)第五章 颜色映射与职业动画 - 二 颜色组(Color Chart)

    返回目录 第五章 颜色映射与职业动画 二       颜色组(Color Chart) 颜色组是保存许多颜色的一个容器,可以在Swapper中直接创建List<Color>或Color[] ...

  7. jQuery系列 第五章 jQuery框架动画特效

    第五章 jQuery框架动画特效 5.1 jQuery动画特效说明 jQuery框架中为我们封装了众多的动画和特效方法,只需要调用对应的动画方法传递合适的参数,就能够方便的实现一些炫酷的效果,而且jQ ...

  8. 54:第五章:开发admin管理服务:7:人脸入库流程;人脸登录流程;浏览器开启视频调试模式(以便能够在本机的不安全域名的情况下,也能去开启摄像头);

    说明: (1)本篇博客内容:介绍人脸入库流程,人脸登录流程:人脸入库流程:Chrome开启视频调试模式,以便能够在本机的不安全域名的情况下,也能去开启摄像头: 目录 一:人脸入库流程,人脸登录流程: ...

  9. 《操作系统真象还原》第十五章 ---- 实现系统交互 操作系统最终章 四十五天的不易与坚持终完结撒花(上)

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 闲聊时刻 实现fork 实现fork的介绍 实现fork的原理 编写完的thread.c(fork_pid) 编写完的thread.h(str ...

最新文章

  1. SAP MM 不常用事务代码MIDO
  2. [Node.js]回调函数
  3. shell中join链接多个域_Linux Shell中使用awk完成两个文件的关联Join
  4. Apache Flink Meetup 8.7 深圳站,企业实践 + 1.14 版本预热
  5. OnlineJudge 离线题库采集
  6. 《Sibelius 脚本程序设计》连载(五) - 1.2 编辑第一个插件
  7. Visual Studio 20xx试用版升级为正式版(WIN7同样有效)图解、附带序列号
  8. 收藏 | 使用PyTorch时,最常见的4个错误
  9. UNIX网络编程——使用线程的TCP回射服务器程序
  10. java string 精度_Java 中的浮点数取精度方法
  11. 基于JAVA+SpringBoot+Mybatis+MYSQL的高铁售票系统
  12. 支付业务与技术架构学习总结(4)——对账相关业务知识及对账系统总结
  13. 深度学习——最优化的学习笔记
  14. SPSS简介【SPSS 004期】
  15. python实现自动化打印
  16. 来自安徽、关心安徽的朋友一定要看!快报记者3点准时登陆在线聊天 - 评说天下 - 19楼互动生活空间
  17. shell日志分析脚本
  18. 【中秋系列】这款秘制Python月饼游戏,拿走不谢~
  19. 新的用户故事待办列表就是一副地图
  20. 正睿OIday3总结

热门文章

  1. vue页面实现拨打电话功能
  2. 打电话蓝牙耳机什么牌子好?打电话音质清晰的蓝牙耳机
  3. SLAM算法知识荟萃
  4. 重仓农业,巨头鏖战社区团购“广积粮”
  5. 计算机知识点汇总职高,职校学生必备三个必考知识点
  6. 微信小程序接入客服功能
  7. 阿里巴巴校园招聘笔试(答案版)
  8. 痔疮需要用php吗,长了痔疮,一定要做手术根除?辟谣:2种情况才考虑切除
  9. 处理JDBC requires that the JdbcType must be specified for all nullable parameters.问题
  10. 【AR技术点】(三)完整的AR效果