3.8传感器
传感器节点是交互能力的基础,在场景图中,传感器一般是以其它节点的了节点的身份而存在的,它的父节点称为可触发节点,触发条件和时机由传感器节点类型决定。
CylinderSensor(圆柱传感器)、PlaneSensor(平面传感器)、ProximitySensor(邻近传感器)、SphereSensor(球面传感器)、TimeSensor(时间传感器)、TouchSensor(接触传感器)、VisibilitySensor(可见度传感器)
3.8.1 接触传感器(TouchSensor)
TouchSensor节点用来检测浏览者在VRML浏览窗口中的光标动作,并且输出一些参数来触发和控制动画效果
#VRML V2.0 utf8
Group{
children[
DEF Btransbox Transform{
children Shape{
appearance Appearance{
material Material{
diffuseColor 1.0 1.0 0.0
}
}
geometry Box{
size 1.0 0.6 1.0
}
}
},
DEF Btouch TouchSensor{ },
DEF Clock TimeSensor{
enabled FALSE
cycleInterval 2.0
loop TRUE
},
DEF Bboxpath OrientationInterpolator{
key[ 0.0 0.5 1.0,]
keyValue[
0.0 1.0 0.0 0.0,
0.0 1.0 0.0 3.14,
0.0 1.0 0.0 6.28,
]
}
]
}
ROUTE Btouch.isOver TO Clock.set_enabled
ROUTE Clock.fraction_changed TO Bboxpath.set_fraction
ROUTE Bboxpath.value_changed TO Btransbox.set_rotation
3.8.2 平面传感器节点(PlaneSensor)
PlaneSensor节点所创建的空间传感器用来检测浏览者在虚拟世界中的动作,并将这些动作转换为适于空间造型的输出,使浏览者像是在一个二维的平面上所观察到的那样。
#VRML V2.0 utf8
Group{
children[
DEF Btransbox Transform{
children Shape{
appearance Appearance{
material Material{
diffuseColor 1.0 1.0 0.0
}
}
geometry Box{
size 2.0 2.0 2.0
}
}
},
DEF Bsensor PlaneSensor{
minPosition -2.0 -2.0
maxPosition 2.0 2.0
}
]
}
ROUTE Bsensor.translation_changed TO Btransbox.set_translation
例:#指定空间三个正方体的移动范围
#VRML V2.0 utf8
Group{
children[
Group{
children[
DEF Btransbox0 Transform{
translation -1.2 0.0 0.0
children Shape{
appearance Appearance{
material Material{
diffuseColor 1.0 1.0 0.0
}
}
geometry Box{
size 2.0 2.0 2.0
}
}
},
DEF Bsensor0 PlaneSensor{
offset -1.2 0.0 0.0
minPosition -1.5 -1.5
maxPosition 1.5 1.5
}
]
},
Group{
children[
DEF Btransbox1 Transform{
translation 1.2 0.0 0.0
children Shape{
appearance Appearance{
material Material{
diffuseColor 1.0 0.0 0.0
}
}
geometry Box{
size 2.0 2.0 2.0
}
}
},
DEF Bsensor1 PlaneSensor{
offset 1.2 0.0 0.0
minPosition -1.5 -1.5
maxPosition 1.5 1.5
}
]
},
Group{
children[
DEF Btransbox2 Transform{
translation 0.2 2.0 0.0
children Shape{
appearance Appearance{
material Material{
diffuseColor 0.0 0.0 1.0
}
}
geometry Box{
size 2.0 2.0 2.0
}
}
},
DEF Bsensor2 PlaneSensor{
offset 0.2 2.0 0.0
minPosition -1.5 -1.5
maxPosition 1.5 1.5
}
]
}
]
}
ROUTE Bsensor0.translation_changed TO Btransbox0.set_translation
ROUTE Bsensor1.translation_changed TO Btransbox1.set_translation
ROUTE Bsensor2.translation_changed TO Btransbox2.set_translation
3.8.3 球面传感器节点(SphereSensor)
SphereSensor节点所创建的空间传感器用来检测浏览者在虚拟世界中的动作,并将这些动作转换为适于空间造型的输出,使浏览者像是在一个转动的球体上所观察到的那样。
例:#在球体上旋转的空间圆锥体
#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
3.8.4 圆柱体传感器节点(CylinderSensor)
CylinderSensor节点所创建的空间传感器用来检测浏览者在虚拟世界中的动作,并将这些动作转换为适于空间造型的输出,使浏览者像是在围绕着一根旋转轴旋转一个圆柱体所观察到的那样。
例:#圆柱面旋转的正方体
#VRML V2.0 utf8
Group{
children[
DEF Btransbox Transform{
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{ }
]
}
ROUTE Bsensor.rotation_changed TO Btransbox.set_rotation
例:#在指定了旋转范围和偏移角度的圆柱面旋转的空间正方体#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
3.8.5 可视性传感器节点(VisibilitySensor)
VisibilitySensor节点能作为某个组的子节点,并且能从观察者的方向和位置感知一个长方体区域在当前的坐标系中何时可视。
例:#创建两个黄铜色的长方体.,当浏览者靠近它们时,它们将向外平移开
#VRML V2.0 utf8
Group{
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 TouchDoor VisibilitySensor{
center 0.0 0.0 0.0
size 1.0 1.0 1.0
}
]
},
DEF Clock TimeSensor{
cycleInterval 5.0
},
DEF LeftOpen PositionInterpolator{
key[0.0,0.1,0.9,1.0]
keyValue[
0.0 0.0 0.0,
-1.3 0.0 0.0,
-1.3 0.0 0.0,
0.0 0.0 0.0
]
},
DEF RightOpen PositionInterpolator{
key[0.0,0.1,0.9,1.0]
keyValue[
0.0 0.0 0.0,
1.3 0.0 0.0,
1.3 0.0 0.0,
0.0 0.0 0.0
]
}
ROUTE TouchDoor.enterTime 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 V2.0 utf8
DEF light_zj Transform {
translation 0 3 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 1 1 0
}
}
geometry Cylinder {
radius 0.6
height 5
}
}
]
}
DEF light Transform {
translation 0 6 0
children [
Shape {
appearance Appearance {
material DEF lightcolor Material {
diffuseColor 1 1 0
}
}
geometry Sphere {
radius 1
},
}
]
}
DEF ii TimeSensor
{
cycleInterval 1.0
loop TRUE
}
DEF io ColorInterpolator{
key [0.0,0.5,1.0]
keyValue[1 0 0,0.75 0 0]
}
DEF touchbox VisibilitySensor{
size 10.0 10.0 10.0
center 0.0 0.0 0.0
enabled TRUE
}
ROUTE touchbox.enterTime TO ii.set_startTime ROUTE ii.fraction_changed TO io.set_fraction ROUTE io.value_changed TO lightcolor.diffuseColor