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

7 Core component

内核组件

--- X3D separator bar ---

cube 7.1 介绍

7.1.1 名称

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

7.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Core component (内核组件)。Core 组件支持 X3D 运行时系统的基本功能,这些功能包括抽象的基本节点类型、域类型、事件模型、路由表 7.1 列出了这一条款的主要主题。

表 7.1 — 本条款的主题

cube 7.2 概念

7.2.1 内核概述

Core (内核)组件提供了所有 X3D 兼容执行所需要的最小的功能。Core component 提供了以下的抽象架构:

  1. 从抽象类型 X3DField 衍生的 X3D 域类型;
  2. 抽象的基本节点类型,包括 X3DNodeX3DPrototypeInstance
  3. 常用的界面,包括 X3DBindableNode X3DUrlObject
  4. 可以通过脚本的 API(应用程序界面)或外部场景存取的 API 来使用 X3DRoute X3DScene 这样的工具类型;
  5. X3D 事件模型和路由;
  6. 抽象文件结构;
  7. 原型。

Core 组件是构成其它所有 X3D 组件的首要条件。

Core 组件可以支持不同的 层(levels),允许符合 X3D 结构、对象模型、事件模型的不同范围的执行模式。详细的信息参见 4. 概念 Concepts

7.2.2 可绑定子节点

许多 X3D 节点例如 BackgroundTextureBackgroundFogNavigationInfoViewpoint 都是可绑定子节点,这些节点都是由抽象节点类型 X3DBindableNode 衍生而成。这些节点具有一种独特的行为模式,每一类型的节点在同一时刻只有一个节点可以被绑定,这种绑定会影响到用户的体验。浏览器为每种可绑定节点单独维护一个堆栈。每种可绑定节点都包括一个 set_bind inputOnly 域和一个 isBound outputOnly 域。set_bind inputOnly 域用来把给定的节点移到堆栈的顶部或从堆栈中移去。发送到 set_bind inputOnly 域的 TRUE 值将把节点移到堆栈顶部;发送的 FALSE 值将把节点从堆栈顶部移去。当节点发生以下情况的时候将输出 isBound 事件:

  1. 节点被移动到堆栈顶部;
  2. 节点被从堆栈顶部移去;
  3. 节点被另一个放置到堆栈顶部的节点压到堆栈顶以下。

这就是说,当给定节点变为被激活或停止活动时发送 isBound 事件。每个相应类型中,在其堆栈顶部的节点(最近绑定的节点)是活动节点,浏览器根据活动节点来设置场景的状态。如果堆栈为空(例如 X3D 文件中不包含相应类型的可绑定节点或堆栈已经被弹空),则用相应节点类型的缺省值来设置场景的状态。如果一个被实例化(使用 DEF/USE)的可绑定节点被绑定,则结果不确定。

以下描述了<可绑定节点(bindable node)>(包括 Background、Fog、NavigationInfo、Viewpoint)类型的堆栈绑定行为的规则:

  1. 在读取时,第一个遇到的<可绑定节点>将被弹到此<可绑定节点>堆栈的顶部,从而被绑定。Inlines 中包含的节点,或传输到 Browser.createX3DFromString() 方法的字符串中的节点,或传输到 Browser.createX3DFromURL() 方法中的 X3D 文件中的节点(参见 2.[I19775-2]),都不算做最先遇到的 <可绑定节点>。原型实例中的第一个节点可以算作第一个遇到的<可绑定节点>。第一个遇到的<可绑定节点>发送一个 isBound TRUE 事件。
  2. 当一个<可绑定节点>接受到一个 set_bind TRUE 事件时,
    1. 如果节点在堆栈顶端:当前的堆栈顶的节点发送一个 isBound FALSE 事件。新的节点被移到堆栈顶,并变为当前绑定的<可绑定节点>。堆栈顶的新的<可绑定节点>发送一个 isBound TRUE 事件。
    2. 如果节点已经在堆栈顶,则事件不发生影响。
  3. 当一个<可绑定节点>接收到一个 set_bind FALSE 事件时,这个节点将被从堆栈中移除。如果这个节点在堆栈顶,
    1. 这个节点发送一个 isBound FALSE 事件;
    2. 堆栈中的下一个节点变为当前<可绑定节点>,(例如弹到堆栈顶)同时发送 isBound TRUE 事件。
  4. 不在堆栈中的节点将忽略接受到的 set_bind FALSE 事件,同时也不会发送 isBound 事件。
  5. 当堆栈顶的节点被另一个节点替代时,两个节点同时分别发送 isBound FALSE 和 TRUE eventOuts 事件(例如有一个相同的时间辍)。
  6. 如果删除绑定的节点,则产生与其接收到 set_bind FALSE 事件时相同的行为(参见以上 f 条)。

7.2.3 传感器

传感器节点基于对场景图的外部输入产生事件。这包括用户输入,改变视点的环境,网络传输的信息,或系统计时。X3D 定义了以下类型的传感器:

  1. 指点设备传感器 (参见 20, 指点设备传感器组件 Point device sensor component)
  2. 环境传感器 (参见 22, 环境传感器组件 Environmental sensor component)
  3. 键盘设备传感器 (参见 21, 键盘设备传感器组件 Key device sensor component)
  4. 载入传感器 (参见 9, 网络组件 Networking component)
  5. 时间传感器 (参见 8, 时间组件 Time component)

传感器是层级中的子节点,因此可以作为组节点的子节点,参见 10.2.1, 组节点或子节点类型 Grouping and children node types

每种传感器类型都定义何时产生事件。多个传感器产生事件后,场景图的状态 会按顺序根据的每个单个事件做出相应改变。如果多个传感器同时产生事件,而结果是基于事件顺序的,则场景图的状态将不确定

不同类型的传感器之间可能会建立依赖性关系。举例来说,TouchSensor 可能会改变 VisibilitySensor 节点的位移,这种改变可能会影响 VisibilitySensor 节点的可见性状态。在执行时处理这种依赖性的详细描述,参见 4.4.8.3 执行模型 Execution model.

7.2.4 X3D 的抽象结构

7.2.4.1 组织

X3D 场景定义为由一系列的语句序列组织为的一个概念上的文件。文件中第一项是 Header 语句。第二项是 PROFILE 语句。PROFILE 语句后为一个或多个可选的 COMPONENT 语句。文件剩下的部分由 ISO/IEC 19775-1 中此部分定义的其它元素构成。可选的 META 语句紧跟 COMPONENT 语句,当没有 COMPONENT 语句时,可选的 META 语句紧跟 PROFILE 语句。其它的任何语句都要放置在上述的语句之后。

另外由 Inline 节点或使用 createX3DFromStream、createX3DFromString、createX3DFromUrl 载入的场景,其概貌声明的功能需求的, 应该和原来场景中功能需求集相同或更少;例如,这些动态载入的场景,其中的直接的组件申明或其概貌中间接包括的的组件的功能需要,不能超出包含其场景的场景原先申明的概貌和组件中指定的功能需要。

虽然 X3D 场景被描述为包含在一个文件中,但这个文件是概念上的,也可以按照 2.[I19775-2] 中描述的方法在运行时动态的创建。

7.2.4.2 Header 语句

Header 语句是一个包含以下元素的基于编码的语句:

  1. 支持的标准的标识(此标准中为“X3D”);
  2. 支持的字符编码的标识(此标准中为“UTF-8”);
  3. 其它的可以用于此文件的可选地注释。

不管这些信息的实际描述是基于哪种编码格式的,这些信息还是需要存储为可读的文本。

7.2.4.3 PROFILE 语句

每个 X3D 应用都要在其执行的开头声明一个概貌(profile)。这个声明通知浏览器运行此应用所需要的组件及这些组件的支持层,这种机制下浏览器可以选择严格执行某个相应的一致性,并允许浏览器按照需要动态地载入适当的组件。如果 浏览器支持支持概貌和组件组合申明(参见 7.2.4.4 COMPONENT 语句),这个浏览器就可以再现这个场景,否则便失败。

概貌由 PROFILE 语句申明,PROFILE 语句放置在文件头部,紧跟在 Header 语句之后。PROFILE 语句的格式是:

PROFILE <name>  

概貌 <名称>

<name> 是一个不包含空格的字符串。

此标准中定义了以下概貌:

  1. Core (参见 B, Core profile),
  2. Interchange (参见 C, Interchange profile),
  3. Interactive (参见 D, Interactive profile),
  4. MPEG-4 interactive (参见 E, MPEG-4 interactive profile),
  5. Immersive (参见 F, Immersive profile), and
  6. Full (参见 G, Full profile).

7.2.4.4 COMPONENT 语句

X3D 应用中可以明确声明运行这个应用程序所需要的额外的组件(Component)。这个特性用来在预定义的概貌中组合入额外的没有预定义的功能,例如可以在 Immersive 概貌中加入 Humanoid Animation(人性化动画)支持。如果浏览器支持支持概貌和组件组合申明,这个浏览器就可以再现这个场景,否则便失败。

组件由 COMPONENT 语句申明,COMPONENT 语句放置在文件头部,紧跟在 PROFILE 语句之后但放置在其它内容之前。COMPONENT 语句的格式是:

COMPONENT <name> <level>

组件 <名称> <>

<name>  是一个不包含空格的字符串,<level> 是个一正整数。

如果场景的概貌申明中已经间接包含了相应层(level)的组件支持,就不需要再进行单独的组件申明,但还是可以保留组件申明。

7.2.4.5 META 语句

X3D 应用可以通过使用添加一个或多个 META 语句来申明的元数据(metadata),以定义场景相关的信息。这些语句不会影响场景图,只是用来提供一些额外的关于场景的信息。

元数据由 META 语句申明,META 语句放置在文件头部,紧跟在 PROFILE 语句和 COMPONENT 语句之后但放置在其它内容之前。META 语句的格式是:

META <key> <data>                     

<关键词> <数据>

<key> 是用来识别元数据的字符串,<data> 是用来定义相应元数据的值的字符串。

7.3 抽象类型

7.3.1 X3DBindableNode

X3DBindableNode : X3DChildNode {
  SFBool [in]  set_bind
  SFTime [out] bindTime
  SFBool [out] isBound
}

X3DBindableNode 是所有可绑定子节点的抽象基本节点类型,这些节点包括 Background、TextureBackground、Fog、NavigationInfo、Viewpoint。关于可绑定行为的描述参见 7.2.2, 可绑定子节点

7.3.2 X3DNode

X3DNode {
}

X3DNode 是 X3D 系统中所有节点的抽象基本节点类型。

7.3.3 X3DPrototypeInstance

X3DPrototypeInstance : X3DNode {
}

X3DPrototypeInstance 是 X3D 系统中所有节点的原型实例的抽象基本节点类型。任何使用 PROTO 或 EXTERNPROTO 申明的用户定义的节点使用这种类型来实例化。X3DPrototypeInstance 节点可以放置在场景图中允许使用原型实例申明中第一个节点的任何地方。举例来说,如果其中第一个节点的基本类型是 X3DAppearanceNode,这个原型的实例就可以放置在场景图中任何允许使用外观(appearance)节点的位置(例如放置在 Shape 节点中)。

7.3.4 X3DSensorNode

X3DSensorNode  : X3DChildNode {
  SFBool [in,out] enabled;
  SFBool [out]    isActive;
}

X3DSensorNode 是所有传感器的抽象基本节点类型

cube 7.4 节点参考

Core 组件中没有定义具体的节点。

cube 7.5 支持层

Core 组件提供 表 7.2 中规定的三个支持层(Level)。Level 1 的目标是提供严格的 VRML 97 域类型支持、事件模型、路由语法的兼容执行。Level 2 添加了 X3D 的新特性。

表 7.2 — Core 组件支持层


Level
必备条件 节点/特性 支持
1

X3DBindableNode (抽象) n/a
X3DField (抽象) n/a
X3DNode (抽象) n/a
X3DObject (抽象) n/a
X3DPrototypeInstance (抽象) n/a
X3DUrlObject (抽象) n/a
    语句:
  Header
  PROFILE
  COMPONENT
  META
完全支持
域类型 所有域类型,除了以下域类型:
SFVec2d
MFVec2d
SFVec3d
MFVec3d
事件模型 4.4.8, 事件模型 Event Model 中的规格中指定
路由

完全支持

原型 可选支持
2
所有 Level 1 Core 对象 和 Level 1 支持的相同
X3DRoute (抽象) 待定
X3DScene (抽象) 待定
所有域类型 所有域类型
事件模型

和 Level 1 支持的相同

路由 和 Level 1 支持的相同
原型 完全支持
--- X3D separator bar ---