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

       动画是物体随时间变化的动态效果。
      实现动画的基本方法:由时间传感器控制动画的时钟,然后将时间控制参数作为事件传送给各种插补器节点,插补器依据事先设计好的时间关键点和动画关键值,在浏览器渲染时形成连续变化的动画效果。
      描述动画必须具备两个要素:一个是动画过程的描述;一个是时间控制的描述。前者使用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{

    exposedField SFBool  enabled           TRUE

    exposedField SFTime cycleInterval  1.0

    exposedField SFTime startTime       0

    exposedField SFTime stopTime        0

    exposedField SFBool  loop                  FALSE

    eventOut SFBool isActive

    eventOut SFTime  time

    eventOut SFTime cycleTime

    eventOut SFFloat fraction_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{

  exposedField MFFloat  key       [ ]

  exposedField MFColor keyValue  [ ]

  eventIn  SFFloat  set_fraction

  eventOut SFColor value_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.0
			loop 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{

  exposedField MFFloat  key             [ ]

  exposedField  MFVec3f keyValue  [ ]

  eventIn          SFFloat  set_fraction

  eventOut         MFVec3f value_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,-1
			3,2,4,-1
			2,1,4,-1
			1,0,4,-1
			0,1,2,3
		]
		colorPerVertex FALSE
		color Color{
			color [
				1 0 0,0 1 0,1 1 0,0 0 1,1 1 1
			]
		}
	}
}
DEF  clock  TimeSensor {      #定义时间传感器节点
	cycleInterval  8
	loop  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 3
		0 0 0,3 0 0,0 -3 0,-3 0 0,0 0 3
		0 3 0,3 0 0,0 0 0,-3 0 0,0 0 3
		0 3 0,3 0 0,0 -3 0,0 0 0,0 0 3
		0 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{

  exposedField MFFloat   key            [ ]

  exposedField  MFVec3f keyValue  [ ]

  eventIn          SFFloat  set_fraction

  eventOut        SFVec3f  value_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 5
			loop 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{

  exposedField MFFloat    key            [ ]

  exposedField  MFVec3f  keyValue  [ ]

  eventIn          SFFloat   set_fraction

  eventOut        MFVec3f value_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.7
					ambientIntensity 0.4
					specularColor 0.8 0.8 0.9
					shininess 0.2
				}
			}
			geometry  DEF  C1  Cylinder {
				height 5
				radius 0.2
			}
		}
	]
}
DEF bar2 Transform {        #定义第二根棒坐标变换节点
	children [
		Shape {
			appearance Appearance {
				material DEF cbar2 Material {
					diffuseColor 0.8 0.8 0.9
					ambientIntensity 0.4
					specularColor 0.8 0.8 0.9
					shininess 0.2
				}
			}
			geometry  USE  C1
		}
	]
}
DEF clock TimeSensor {           #定义时间传感器节点
	cycleInterval 9
	loop 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{

  exposedField MFFloat  key            [ ]

  exposedField MFFloat keyValue  [ ]

  eventIn          SFFloat set_fraction

  eventOut       SFFloat value_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  10
			loop  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{

  exposedField MFFloat   key            [ ]

  exposedField  MFVec3f keyValue  [ ]

  eventIn          SFFloat  set_fraction

  eventOut        MFVec3f value_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  1
			loop TRUE
		}
		DEF	Bpath NormalInterpolator {
			key[0,0.4,0.8,1]
			keyValue [
				1 0 0,0 0 1,0 0 1,0 0 1
				0 0 1,1 0 0,0 0 1,0 0 1
				0 0 0,0 0 1,0 0 1,1 0 0
				1 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{

  exposedField SFBool   enabled  TRUE

  eventOut       SFBool  isOver

  eventOut        SFVec3f hitPoint_changed

  eventOut        SFVec3f hitNormal_changed

  eventOut        SFVec3f hitTexCoord_changed

  eventOut       SFBool  isActive

  eventOut       SFTime  touchTime

}

   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{

  exposedField SFBool   enabled    TRUE

  exposedField SFFloat    offset      0

  exposedField SFBool   autoOffset  TRUE

  exposedField SFFloat   maxAngle  -1

  exposedField SFFloat   minAngle  0

  exposedField SFFloat   diskAngle  0.262

  eventOut    SFBool      isActive

  eventOut     SFVec3f   trackPoint_changed

  eventOut    SFRotation rotation_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.785
			children[ 
				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.785
			autoOffset  TRUE
			maxAngle  1.0
			minAngle  0.0
		}
	]
}
ROUTE Bsensor.rotation_changed TO Btransbox.set_rotation

球体传感器节点

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

SphereSensor{

  exposedField SFBool        enabled   TRUE

  exposedField SFRotation  offset      0 1 0 0

  exposedField SFBool       autoOffset  TRUE

  eventOut       trackPoint_changed

  eventOut       rotation_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.0
						height 5.0
					}
				}
			]	
		}
		DEF	Bsensor SphereSensor {}
	]
}
ROUTE Bsensor.rotation_changed TO BtransSphere.set_rotation

感知传感器

可视传感器节点

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

VisibilitySensor{

  exposedField SFBool   enabled  TRUE

  exposedField  SFVec3f center   0.0 0.0 0.0

  exposedField  SFVec3f size     0.0 0.0 0.0

  eventOut       SFBool   isActive

  eventOut       SFTime  enterTime

  eventOut      SFTime   exitTime

}

    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 0
	children [
		Shape {
			appearance Appearance {
				material Material {
					diffuseColor 1 0 1
				}
			}
			geometry Sphere{radius 0.3}
		}
	]
}
DEF sensor VisibilitySensor {
	center  0 5 0
	size  0.6 0.6 0.6
}
DEF clock TimeSensor{
	cycleInterval  5
}
DEF path OrientationInterpolator {
	key [0  0.5 1]
	keyValue [
		1 1 0 0
		 1 1 0 3.141
		 1 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{

  exposedField SFBool    enabled  TRUE

  exposedField  SFVec3f   center    0 0 0

  exposedField  SFVec3f   size      0 0 0

  eventOut       SFBool    isActive

  eventOut        SFVec3f   position_changed

  eventOut       SFRotation orientation_changed

  eventOut       SFTime    enterTime

  eventOut       SFTime    exitTime

}


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 -3
			children [
			 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{

  exposedfield MFNode  children  [ ]

  exposedfield SFBool   collide      TRUE

  field        SFNode   proxy             NULL

  field        SFVec3f   bboxCenter  0.0 0.0 0.0

  field        SFVec3f   bboxSize      -1.0 1.01.0

  eventIn     MFNode addChildren

  eventOut    MFNode reomveChildren

  eventOut    SFTime  collideTime

}

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.0
							children[ 
								DEF Door Shape	{
									appearance Appearance {
										material Material {
											diffuseColor 0.30 0.11 0.00
											specularColor 0.70 0.33 0.00
											shininess 0.10
											ambientIntensity 0.30
										}
									}
									geometry Box {
										size 1.5 3.0 0.2
									}
							    }
							] 
						}
					]
				}
				DEF	RightDoor Transform	{
					children[ 
						Transform {
							translation	0.75 0.0 0.0
							children[ 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)