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

10 Grouping component

组组件

--- X3D separator bar ---

cube 10.1 介绍

10.1.1 名称

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

10.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Grouping component(组组件)。其中说明了如何把节点组织为组以建立 X3D 场景图的变换层级。表 10.1 列出了这一条款的主要主题。

表 10.1 — 本条款的主题

cube 10.2 概念

10.2.1 组和子节点类型

组节点有一个包含子节点列表的域。每一个组节点都为其子节点定义了一个坐标空间。这个坐标空间是相对与其组节点的子层级的坐标空间存在的。这样的节点被称为父(parent)节点。这意味着将随着场景图层级的深入而累积。

ISO/IEC 19775 此部分定义了一些组节点,包括以下的:

其它的组件可以添加到组节点类型的列表中。

表 10.2 中的是可以作为子节点(children)使用的节点类型:

表 10.2 — 有效的子节点

可以添加其它的组件以添加可以使用的子节点类型。

表 10.3 中的是不可以作为子节点(children)使用的节点类型:

表 10.2 — 无效的子节点

可以添加其它的组件以添加不可以使用的子节点类型。

除了 GeoLODInlineLODSwitch 节点,其它所有的组节点都有 addChildren inputOnly 域和 removeChildren inputOnly 域。addChildren 事件将向组节点的 children 域添加节点。传递给 addChildren inputOnly 域的节点,如果已经在组节点的 children 列表中出现,则忽略。举例来说,如果 children 域包含了节点 Q、L、S (按顺序),并且组节点接受到一个 addChildren 事件,此事件包含了(按顺序)节点A、L、Z,则 children 域的结果包含(按顺序)节点 Q、L、S、A、Z。

removeChildren 事件将从组节点的 children 域中移除节点。removeChildren 事件中的节点,如果不包括在组节点的 children 列表中,则忽略。举例来说,如果 children 域包含了节点 Q、L、S、A、Z(按顺序),并且组节点接受到一个 removeChildren 此事件包含了节点A、L、Z,则 children 域的结果为 Q、S。

注意很多节点类型都通过域来引用其它的节点类型。其中一些是父 - 子关系,而另一些不是(其语法由节点指定)。表 10.4 列出了所有通过域来引用其它的节点类型的节点类型。

所有的组节点应该有一个 MFNode 类型的 children 域。添加到 children 域的节点将被添加到组节点的 children 集中。如果添加到组节点 children 域的节点已经包含在组节点的子列表中,则为非法。如果添加到组节点 children 域的节点是其组节点的祖先,则为非法。 

很多节点类型都通过域来引用其它的节点类型。其中一些是父 - 子关系(例如  Transform 节点的 children 域),而而另一些不是(例如 Shape 节点的 appearance 域 node)。域类型指定了其中可以放置的节点类型。举例来说,Transform 节点的 children 域的节点类型是 MFNode,这里所有的节点都必须是由 ChildNodeType 衍生的。因此,只有只有由 ChildNodeType 衍生的节点类型才能放置于此。Shape 放置于 children 域就是合法的,因为它是从 ChildNodeType 衍生的,而 Appearance 就不能放置在同样的位置。完整的词源层级参见 4.4.2.3 对象层级 Object hierarchy

可以使用扩展机制定义新的节点类型。只要这个节点域的类型在一个新类型的词源层级中,这些新的节点类型可以被放置在一个节点的域中。

表 10.4 — 包含 SFNode 域或 MFNode 域的节点

节点类型 此域中的有效子节点类型
Anchor children 有效的子节点
Appearance material Material
texture ImageTexture, MovieTexture, Pixel Texture
Billboard children 有效的子节点
Collision children 有效的子节点
CoordinateDeformer children 有效的子节点
inputCoord Coordinate
inputTransform Transform
outputCoord Coordinate
ElevationGrid color Color
normal Normal
texCoord TextureCoordinate
GeoCoordinate geoOrigin GeoOrigin
GeoElevationGrid geoOrigin GeoOrigin
color Color
normal Normal
texCoord TextureCoordinate
GeoLocation geoOrigin GeoOrigin
children 有效的子节点
GeoLOD geoOrigin GeoOrigin
rootNode 有效的子节点
GeoMetadata data 有效的子节点
GeoPositionInterpolator geoOrigin GeoOrigin
GeoTouchSensor geoOrigin GeoOrigin
GeoViewpoint geoOrigin GeoOrigin
Group children 有效的子节点
IndexedFaceSet color Color
coord Coordinate, GeoCoordinate
normal Normal
texCoord TextureCoordinate
IndexedLineSet color Color
coord Coordinate, GeoCoordinate
LOD level 有效的子节点
NurbsGroup children
NurbsSurface texCoord TextureCoordinate, NurbsSurfaceTextureCoordinate
PointSet color Color
coord Coordinate, GeoCoordinate
Shape appearance Appearance
geometry Box, Cone, Cylinder, ElevationGrid, Extrusion, GeoElevationGrid, IndexedFaceSet, IndexedLineSet, NurbsCurve, NurbsSurface, PointSet, Sphere, Text, TrimmedSurface
Sound source AudioClip, MovieTexture
Switch choice 有效的子节点
Text fontStyle FontStyle
Transform children 有效的子节点

10.2.2 边界盒

一些节点类型包括由 bboxSize 域和 bboxCenter 域指定的边界盒。边界盒是一个尺寸为 bboxSize,中心位于局部坐标系的 bboxCenter 的长方体。一般组节点使用边界盒来提示浏览器这个组的大约的尺寸,以进行剔除优化。缺省的边界盒的尺寸是 (-1, -1, -1),说明用户没有指定边界盒,效果将等同于指定一个无穷大的边界盒。bboxSize 值 (0, 0, 0) 是有效的,此时表现为空间中的一个点(例如一个无穷小的盒子)。指定的 bboxSize 域值应该 >= 0.0 或等于 (-1, -1, -1)。bboxCenter 域指定了相对局部坐标系的位移。

bboxCenter 域和 bboxSize 域可以用来指定组节点中的对象的最大可能的边界盒(例如 Transform)。这些将被用来作为某种优化的提示,例如决定此组是否需要被绘制。边界盒应该足够大,以保证在任何时候都能包裹下组节点及其子节点的边界盒的并集;也不应包括任何由此组自身执行的变换(例如,边界盒被定义在其子节点的局部坐标系中)。如果指定的边界盒比组的实际边界盒小,则结果不确定。

cube 10.3 抽象类型

10.3.1 X3DBoundedObject

X3DBoundedObject : X3DObject { 
  SFVec3f [] bboxCenter 0 0 0    (-∞,∞)
  SFVec3f [] bboxSize   -1 -1 -1 (0,∞)
}

这个抽象节点类型是所有指定有边界定义部分的节点类型的基础。

bboxCenter 域和 bboxSize 域 指定了一个包裹组节点的子节点的边界盒。这是一个可以用作优化目的的提示。如果指定的边界盒在某一时间中比其子节点的实际边界盒小,则结果不确定。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。关于 bboxCenter 域和 bboxSize 域的详细描述包括在 10.2.2, 边界盒 中。

10.3.2 X3DChildNode

X3DChildNode : X3DNode { 
}

这个抽象节点类型象征所有的可以在 children、addChildren、removeChildren 域中用来实例化的具体节点类型。

更详细的关于 children 、addChildren 域、removeChildren 域和 eventIn 事件的描述参见 10.2.1, 组和子节点类型

10.3.3 X3DGroupingNode

X3DGroupingNode : X3DChildNode { 
  MFNode [in]     addChildren
  MFNode [in]     removeChildren
  MFNode [in,out] children        [] [X3DChildNode]
}

从这个抽象节点类型衍生的所有的具体节点类型,都可以包含子节点并作为所有集合的基础。

更详细的关于 children 、addChildren 域、removeChildren 域和 eventIn 事件的描述参见 10.2.1, 组和子节点类型

10.3.4 X3DInfoNode

X3DInfoNode : X3DChildNode { 
}

这是所有只包含信息语法而不包含视觉效果语法的节点的基本节点类型。

cube 10.4 节点参考

10.4.1 Group

Group : X3DGroupingNode, X3DBoundedObject {
  MFNode  [in]     addChildren             [X3DChildNode]
  MFNode  [in]     removeChildren          [X3DChildNode]
  MFNode  [in,out] children       []       [X3DChildNode]
  SFVec3f []       bboxCenter     0 0 0    (-∞,∞)
  SFVec3f []       bboxSize       -1 -1 -1 (0,∞) or -1 -1 -1
}

Group 节点包含子节点,但不引入新的变换。它等同于包含一个恒等变换的 Transform 节点。

更详细的关于 children 、addChildren 域、removeChildren 域和 eventIn 事件的描述参见 10.2.1, 组和子节点类型

bboxCenter 域和 bboxSize 域 指定了一个包裹 Group 节点的子节点的边界盒。这是一个可以用作优化目的的提示。如果指定的边界盒在某一时间中比其子节点的实际边界盒小,则结果不确定。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。关于 bboxCenter 域和 bboxSize 域的详细描述包括在 10.2.2, 边界盒 中。

10.4.2 StaticGroup

StaticGroup : X3DChildNode, X3DBoundedObject {
  MFNode  [] children   []       [X3DChildNode]
  SFVec3f [] bboxCenter 0 0      (-∞,∞)
  SFVec3f [] bboxSize   -1 -1 -1 (0,∞) or -1 -1 -1
}

StaticGroup 节点包含不能修改的子节点。StaticGroup 的子保证不会改变,不会发送或接受事件,也不包含任何此 StaticGroup 节点之外的 USE 引用。这允许浏览器对此部分内容进行优化以更快地渲染并使用更少的内存。

浏览器应该阻止任何对 StaticGroup 及其子节点的非法的修改。StaticGroup 的子节点应该保证不产生事件。

在 StaticGroup 中可以自由的重新安排节点或移除节点,只需要保证最终的渲染效果相同。这些优化可以包括把一系列的变换转换为一个单一的变换,或者对场景图进行深度地分优化以尽量提高渲染速度。因为在其创建时刻之后就不能再被存取,所以 StaticGroup 不需要保留其子节点的 VRML 表示法(例如域数据结构)。

10.4.3 Switch

Switch : X3DGroupingNode, X3DBoundedObject {
  MFNode  [in]     addChildren             [X3DChildNode]
  MFNode  [in]     removeChildren          [X3DChildNode]
  MFNode  [in,out] children       []       [X3DChildNode]
  SFInt32 [in,out] whichChoice    -1       [-1,∞)
  SFVec3f []       bboxCenter     0 0 0    (-∞,∞)
  SFVec3f []       bboxSize       -1 -1 -1 (0,∞) or -1 -1 -1
}

Switch 组节点遍历 children 域中指定的一个节点,或也可不遍历任何节点。

10.2.1, 组和子节点类型 中详细描述了 children 域中可以使用的合法的节点类型。

whichChoice 域指定了游历的子的索引,其中第一个子的索引为 0。如果 whichChoice 小于 0 或大于 children 域中的索引数 field,则不选择任何子。

不管 whichChoice 的值为何,Switch 之下的所有子节点都持续接受和发送事件。例如,如果一个 Switch 节点包含的一个没有选中的子节点,这个子节点中有一个活动的 TimeSensor,则这个 TimeSensor 不管 Switch 的选择状态如何都将发送事件。

bboxCenter 域和 bboxSize 域 指定了一个包裹 Switch 节点的子节点的边界盒。这是一个可以用作优化目的的提示。如果指定的边界盒在某一时间中比其子节点的实际边界盒小,则结果不确定。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。关于 bboxCenter 域和 bboxSize 域的详细描述包括在 10.2.2, 边界盒 中。

10.4.4 Transform

Transform : X3DGroupingNode, X3DBoundedObject {
  MFNode     [in]     addChildren               [X3DChildNode]
  MFNode     [in]     removeChildren            [X3DChildNode]
  SFVec3f    [in,out] center           0 0 0    (-∞,∞)
  MFNode     [in,out] children         []       [X3DChildNode]
  SFRotation [in,out] rotation         0 0 1 0  [-1,1] or (-∞,∞)
  SFVec3f    [in,out] scale            1 1 1    (0,∞)
  SFRotation [in,out] scaleOrientation 0 0 1 0  [-1,1] or (-∞,∞)
  SFVec3f    [in,out] translation      0 0 0    (-∞,∞)
  SFVec3f    []       bboxCenter       0 0 0    (-∞,∞)
  SFVec3f    []       bboxSize         -1 -1 -1 (0,∞) or -1 -1 -1
}

Transform 节点是一个组节点,它为其子定义了一个相对于其祖先坐标系的相对坐标系。详细的坐标系和变换的描述参见 4.3.5, 变换层级 Transformation hierarchy, and 4.3.6, 标准单位和坐标系 Standard units and coordinate system

更详细的关于 children 、addChildren 域、removeChildren 域和 eventIn 事件的描述参见 10.2.1, 组和子节点类型

bboxCenter 域和 bboxSize 域 指定了一个包裹 Transform 节点的子节点的边界盒。这是一个可以用作优化目的的提示。如果指定的边界盒在某一时间中比其子节点的实际边界盒小,则结果不确定。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。边界盒应该足够大,以保证在任何时候都能包裹下组节点及其子节点的边界盒的并集;也不应包括任何由此组自身执行的变换(例如,边界盒被定义在其子节点的局部坐标系中)。如果指定的边界盒比组的实际边界盒小,则结果不确定。关于 bboxCenter 域和 bboxSize 域的详细描述包括在 10.2.2, 边界盒 中。

translation、rotation、scale、scaleOrientation、center 域定义了一个三维的几何变换,这个变换由以下变换构成(依次):

  1. 沿任一点的非均匀缩放(也可能均匀缩放);
  2. 沿任一点和任一轴的旋转;
  3. 平移。

center 域指定了一个相对局部坐标系原点 (0,0,0) 的偏移。rotation 域指定一个坐标系的旋转。scale 域指定了一个坐标系的非一致缩放。scale 值应大于 0scaleOrientation 域指定了缩放前的坐标系统的旋转(以指定任意方向的缩放)。scaleOrientation 只应用于缩放操作。translation 域值指定一个坐标系的平移。

假定有一个三维点 P 和一个 Transform 节点,P 在其父坐标系中,通过一系列中间变换,变换到点 P'。在变换矩阵表示中,其中 C (center)、SR (scaleOrientation)、T (translation)、R (rotation)、S (scale) 分别为相应的等价变换矩阵,

  P' = T * C * R * SR * S * -SR * -C * P

以下的 Transform 节点:

Transform {
  center           C
  rotation         R
  scale            S
  scaleOrientation SR
  translation      T
  children         [...]
}

等同于这个镶套序列:

Transform {
  translation T 
  children Transform {
    translation C
    children Transform {
      rotation R
      children Transform {
        rotation SR 
        children Transform {
          scale S 
          children Transform {
            rotation -SR 
            children Transform {
              translation -C
              children [...]
}}}}}}}

10.4.5 WorldInfo

WorldInfo : X3DInfoNode { 
  MFString [] info  []
  SFString [] title ""
}

WorldInfo 节点包含关于场景的信息。这个节点之提供文档信息而不包括场景的视觉外观或行为。title 域用于存储场景的名称或标题,浏览器可以把这些呈现给用户(可以在窗口边界中)。其它关于场景的信息可以存储在 info 域中,例如作者信息、版权、使用说明等。

cube 10.5 支持级别

Grouping 组件提供 表 10.5 中规定的四个支持级别(levels)。

表 10.5 — Grouping 组件支持级别

级别Level 必备条件 节点 支持
1 Core 1
X3DChildNode (抽象) n/a
X3DBoundedObject (抽象) n/a
X3DGroupingNode (抽象) n/a
    X3DInfoNode
(抽象)
n/a
Group addChildren 可选支持。removeChildren 可选支持。其它的和所有组相同。
Transform addChildren 可选支持。 removeChildren 可选支持。 其它的和所有组相同。
WorldInfo 忽略 info、title
2 Core 1
Level 1 的所有组节点 所有域的完全支持。
Switch 所有域
3

Core 1

Level 2 的所有组节点 所有域
StaticGroup 所有域
--- X3D separator bar --- Site Meter