 
 
    Extensible 3D (X3D)
    Part 1: Architecture and base components
20 Pointing device sensor component
指点设备传感器
 
 20.1 介绍
 
20.1 介绍这部分组件的名称是 "PointingDeviceSensor"。当在 COMPONENT 语句中引用这个组件时需要使用这个名称(参见 7.2.3.4 Component 语句)。
本条款描述了 ISO/IEC 19775 标准这部分中的 Pointing Device Sensor component(指点设备传感器 ))。其中包括指点设备在概念上如何操作,以及提供了哪些不同类型的指点设备传感器。表 20.1 列出了这一条款的主要主题。
 20.2 概念
20.2 概念指点设备传感器(pointing-device sensors)检测诸如用户点击几何体片面之类的用户指点事件(例如 TouchSensor)。 以下的节点类型为指点设备传感器:
Anchor 节点用作检测用户拾取时也可被认为是一个指点设备传感器。但它不是由 X3DPointingDeviceSensorNode 界面扩展而来的。
可以添加其它的组件以添加指点设备传感器。
当用户把指点设备定位在此指点设备传感器指定的受影响的几何体上时,此指点设备传感器被激活。指点设备影响所有由此传感器的父组继承的几何体。在 Anchor 节点中,Anchor 节点自身被当作这个父组。一般指点设备传感器和受其影响的几何体同级。或者,传感器和包含受其影响的几何体的组同级。
几何体的外观属性不受传感器的活动影响。特别说明透明材质或纹理将不反映相应指点设备传感器的活动。
对于给定的用户活动,层级中最低层的激活的设备传感器是活动的。最低层的活动设备传感器上层的其它所有设备传感器将被忽略。此层级由定位此指点设备传感器的几何体节点及其整个上层层级定义。如果多个指点设备传感器同为最底层,则每个传感器都同时且独立地活动,可能会有多个传感器同时活动并输出事件。这个特性允许指点设备传感器联合运作(例如 TouchSensor 和 PlaneSensor)。如果一个指点设备传感器在变换层级中出现多次(DEF/USE),则应检测在其出现的所有坐标系中的活动状态。
如果指点设备的按钮活动而此时指点设备传感器没有被激活,则不产生相关此指点设备的事件,直到等此指点设备停止活动且传感器被激活时才产生事件(例如,在拖曳时激活传感器将不会使传感器立即被激活 )。
拖曳传感器(Drag sensors)是指点设备传感器的子集。有三种类型的拖曳传感器:CylinderSensor、PlaneSensor、SphereSensor。拖曳传感器一般有两个 outputOnly 域:trackPoint_changed 和 <value>_changed。这些 outputOnly 域依照其“虚拟几何体”(例如 CylinderSensor 使用圆柱体)为活动的指点设备的每种移动发送事件。trackPoint_changed outputOnly 域发送方位轴(bearing)和拖曳传感器的虚拟几何体的交点。<value>_changed outputOnly 域发送从传感器活动开始时的相对变化值加上此传感器 offset 域的偏移值的总和。<value>_changed 的类型和名称依照拖曳传感器的类型:在 CylinderSensor 中为 rotation_changed,在 PlaneSensor 中为 translation_changed,在 SphereSensor 中为 rotation_changed。
为了简化这些传感器的应用,每个节点中都有 inputOutput 域 offset 
  和 autoOffset。当传感器生成对应活动指点设备动作的事件时,<value>_changed 
  发送从初始活动开始的相对变化值加上 offset 
  域偏移值的总和。如果 autoOffset 值为 TRUE,这时当指点设备变为不活动时,offset 
域的值将被设置为传感器最后的 <value>_changed 值并且 offset 域将发送一个 offset_changed 
输出事件。这将允许后续的捕捉操作累计变化值。如果 autoOffset 值为 FALSE,传感器在变为不活动时(或其它任何时间)不设置 offset 
域的值。
指点设备控制了虚拟场景中的一个指针。在由指点设备激活时,传感器将根据指针的移动生成事件。指点设备一般可以分为 2D 的(例如常规的鼠标)或 3D 的(例如操纵杆)。由 2D 设备控制的指针建议被映射到一个和观测者固定距离的且与视线垂直的平面上。3D 设备的映射可以描述为指点设备移动相对指针移动的 1:1 的关系。
指针的位置定义了一个方位轴以决定将指出哪一个几何体。当 2D 指点设备执行时,建议方位轴由从观测者当前位置出发并穿过指针位置的矢量定义。当 3D 指点设备执行时,建议方位轴由从观测者当前位置出发延伸向指针指示方向的矢量定义。
在各种条件下,指针都指出和方位轴相交的几何体。如果方位轴和多个传感器的几何体相交,则只有离指针最近的传感器符合条件并被激活。
 20.3 抽象类型
20.3 抽象类型X3DDragSensorNode : X3DPointingDeviceSensorNode { 
  SFBool   [in,out] autoOffset         TRUE
  SFString [in,out] description        ""
  SFBool   [in,out] enabled;
  SFNode   [in,out] metadata           NULL [X3DMetadataObject]
  SFBool   [out]    isActive;
  SFBool   [out]    isOver
  SFVec3f  [out]    trackPoint_changed
}
这个抽象节点类型是所有拖曳风格指点设备传感器所用基本类型。
X3DPointingDeviceSensorNode : X3DSensorNode {
  SFString [in,out] description ""
  SFBool   [in,out] enabled;
  SFNode   [in,out] metadata    NULL [X3DMetadataObject]
  SFBool   [out]    isActive;
  SFBool   [out]    isOver
}
这个抽象节点类型是所有指点设备传感器所用基本类型。
X3DTouchSensorNode : X3DPointingDeviceSensorNode { 
  SFString [in,out] description ""
  SFBool   [in,out] enabled;
  SFNode   [in,out] metadata    NULL [X3DMetadataObject]
  SFBool   [out]    isActive;
  SFBool   [out]    isOver
  SFTime   [out]    touchTime
}
这个抽象节点类型是所有接触风格指点设备传感器所用基本类型。
 20.4 节点参考
20.4 节点参考CylinderSensor : X3DDragSensorNode { 
  SFBool     [in,out] autoOffset         TRUE
  SFString   [in,out] description        ""
  SFFloat    [in,out] diskAngle          π/12  (0,π/2)
  SFBool     [in,out] enabled            TRUE
  SFFloat    [in,out] maxAngle           -1    [-2π,2π]
  SFNode     [in,out] metadata           NULL  [X3DMetadataObject]
  SFFloat    [in,out] minAngle           0     [-2π,2π]
  SFFloat    [in,out] offset             0     (-∞,∞)
  SFBool     [out]    isActive
  SFBool     [out]    isOver
  SFRotation [out]    rotation_changed
  SFVec3f    [out]    trackPoint_changed
}
CylinderSensor(圆柱传感器)节点映射指针的动作(例如鼠标或操纵杆)到一个不可见的圆柱,此圆柱的对齐局部坐标系的 Y 轴。CylinderSensor 节点使用其父节点的下一层几何体决定是否将生成事件。
enabled 域激活或禁止 CylinderSensor 节点。如果其值为 TRUE,传感器将根据用户事件做出适当反应。如果其值为 
FALSE,传感器将不追踪用户输入也不发送事件。如果 enabled 域接收到一个 FALSE 
事件且此时 isActive 为 TRUE,传感器将被禁止且不活动,同时输出一个 isActive 
  FALSE 事件。如果 enabled 域接收到一个 TRUE 
  事件,则传感器开始活动并准备由用户激活。
CylinderSensor 节点当指点设备活动且指针指示出了任一个此传感器父组的下一层几何体时生成事件。使用指点设备激活 CylinderSensor 的更多细节见 20.2.3 激活与操作指点设备传感器。
激活了指点设备(例如按下鼠标按钮)且指示出了传感器的几何体时,将发送一个 isActive TRUE 事件。方位轴矢量和 CylinderSensor 
节点局部 Y 轴之间的锐角决定了将使用不可见的圆柱的侧面还是圆柱的盖子(圆盘)来进行操作。如果初始角度小于 diskAngle 
,此几何体被当作为一个位于其父组的局部 Y=0 平面且初始交点与之重合的无限大的圆盘。拖曳操作被映射为绕此传感器局部坐标系 +Y 轴的旋转。初始交点到 Y 
轴的垂直矢量定义了绕 Y 轴的零旋转值。每个后续的方位轴的位置都将对应地发送一个 rotation_changed 事件,此事件的值等于绕 +Y 
轴矢量的旋转值(从初始交点到新交点)加 offset 偏移值的总和。trackPoint_changed 
事件反映了此圆盘表面的未经箝位的拖曳位置。当指点设备变为不激活且 autoOffset 为 TRUE 值时,offset 
  将被设置为最后的 rotation_changed 值并且生成一个 offset_changed 
  事件。autoOffset 域和 offset 域的一般描述见 20.2.2 
拖曳传感器。
如果方位轴矢量和 CylinderSensor 节点局部 Y 轴之间的初始锐角大于或等于 diskAngle,传感器将象一个圆柱那样运作。交点(在方位轴和传感器几何体间)和其父组的局部坐标系 
Y 轴之间的最短距离,决定了用于映射指点设备动作的不可见圆柱的半径并标记了零旋转值得位置。每个后续的方位轴的位置都将对应地发送一个 rotation_changed  
事件,此事件的值等于绕 +Y 轴矢量的从原始交点起的右手旋转值加 offset 偏移值的总和。trackPoint_changed 
事件反映了此圆盘表面的未经箝位的拖曳位置。当指点设备变为不激活且 autoOffset 为 TRUE 值时,offset 
  将被设置为最后的 rotation_changed 值并且生成一个 offset_changed 
  事件。更多细节见 20.2.2 
  拖曳传感器。
当传感器生成一个 isActive TRUE 
  事件时,此传感器将独占此指点设备的后续动作,直到此指点设备被释放并生成一个 isActive FALSE 
  事件(在此期间其它指点设备传感器不应生成事件)。“拖曳”操作将参照为一个 isActive 值为 TRUE 
时的指点设备的动作。如果使用 2D 指点设备,isActive 
  事件一般反映此设备相关的主按钮的状态(例如 isActive 为 TRUE 
  时表示主按钮按下,为 FALSE 
  时表示主按钮被释放)。如果使用 3D 指点设备(例如操纵杆),isActive 事件一般反映指针在传感器的几何体内或和其有接触。
当指点设备激活时,输出 trackPoint_changed 
事件和 rotation_changed 
  事件,这两个事件根据传感器活动时的指点设备相对于传感器局部坐标系的动作做解释。trackPoint_changed 
  事件表示未经箝位的在不可见圆柱或圆盘的表面上的交点。根据初始角规定的是否以圆柱方式转动(相对情况是以圆盘方式转动),以及指点设备在被激活时是否被拖离圆柱,浏览器可以按照不同的方法解释操作的情况(例如限定所有的值在圆柱上并且继续旋转
,就象点正被拖离圆柱那样)。当 isActive 
  为 TRUE 时,每次指点设备的移动都将生成 trackPoint_changed 
  事件和 rotation_changed 事件。
minAngle 域和 maxAngle 域把 rotation_changed 事件的值箝位在一个范围内。如果 minAngle 大于 maxAngle,则不箝位 rotation_changed 事件。minAngle 域和 maxAngle 域限制在范围 [-2π, 2π] 中。
此行为的更多细节的描述见 20.2 概念。
PlaneSensor : X3DDragSensorNode { 
  SFBool   [in,out] autoOffset          TRUE
  SFString [in,out] description         ""
  SFBool   [in,out] enabled             TRUE
  SFVec2f  [in,out] maxPosition         -1 -1 (-∞,∞)
  SFNode   [in,out] metadata            NULL  [X3DMetadataObject]
  SFVec2f  [in,out] minPosition         0 0   (-∞,∞)
  SFVec3f  [in,out] offset              0 0 0 (-∞,∞)
  SFBool   [out]    isActive
  SFBool   [out]    isOver
  SFVec3f  [out]    trackPoint_changed
  SFVec3f  [out]    translation_changed
}
PlaneSensor(平面传感器)节点映射指点设备的动作为一个平面上的二维变换,此平面平行于局部坐标系中 Z=0 的平面。PlaneSensor 节点使用其父节点的下一层几何体决定是否将生成事件。
enabled 域激活或禁止 PlaneSensor 节点。如果其值为 TRUE,传感器将根据用户事件做出适当反应。如果其值为 
FALSE,传感器将不追踪用户输入也不发送事件。如果 enabled 域接收到一个 FALSE 
事件且此时 isActive 为 TRUE,传感器将被禁止且不活动,同时输出一个 isActive
FALSE 事件。如果 enabled 域接收到一个 TRUE 
事件,则传感器开始活动并准备由用户激活。
PlaneSensor 节点当指点设备活动且指针指示出了任一个此传感器父组的下一层几何体时生成事件。使用指点设备激活 PlaneSensor 的更多细节见 20.2.3 激活与操作指点设备传感器。
激活了指点设备(例如按下鼠标按钮)且指示出了传感器的几何体时,将发送一个 isActive TRUE 
事件。指针动作被映射为追踪平面(tracking 
  plane,一个平行于传感器局部 Z=0 平面且初始交点与之重合的平面)。每个后续的方位轴的移动都将对应地输出一个 translation_changed 
事件,此事件的值等于从原始交点到新的方位轴在平面上的交点的相对位移值加 offset 偏移值的总和。位移值的符号由传感器局部坐标系中 Z=0 
的平面定义。trackPoint_changed 事件反映了位于此平面表面上的未经箝位的拖曳位置。当指点设备变为不激活且 
autoOffset 为 TRUE 值时,offset将被设置为最后的 translation_changed 
值并且生成一个 offset_changed 事件。autoOffset 域和 offset 域的一般描述见 
20.2.2 拖曳传感器。
当传感器生成一个 isActive TRUE 
事件时,此传感器将独占地获得此指点设备的后续动作事件,直到此指点设备变为不激活并生成一个 isActive FALSE 
事件。在此期间其它指点设备传感器不应生成事件。“拖曳”操作将参照为一个 isActive 值为 TRUE 
时的指点设备的动作。如果使用 2D 指点设备,isActive 事件一般反映此设备相关的主按钮的状态(例如 isActive 为 
TRUE 时表示主按钮按下,为 FALSE 时表示主按钮被释放)。如果使用 3D 指点设备(例如操纵杆),isActive 
事件一般反映指针在传感器的几何体内或和其有接触。
可以设置 minPosition 域和 maxPosition 域,以把从 Z=0 平面原点测得的 translation_changed 的值箝位在一个范围内。如果 minPosition 的 X 或 Y 分量大于 maxPosition 中的相应的分量,则在相应的维度上将不箝位 translation_changed 事件值。如果 minPosition 的 X 或 Y 分量等于 maxPosition 中的相应的分量,则在相应的维度上的分量将被约束到给定的值。这种技巧通过把拖曳的动作映射为一个一维的位移,来提供一种直线传感器的执行方法。
当指点设备激活且移动时,发送 trackPoint_changed 
  事件和 translation_changed 事件。trackPoint_changed 
事件表示未经箝位的位于追踪平面表面上的交点。如果指点设备在激活时被拖离追踪平面(例如拖向在水平线上),浏览器可以以不同的方式解释(限定所有的值到水平面上)。当 isActive 
值为 TRUE 时,每次指点设备的移动都将生成 trackPoint_changed 
  事件和 translation_changed 事件。
此行为的更多细节的描述见 20.2 概念。
SphereSensor : X3DDragSensorNode { 
  SFBool     [in,out] autoOffset         TRUE
  SFString   [in,out] description        ""
  SFBool     [in,out] enabled            TRUE
  SFNode     [in,out] metadata           NULL    [X3DMetadataObject]
  SFRotation [in,out] offset             0 1 0 0 [-1,1],(-∞,∞)
  SFBool     [out]    isActive
  SFBool     [out]    isOver
  SFRotation [out]    rotation_changed
  SFVec3f    [out]    trackPoint_changed
}
SphereSensor(球体传感器)节点映射指点设备的动作为一个绕局部坐标原点的球形的旋转。SphereSensor 使用其父节点的下一层几何体决定是否将生成事件。
enabled 域激活或禁止 SphereSensor 节点。如果其值为 TRUE,传感器将根据用户事件做出适当反应。如果其值为 
FALSE,传感器将不追踪用户输入也不发送事件。如果 enabled 域接收到一个 FALSE 
事件且此时 isActive 为 TRUE,传感器将被禁止且不活动,同时输出一个 isActive
FALSE 事件。如果 enabled 域接收到一个 TRUE 
事件,则传感器开始活动并准备由用户激活。
SphereSensor 节点当指点设备活动且指针指示出了任一个此传感器父组的下一层几何体时生成事件。使用指点设备激活 SphereSensor 的更多细节见 20.2.3 激活与操作指点设备传感器。
激活了指点设备(例如按下鼠标按钮)位于传感器的几何体上时,将发送一个 isActive TRUE 事件。由 SphereSensor 
的几何体上的初始交点和局部坐标系原点定义的矢量决定了虚拟球体的半径,拖曳时后续的指点设备的动作被映射到此虚拟球体上。由此半径和局部原点定义的虚拟球体在用来指示激活时的指点设备的后续动作,而不受传感器活动时的坐标系改变的影响。每个后续的方位轴的位置都将对应地发送一个 
rotation_changed  事件,此事件的值等于相对原始交点的旋转值加 offset 偏移值的总和。trackPoint_changed 
事件反映了此球体表面的未经箝位的拖曳位置。当指点设备变为不激活且 autoOffset 为 TRUE 值时,offset 
将被设置为最后的 rotation_changed 值并且生成一个 offset_changed 事件。 更多细节见 20.2 概念。
当传感器生成一个 isActive TRUE 
事件时,此传感器将独占地获得此指点设备的后续动作事件,直到此指点设备被释放并生成一个 isActive FALSE 
事件。在此期间其它指点设备传感器不应生成事件。拖曳”操作将参照为一个 isActive 值为 TRUE 
时的指点设备的动作。如果使用 2D 指点设备,isActive 事件一般反映此设备相关的主按钮的状态(例如 isActive 为 
TRUE 时表示主按钮按下,为 FALSE 时表示主按钮被释放)。如果使用 3D 指点设备(例如操纵杆),isActive 
事件一般反映指针在传感器的几何体内或和其有接触。
当指点设备激活且移动时,输出 trackPoint_changed 事件和 rotation_changed 事件。trackPoint_changed 
事件表示未经箝位的位于不可见球体表面上的交点。如果指点设备在激活时被拖离球体(例如限定所有的值在球体上并且继续旋转,就象点正被拖离球体那样)。当 
isActive 为 TRUE 时,每次指点设备的移动都将生成 trackPoint_changed 事件和 
rotation_changed 事件。
此行为的更多细节的描述见 20.2 概念。
TouchSensor : X3DTouchSensorNode { 
  SFString [in,out] description         ""
  SFBool   [in,out] enabled             TRUE
  SFNode   [in,out] metadata            NULL [X3DMetadataObject]
  SFVec3f  [out]    hitNormal_changed
  SFVec3f  [out]    hitPoint_changed
  SFVec2f  [out]    hitTexCoord_changed
  SFBool   [out]    isActive
  SFBool   [out]    isOver
  SFTime   [out]    touchTime
}
TouchSensor(接触传感器)节点追踪指点设备的位置和状态,并侦测用户何时指向 TouchSensor 节点父组包含的几何体。通过向其发送值为 TRUE 
或 
  FALSE 的 
  enabled 事件,TouchSensor 节点可以被激活或禁止。如果一个 TouchSensor 
节点被禁止,它将不追踪用户的输入也不发送事件。
当指点设备指向任何的 TouchSensor 的父组的后代的几何节点时,TouchSensor 将生成事件。使用指点设备激活 TouchSensor 的更多细节见 20.2.3 激活与操作指点设备传感器。
isOver 域反映了指点设备是否指向 TouchSensor 节点的几何体。当指点设备改变状态,即从一个其方位轴不与任何 TouchSensor 
节点的几何体相交的位置变动到一个与其几何体相交的位置时,将生成一个 isOver TRUE 
事件。当指点设备改变状态,即从一个其方位轴与其几何体相交的位置变动到一个不再与其几何体相交的位置时,或其它的几何体阻挡在 TouchSensor 
节点的几何体前时,将生成一个 isOver 
  FALSE 事件。这些事件只在指点设备移动并改变是否在其之上的‘over’状态时才生成。当几何体自身动画并移动到指点设备之下时不会生成事件。
当用户把方位轴移动到 TouchSensor 节点的几何体之上时,将决定方位轴和几何体之间的交点(如果存在)。isOver 为 TRUE 
时,每一次指点设备的移动都将生成 hitPoint_changed、hitNormal_changed、hitTexCoord_changed 
事件。hitPoint_changed 事件包含了一个位于其下的几何体表面的 3D 点,这个点将按 TouchSensor 节点的坐标系给定。hitNormal_changed 
事件包含了一个 hitPoint 点的表面法线。hitTexCoord_changed 事件包含了表面上 hitPoint 
点处的纹理坐标。hitTexCoord_changed 事件和 hitNormal_changed  
  事件的值根据相关的形计算。 
如果 isOver 值为 TRUE,用户可以激活指点设备以引发 TouchSensor 节点生成 isActive 
  事件(例如通过按下鼠标主按钮)。当 TouchSensor 生成一个 isActive TRUE 
事件时,此传感器将独占地获得此指点设备的后续动作事件,直到此指点设备被释放并生成一个 isActive FALSE 
事件。在此期间其它指点设备传感器不应生成事件。 拖曳”操作将参照为一个 isActive 值为 TRUE 
时的指点设备的动作。如果使用 2D 指点设备,isActive 事件一般反映此设备相关的主按钮的状态(例如 isActive 为 
TRUE 时表示主按钮按下,为 FALSE 时表示主按钮被释放)。如果使用 3D 指点设备(例如操纵杆),isActive 
事件一般反映指针在 TouchSensor 节点的几何体内或和其有接触。
当以下三个条件都成立时,域 touchTime 生成事件:
TRUE)。TRUE)。FALSE 
    事件)。此行为的更多细节的描述见 20.2 概念。
 20.5 支持级别
20.5 支持级别Pointing Device Sensor 组件提供 表 20.2 中规定的一个支持级别(levels)。
表 20.2 — Pointing device sensor 组件支持级别
| 级别Level | 必备条件 | 节点/特性 | 支持 | 
|---|---|---|---|
| 1 | Core 1 Grouping 1 Shape 1 | ||
| DragSensorNodeType (抽象) | n/a | ||
| PointingDeviceSensorNodeType (抽象) | n/a | ||
| TouchSensorNodeType (抽象) | n/a | ||
| CylinderSensor | 所有域 完全支持 | ||
| PlaneSensor | 所有域 完全支持 | ||
| SphereSensor | 所有域 完全支持 | ||
| TouchSensor | 所有域 完全支持 | 
