📄 第二十一章 空间传感器.txt
字号:
offset域值给出了一个旋转偏移值,也就是空间造型相对于上面的那个虚拟的空间圆柱面中心的旋转值。(可以使用事件接口)
autoOffset域值用来设置是否在旋转中加上offset域值给出的偏移值。当域值为TRUE时将加上这个偏移值,而当域值为FALSE时在平移中将不加上偏移值。(可以使用事件接口)
maxAngle域值和minAngle域值是用来给出旋转角度的范围。(可以使用事件接口)
上面介绍的这几个域值将共同决定最终旋转值的大小,而这个平移量将由输出接口rotation_changed传送出来。
[圆柱面旋转空间造型.wrl] 所示立方体就是通过CylinderSensor节点指定了一个圆柱体旋转的观察方式,其实现方法就是将CylinderSensor节点的输出接口rotation_changed来驱动Transform节点的set_rotation输入接口。
[指定旋转的范围和偏移量.wrl] 指定了旋转范围和偏移角度值的圆柱旋转造型。最后得到的正方体只能在一个范围内转动。
5、VisibilitySensor节点
VisibilitySensor节点能作为某个组的子节点,并且它能从观察者的方向和位置感知一个长方体区域在当前的坐标系统中何时可视的。
VisibilitySensor节点语法
VisibilitySensor {
enabled TRUE #域值类型 SEBool
center 0.0 0.0 0.0 #域值类型 SEVec3f
size 0.0 0.0 0.0 #域值类型 SFVec3f
isActive #输出接口 SFBool
enterTime #输出接口 SFTime
exitTime #输出接口 SFTime
}
enable(同上) 除那些用来响应或域值改变的输出以外(如:enable_changed)。 (可以使用事件接口)
center域值指定在当前三维坐标系中一个可感知区域中心的三维坐标。缺省区域中心为原点。(可以使用事件接口)
size域值指定一个传感器长方体的区域的尺寸,包括宽度、高度和深度,在当前的坐标系中沿X,Y,Z方向测量。缺省值为区域在原点的一个点。(可以使用事件接口)
当传感器任何部分在视点方锥体内部时,传感器节点会使用输出接口isActive来输出TRUE,并使用输出接口enterTime来输出当前的绝对时间。当全部传感器都在视方锥体外部时,传感器就会使用isActive输出接口事件输出FALSE,并且通过输出接口exitTime输出当前的绝对时间。
如果一个传感器使用DEF和USE来引用,可视性区域就会在每一个传感器实例中被观测。
[控制传感区域.wrl] 所示的空间场景,当浏览者靠近两个黄铜色的长方体时,它们将向外平移开来,就像两扇滑门一样分开,这就是通过VisibilitySensor节点在空间中给定了一个区域,当浏览者进入到这个区域中就触发了空间造型的动画效果。
6、ProximitySensor节点
ProximitySensor节点能够作为任何组的子节点,并且它可以感知观察者何时进入、退出和移动于当前坐标系内一个长方体区域。
ProximitySensor节点语法
ProximitySensor {
enable TRUE #域值类型 SEBool
center 0.0 0.0 0.0 #域值类型 SFVec3f
size 0.0 0.0 0.0 #域值类型 SFVec3f
isActive #输出接口 SFBool
enterTime #输出接口 SFTime
exitTime #输出接口 SFTime
position_changed #输出接口 SFVec3f
orientation_changed #输出接口 SFRotation
}
enable(同上) 除那些用来响应或域值改变的输出以外(如:enable_changed)。 (可以使用事件接口)
center域值指定在当前三维坐标系中一个可感知区域中心的三维坐标。缺省区域中心为原点。(可以使用事件接口)
size域值指定一个传感器长方体的区域的尺寸,包括宽度、高度和深度,在当前的坐标系中沿X,Y,Z方向测量。缺省值为区域在原点的一个点。一个size域值为0.0 0.0 0.0的传感器表示它已被关闭了。(可以使用事件接口)
当观察者进入感知区域时,传感器节点通过isActive输出接口输出一个TRUE,并使用enterTime输出接口输出当前的绝对时间。当观察者退出感知区域时,由isActive输出接口输出FALSE值,使用exitTime输出接口输出当前的绝对时间。
在感知区域中,每次观察者的位置和方位发生改变时,观察者新的位置和方向分别由position_changed和orientation_changed输出接口事件来输出。两个值在ProximitySensor节点的坐标系中测量。观察者位置方向的改变可能是一些动作的结果,这包括观察者使用浏览器用户界面和包含当前Viewpoint节点的坐标系运动,一个新的当前Viewpoint节点的帮定或观察者不动而感知区域发生运动,等等。
实例参见VisibilitySensor节点使用方法基本相同。
7、Collision节点
Collision组节点观测何时观察者和组中的任何其他造型发生碰撞。
Collision {
children [] #域值类型 MFNode
bboxCenter 0.0 0.0 0.0 #域值类型 SFVec3f
bboxSize -1.0 -1.0 -1.0 #域值类型 SFVec3f
collide TRUE #域值类型 SFBool
proxy NULL #域值类型 SFNode
collideTime #输出接口 SFTime
addChildren #输入接口 MFNode
removeChildren #输出接口 MFNode
}
children指定了一个包含在组中的子节点列表。VRML浏览器由创建每一个造型和组来创建该组。
bboxSize指定了一个约束长方体的尺寸,这个尺寸的大小要足以包容组中的所有造型。第1个给出的值是长方体X方向的宽度;第2个给出的值是长方体Y方向的高度;第3个给出的值是长方体Z方向的深度。
bboxCenter指定了约束长方体的中心,这个域值是组坐标系中的一个三维坐标。其缺省值是原点。
collide指定一个TRUE或一个FALSE值,它使得对于组中子节点的碰撞检测变为有效或无效。如果域值为TRUE,当观察者使用由NavigationInfo节点指定的“WALK”或“FLY”导航类型移动时,组中的造型将进行碰撞检测。如果观察者碰撞到了造型,浏览器就被通知,并且观察者的移动停止。当域值collide是FALSE时,在组中的碰撞检测就为无效,观察者可以穿过组中的造型。
Collision节点节点的子节点可以是Collision节点。这样就创建了一个碰撞控制的家族树。在碰撞检测中,VRML浏览器碰撞家族树,它从最高的父节点开始,直到每一个子节点。如果Collision节点父节点允许对子节点进行碰撞检测,那么VRML浏览器就可以检测父节点每一个子节点的碰撞情况,并且检测子节点的子节点,如此直到树端。
当检测碰撞家族树时,如果VRML浏览器遇到一个不允许对其子节点进行碰撞检测的父Collision节点,那么VRML浏览器就条过对该Collision节点的子节点及其后代的碰撞检测。任何将Collide域值设为FALSE的Collision节点,就跳过其后代的Collision节点直到树端。
VRML浏览器创建一个隐含的Collision节点,它围绕于整个空间,并且collide域值为TRUE。这就确保了在使用“WALK”和“FLY”导航类型时,碰撞检测特性被找开。
一个造型和观察者之间的距离小于或等于由NavigtionInfo节点的avatarSize域指定的avatar宽度时,碰撞发生。当碰撞在一个造型上发生时,包含该造型的每个Collision节点使用collide输出接口事件输出当前绝对时间。
一个单个的造型也许是多个Collision节点节点的后代,例如,当一个Collision节点包括一个Collision节点作为其子节点,而这一子节点又包含另一个Collision子节点,如此一直延续到一个造型。如果所有的Collision节点一直到一个造型都允许对子节点进行碰撞检测,当观察者碰到这个造型时,那么所有的Collision节点都由他们的collideTime输出接口事件输出碰撞时间。
域值proxy指出一个可以选择的造型,它用来作子节点造型的简单替代。当碰撞检测时,代理造型被用于代替子节点造型。子节点造型被实际创建,代理造型并不创建。Proxy域值的缺省值是一个NULL造型。
如果一个Collision节点没有子节点,但有一个代理造型,那么代理造型指定其中一个不可见造型的尺寸和形状。这可以用来创建透明造型,例如,窗户。
所有几何节点,除PointSet和Indexed LineSet节点外,都可以用来创建可碰撞的造型。
[碰撞触发效果.wrl] 这个例子仍然沿用前面VisibilitySensor节点介绍给出的空间场景,但是在使用Collison节点是必须将空间中的传感造型节点作为子节点放在Collision节点中的children域值中,从这个意义上说Collision节点也可以说是一个编组节点。(当浏览者碰到了传感造型上才会触发相关的事件)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -