Extensible 3D (X3D)
Part 1: Architecture and base components

22 Environmental sensor component

环境传感器组件

--- X3D separator bar ---

cube 22.1 介绍

22.1.1 名称

这部分组件的名称是 "EnvironmentalSensor"。当在 COMPONENT 语句中引用这个组件时需要使用这个名称(参见 7.2.3.4 Component 语句)。

22.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Environmental Sensor component(环境传感器组件)。表 22.1 列出了这一条款的主要主题。

表 22.1 — 主题

cube 22.2 概念

环境传感器是根据环境中发生的事件的来发送事件的节点,环境中发生的事件通常是场景中两个元素间产生的交互。大多数环境传感器事件发生是因为观测者和场景之间的交互。然而,一个环境传感器事件也可能因场景和非可操纵的硬件部分(例如时钟)交互或者通过网络事件而引发。

以下是环境传感器的类型:

ProximitySensor 检测何时用户导航进入场景中的指定区域。ProximitySensor 自身并不可见。TimeSensor 是一个时钟,然而并没有相关的几何体或位置;它将用来开始或停止诸如传感器之类的基于时间的节点。VisibilitySensor 检测何时场景中制定的部分相对用户可见。

当环境传感器加入到变换层级以及呈现被更新前(例如从文件中读取或由一个脚本创建),它们应产生事件以指示任何此种传感器将检测的条件。不可见的传感器类型生成的初始事件的条件,在 22.4 节点参考 中针对各节点独立定义。

Collision 组节点检测用户何时何虚拟场景中的对象发生碰撞。邻近传感器、碰撞传感器、可见性传感器将独立运作,而不管是否存在其它的传感器,或检测内容重叠。更多信息见 23 导航组件 Navigation component

cube 22.3 抽象类型

22.3.1 X3DEnvironmentalSensorNode

 
X3DEnvironmentalSensorNode : X3DSensorNode {
  SFVec3f [in,out] center    0 0 0 (-∞,∞)
  SFBool  [in,out] enabled   TRUE
  SFNode  [in,out] metadata  NULL  [X3DMetadataObject]
  SFVec3f [in,out] size      0 0 0 (-∞,∞)
  SFTime  [out]    enterTime
  SFTime  [out]    exitTime
  SFBool  [out]    isActive
}

X3DEnvironmentalSensorNode 是环境传感器节点 ProximitySensor 和 VisibilitySensor 的基本类型。

cube 22.4 节点参考

22.4.1 ProximitySensor

ProximitySensor : X3DEnvironmentalSensorNode {
  SFVec3f    [in,out] center                   0 0 0 (-∞,∞)
  SFBool     [in,out] enabled                  TRUE
  SFNode     [in,out] metadata                 NULL  [X3DMetadataObject]
  SFVec3f    [in,out] size                     0 0 0 [0,∞)
  SFTime     [out]    enterTime
  SFTime     [out]    exitTime
  SFVec3f    [out]    centerOfRotation_changed
  SFBool     [out]    isActive
  SFRotation [out]    orientation_changed
  SFVec3f    [out]    position_changed
}

ProximitySensor 节点在观测者进入,或退出一个划定范围的空间(由一个盒子定义),或在其中移动产生事件。通过向其发送一个值为 TRUEFALSE enabled 事件,邻近传感器可以被激活或禁止。被禁止的传感器不发送事件。

ProximitySensor 节点在观测者进入或退出由其 center 域和 size 域定义的矩形检测盒时产生 isActive TRUE/FALSE 事件。浏览器应在 isActive 中插入位置和时间戳,位置和时间戳分别对应观测者最先和邻近度检测区域相交时的确切位置和确切的时间。center 域在对象空间中定义了邻近度检测区域的中心点。size 域指定的矢量定义了检测区域和边界的宽(x)、高(y)、深(z)。size 域的分量应大于或等于 0。ProximitySensor 节点受其父层的变换层级的影响。

isActive TRUE 事件产生(用户进入检测盒)时就产生 enterTime 事件,当 isActive FALSE 事件产生(用户退出检测盒)时就产生 exitTime 事件。

当用户包含在邻近度检测区域中,且 EXAMINE 模式下使用的旋转中心(center of rotation)相对此 ProximitySensor 节点的坐标系改变时,centerOfRotation_changed 域发送事件。在被绑定的 Viewpoint 节点的旋转中心改变时,或新的视点被绑定时,或当用户通过浏览器用户节点改变旋转中心时,或 ProximitySensor 节点坐标系改变时,会导致发生此事件。centerOfRotation_changed 只在当前绑定的 NavigationInfo 类型包括 LOOKAT 导航模式时产生事件。更多信息见 ViewpointNavigationInfo

当用户包含在邻近度检测区域中(包括进入和退出时),且用户位置和方向相对此 ProximitySensor 节点的坐标系改变时,position_changedorientation_changed 域发送事件。浏览器导航时,或 ProximitySensor 节点坐标系改变时,或被绑定的 Viewpoint 节点的位置和方向改变时,会导致环境变化即观测者的移动。

每一个 ProximitySensor 节点行为独立于所有其它 ProximitySensor 节点。每一个激活的 ProximitySensor 节点都受观测者移动的影响,都接收或发送事件,这可能导致多个 ProximitySensor 节点同时接收和发送事件。ProximitySensor 节点不象 TouchSensor 节点,在场景图“捕获”事件时 ProximitySensor 节点没有上下优先级的概念。

实例化的(使用 DEF/USE)ProximitySensor 节点使用所有检测盒的并集来检测进入和退出。多个实例化 ProximitySensor 节点将监测所有监测盒的实例的进入和退出,并发送相应的事件。对于不重叠的检测盒,position_changedorientation_changed 事件根据监测到邻近值的监测盒的相关坐标系计算。然而,如果多个实例化的 ProximitySensor 节点中有任何的重叠,则结果未定义。

包围整个场景的 ProximitySensor 节点的 enterTime 等效与进入场景的时间,可用于场景被载入后立刻开始一个动画和行为。检测盒容积为 0(例如任何 size 域的分量为 0.0)的 ProximitySensor 节点将不产生事件。这与设置 enabled 域为 FALSE 等效。

从一个 X3D 文件中读取 ProximitySensor 节点时,如果此节点为激活且观测者正好位于邻近检测的区域中,则应产生 isActive TRUEposition_changedorientation_changedenterTime 事件。当 ProximitySensor 节点被加入到变换层级时,如果此节点为激活且观测者正好位于邻近检测的区域中,则应产生 isActive TRUEposition_changedorientation_changedenterTime 事件。当 ProximitySensor 从变换层级中移除时,如果此节点为激活且观测者正好位于邻近检测的区域中,应产生 isActive FALSEposition_changedorientation_changedexitTime 事件。

22.4.2 VisibilitySensor

VisibilitySensor : X3DEnvironmentalSensorNode {
  SFVec3f [in,out] center    0 0 0 (-∞,∞)
  SFBool  [in,out] enabled   TRUE
  SFNode  [in,out] metadata  NULL  [X3DMetadataObject]
  SFVec3f [in,out] size      0 0 0 [0,∞)
  SFTime  [out]    enterTime
  SFTime  [out]    exitTime
  SFBool  [out]    isActive
}

VisibilitySensor 节点检测用户在场景中导航时一个矩形盒的可见性的改变。VisibilitySensor 典型的用法是当用户能看见场景中指定的对象或范围时,激活或禁止某个行为或动画。一般这样做的目的是为了吸引注意或改善性能。

enabled 域激活或禁止 VisibilitySensor 节点。如果 enabled 设置为 FALSE,VisibilitySensor 节点将不发送事件。如果 enabledTRUE,VisibilitySensor 节点检测指定的检测盒的可见性状态的改变并通过 isActive 域发送事件。当检测盒的任何部分在渲染视图中显示时,就输出 isActive TRUE 事件。当检测盒对渲染视图没有影响时,输出 FALSE 事件。浏览器应保证当 isActiveFALSE时,检测盒对渲染视图完全没有影响。当 isActiveTRUE 时,浏览器可能出错但并不限制。例如检测盒可能也可以影响渲染效果。

centersize 定义了检测盒中心的空间位置和检测盒的范围(即宽、高、深)。size 域的分量应大于或等于 0。VisibilitySensor 节点的检测盒受其父层的变换层级的影响。

isActive TRUE 事件产生时就产生 enterTime 事件,当 isActive FALSE 事件产生时就产生 exitTime 事件。从一个 X3D 文件中读取 VisibilitySensor 节点时,如果此节点为激活且可视性检测盒可见,则应产生 isActive TRUEenterTime 事件。当 VisibilitySensor节点被加入到变换层级时,如果此节点为激活且可视性检测盒可见,则应产生 isActive TRUEenterTime 事件。当 VisibilitySensor 从变换层级中移除时,如果此节点为激活且可视性检测盒可见,则应产生 isActive FALSE、exitTime 事件。

每一个 VisibilitySensor 节点行为独立于所有其它 VisibilitySensor节点。每一个激活的 VisibilitySensor 节点都受观测者移动的影响,都接收或发送事件,这可能导致多个 VisibilitySensor节点同时接收和发送事件。不象 TouchSensor 节点,在场景图“捕获”事件时 VisibilitySensor 节点没有上下优先级的概念。实例化的(使用 DEF/USE)VisibilitySensor 节点使用所有由它们所有的实例定义的检测盒的并集。实例化的 VisibilitySensor 将监测所有监测盒可视性的变化,并发送相应的事件。

cube 22.5 支持级别

Environmental Sensor 组件提供 表 22.2 中规定的三个支持级别(levels)。Level 1 的目的是通过提供一个简化的 ProximitySensor 节点来自动激活动画。Level 2 提供了环境传感的完全支持。

表 22.2 — Environmental sensor component support levels

级别
Level
必备条件 节点 支持
1 Core 1
Time 1
Grouping 1
Navigation 1
X3DEnvironmentSensorNode(抽象) n/a
ProximitySensor position_changed 可选地支持。
orientation_changed
可选地支持。
2 Core 1
Time 1
Grouping 1
Navigation 1
Level 1 的所有 Environmental Sensor 节点 Level 1 中支持的所有域
ProximitySensor 所有域完全支持
VisibilitySensor 所有域完全支持
--- X3D separator bar --- Site Meter