Extensible 3D (X3D) encodings
Part 1: Extensible Markup Language (XML) encoding

4 Concepts

概念

--- X3D separator bar ---

cube 4.1 介绍和内容表

4.1.1 介绍

此条款描述了 ISO/IEC 19776 此部分的关键概念。其中包括如何使用可扩展标记语言(XML - Extensible Markup Language 参见 2.[XML])对 ISO/IEC 19775-1 中定义的 X3D 结构进行编码。

4.1.2 内容表

此条款的内容表见 表 4.1

表 4.1 — 本条款的主题

4.1 介绍和内容表 Introduction and table of contents
   4.1.1 介绍 Introduction
   4.1.2 内容表 Table of contents
   4.1.3 惯例 Conventions used

4.2 概述 Overview
   4.2.1 X3D 文件的结构 The structure of an X3D file
   4.2.2 文件头 Header

4.3 XML 文件语法 XML file syntax
   4.3.1 XML 语法 XML encoding
   4.3.2 语句 Statements
   4.3.3 节点和域语法 Node and Field statement syntax
   4.3.4 DEF 和 USE 属性语法 DEF and USE attribute syntax
   4.3.5 containerField 属性语法 containerField attribute syntax
   4.3.6 class 属性语法 class attribute syntax
   4.3.7 ProtoDeclare 语句语法 ProtoDeclare statement syntax
   4.3.8 IS/connect 语句语法 IS/connect statement syntax
   4.3.9 ExternProtoDeclare 语句语法 ExternProtoDeclare statement syntax
   4.3.10 ProtoInstance 和 fieldValue 语句语法 ProtoInstance and fieldValue statement syntax
   4.3.11 ROUTE 语句语法 ROUTE statement syntax
   4.3.12 IMPORT/EXPORT 语句语法 IMPORT/EXPORT statement syntax

4.4 X3D 文件和万维网X3D files and the World Wide Web
   4.4.1 文件扩展名和 MIME 类型 File extension and MIME type
   4.4.2 脚本语言协议 Scripting language protocols
   4.4.3 X3D XML Schema
   4.4.4 X3D XML Document Type Definition (DTD)

 

  

4.1.3 惯例

在 ISO/IEC 19776 此部分使用以下惯例:

Italics(斜体) 被用于事件名或域名,也用于新引入的术语或引用的方程变量。

fixed-space (等宽)字体用于 URL 网址和源代码范例。ISO/IEC 19776 Classic VRML 编码范例采用 bold, fixed-space(等宽的加粗)字体。

节点类型名首字母大写(例如,“Billboard 节点是一种背景节点...”)。然而在涉及到节点的语义而不是节点本身时,节点的概念通常使用小写(例如,“为了旋转 billboard...”)。

“0xhh” 形式十六进制数为比特位的形势来表示了一个字节。

在 ISO/IEC 19776 的此部分中,以 "x.[ABCD]" 符号来表示参考,此时“x” 表示参考了哪一条款或附件,“[ABCD]”是参考的标题的缩写。例如,2.[ABCD] 涉及 clause 2 (条款 2)中的参考,B.[ABCD] 涉及到 annex B (附件 B) 中的参考。

cube 4.2 概述

可扩展标记语言(Extensible Markup Language - XML)(参见 2.[XML])在这里用作 X3D(Extensible 3D - 可扩展 3D)图形的自验证编码。这种编码提供网络兼容格式,这种格式可以最大地保持和其它网络语言的互操作性。XML 支持结构化数据,和 HTML 类似,XML 对于系统或人都是可读的, 并为了明晰性而冗余编码,XML 表现为一个模块化的技术种类,是和网络技术整合的基础。更多的背景信息参见 [XML10]

抽象的 X3D 场景图元素和 XML 编码结构之间有一种基本的对应关系。这一小节将描述这种对应关系的设计模式。

4.2.1 X3D 文件的结构

X3D 文件(X3D file)结构采用 ISO/IEC 19775-1 的 7.2.3, Abstract X3D structure(参见 2.[I19775-1])中的定义。ISO/IEC 19776 的这部分指定了满足 ISO/IEC 19775-1 规格需要的语法。

4.2.2 文件头

The (header)是一个单行的 UTF-8 文本用以识别此文件为一个 XML 文件,然后为用以识别验证用的 XML DTD 的 XML 声明,然后为包括用以识别验证用的 XML Schema、文件所必需的 X3D概貌和(可选的)额外的组件的 X3D 标签。

为了能简单的识别 X3D 文件,每个 X3D 文件应以一个 XML 文件声明开头(参见 2.[XML])。

<!DOCTYPE X3D PUBLIC "+//Web3D//DTD X3D 3.0//EN"   "http://www.web3d.org/specifications/X3D/x3d-3.0.dtd">
div style="margin-left:25"> <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.0.dtd" "/www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd">

然后跟着的是必须的 X3D 文档根标签(root tag),其中还包括指定的 schema 验证和概貌信息。

和可选择的 DTD 验证一样,2.[SCHEMA] 中定义的根 X3D 标签中的 XML Schema 和 X3D 命名空间(namespaces)也可以用来执行 XML Schema 验证。

<X3D profile='Extensibility' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.web3d.org/specifications/X3D/x3d-3.0.xsd">

在根 X3D 标签中有可选的文件头小节(header section),和必须的场景主体。

<X3D profile='Full'>
<head>
<component name='GeoData'/>
<component name='Nurbs' level='2'/>
<meta name='description' content='X3D scene header and prototype syntax examples. '/>
<meta name='filename' content='X3dHeaderPrototypeSyntaxExamples.x3d'/>
</head>
<Scene>
<!-- Scene graph nodes are added here -->
</Scene>
</X3D>

以上文件头范例指示了此内容是由 XML 编码的,并指示出所需的 Extensibility 概貌和额外组件的详细列表。通过 meta 元标签中的 name="value" 字符串对,X3D 文件头中可以包括更多的语义信息。

浏览器能支持不同的 url 集的规格,以对应写给不同概貌的。这允许播放器支持更高级别的概貌以能选择对应更高级别概貌内容版本。

4.3 XML 文件语法

4.3.1 XML 编码

本条款描述了 XML 编码的可读的 X3D 文件的语法。采用 XML 编码的 X3D 的语法在 ISO/IEC 19776 此部分中介绍。X3D 的语义采用 ISO/IEC 19775-1(参见 2.[I19775-1])中的定义。 解析和处理 XML 编码文档的规则在 2.[XML] 中定义。

两种 X3D 采用的 XML 语法的形式文法的描述位于 Annex A X3D Document Type Definition (DTD)Annex B X3D XML Schema 中。这些文法可由 XML 解析器直接执行。

在 XML 编码中,字符序列 <!-- --> 划定了一个注释。例如:

<!-- This is an X3D comment. -->

例外的情况是 XML CDATA 小节中,在进行 XML 解析时将不考虑其为注释,而一般是只把其作为内嵌的脚本代码。在双引号包括的 SFString 域和 MFString 域中也有例外,这里需要避免注释字符序列被定义为字符串的一部分(使用 &lt; 代替 < 并使用 &gt; 代替 >)。

属性值可以由配对的单引号(')或(")字符来界定。因为 XML 处理器被允许独立地选择任一的形式,作者和解析器将不能确定会遇到哪种配对类型的界定字符。这个规则在 2.[XML]2.[INFOSET] 中描述。

XML 元素(例如 X3D 节点)可以不出现在属性值之内。

XML 属性值之外出现的空格、跳格符、换行符、回车符是分割符。当出现在 XML 元素和属性值中的时候,逗号是不可省略的空白符。

XML 属性值之内的规则略微不同。XML 属性值之内的逗号、空格、跳格符、换行符、回车符都是分割符。分隔符和注释统称为空白符(whitespace)。

域、事件、PROTO、EXTERNPROTO 和节点的名称不应该包括控制符(0x0 至 0x1f、0x7f)、空格(0x20)、单引号和双引号(0x22:"、0x27:')、升半音符(0x23:#)、逗号(0x2c:,)、句号(0x2e:.)、括号(0x5b、0x5d:[])、反斜杠(0x5c:\)、大括号(0x7b、0x7d:{})。另外名称的首字符不能为数字(0x30 至 0x39)、加号(0x2b:+)、减号(0x2d:-)。除此之外,名称中可以包含使用 UTF-8 编码的任意的 ISO 10646 字符。X3D 是大小写敏感的;例如“Sphere”和“sphere”是不同的,“BEGIN”"和“begin”也是不同的。

为了保持不同编码的 X3D 场景之间的互通的可译性,以下保留的关键词,不能用作域、事件、原型、节点的名称:

4.3.2 语句

X3D 文件中应包含:首先是必须的 XML 文件头和 <X3D> 文档根标签,随后是以下内容的任意组合:

  1. 单一的可选的  head 元素,其中可以包括组件和元数据信息(as described 4.3.1 XML encoding);
  2. 单一的必须的 Scene 元素,Scene 元素作用为一个根节点并包含一个或多个场景图元素(规格定义见 2.[I19775] 中的 4.4.1 Root nodes);
  3. 任意数量的 ProtoDeclare 元素或 ExternProtoDeclare 元素(规格定义见 2.[I19775] 中的 4.8 Prototype semantics );
  4. 任意数量的节点元素(规格定义见 2.[I19775] 中的 4.3.3 Scene graph hierarchy );
  5. 任意数量的 USE 语句(规格定义见 2.[I19775] 中的 4.6.2 DEF/USE semantics );
  6. 任意数量的 ROUTE 语句(规格定义见 2.[I19775] 中的 4.10.2 Route semantics );
  7. 任意数量的 IMPORT 语句或 EXPORT 语句(规格定义见 2.[I19775] 中的 4.4.5 IMPORT/EXPORT semantics )。

4.3.3 节点和域语句语法

X3D 节点(nodes) 被表示为 XML 元素(element),例如为带标签的名称。

简单的非节点的 X3D 域(field)被表示为 XML 属性(attributes),例如 name="value" (域名 = "值")字符串对。

作用为其它 X3D 节点的域(fields)的节点被表示为被包含的 XML 元素,例如附加的带标签的名称。

节点语句由节点元素的类型名和其后简单域属性组成。节点实例可以被附一个标记,此时需使用一个开口标签和一个由斜杠 / 与先前定义的元素名组成的结束标签。

以下的范例介绍了节点和域语句语法的用法:

<Group DEF='ExampleChildElement'>
<Shape>
<Box/>
<Appearance>
<Material diffuseColor='0.6 0.4 0.2'/>
</Appearance>
</Shape>
</Group>

另外,如果没有子节点被包含为更深一层的元素,可以由 /> 字符来结束单一元素,同时忽略结束标签。例如:

<Viewpoint DEF='ExampleSingleElement' description='Hello syntax'/>
<NavigationInfo type='EXAMINE ANY'/>

对于每一种节点类型,节点元素都包含相应的零个或多个域属性。当节点主体镶套在 ProtoDeclare ProtoBody 中时,可选以单一的 IS 语句开头,然后依次包含一个或多个语句以及这些语句还可包括的一个或多个 connect 语句、一个节点和其后包含零个或多个子节点、ROUTE 语句、ProtoDeclare 语句或 ExternProtoDeclare 语句。这些被包含的节点和语句被允许是每种合适的节点类型,并允许以任何顺序出现。

节点名和 attribute="value" 字符串对之间应使用空白符来分割,但包裹节点主体的标签前后并不必须使用空白符。

基于 XML 的场景可以使用 X3D SchemaX3D DTD(Document Type Definition - 文档类型定义)来执行验证父子节点之间关系的正确性。Schema 和 DTD 也定义了匹配抽象规格的属性域的缺省值。每种节点类型的 XML 编码规格参见 6 Encoding of nodes

4.3.4 DEF 和 USE 属性语法

USE 属性说明一个节点是另一个有相同 ID 的 DEF 节点的参考副本。DEF 是一个已分配的 XML 类型 IDUSE 是一个已分配的 XML 类型 IDREF。这里应用符合 XML 中同样的命名构造惯例的合法字符组合。

场景中的每个 DEF(ID)值应为唯一的。ProtoDeclare 定义的主体中的非唯一的节点 DEF 名在由 X3D DTD 或 Schema 检验时将导致验证错误。这时一个 XML 的限制,因为每个 XML DTD 和 Schema 都要求每种 ID 类型只有单一的命名空间。

下面是前述语句的范例:

<Transform DEF='ExampleUSE' rotation='0 1 0 0.78' translation='0 2.5 0'>
<Group USE='ExampleChildElement'/>
</Transform>

包含 USE="someName" 属性的节点,除了 containerFieldclass将不能再包括其它属性。

4.3.5 containerField 属性语法

每种节点类型都定义了此节点类型可包括的域的名称和类型。一般根据 X3D 中的定义完善父 - 子节点关系,大多的域 - 节点的关系也都是明确的。

为了紧缩 X3D 的 XML 编码中的标签集,包含每个节点的域的名称一般由 containerField 属性说明。例如,传感器节点一般由组节点的 children 域包含,因此每个传感器节点都有一个缺省值为 containerField='children' 的属性。

一般 containerField 值可以被忽略。当需要表示与给定节点的父节点的不同的关系时,给定的缺省 containerField 值时可以被替代。例如:

<Collision>
<Shape containerField='proxy'>
<Sphere/>
</Shape>
<Group USE='ExampleChildElement'/>
</Collision>

4.3.6 class 属性语法

class 属性保留为将来的 XML CSS(Cascading Style Sheets -级联样式表)使用(参见 [CSS])。

4.3.7 原型和域声明语法

原型声明构成包括 ProtoDeclare 关键字、其后 ProtoInterface 的依次的原型名称属性、可选的原型界面域声明、和 ProtoBody 中包括的必须的原型主体。

原型域语句构成包括 field 关键字,和其后任意顺序的 name(名称)、域 type(类型)、域 accessType(存取类型,值为 inputOnly、或 outputOnly、或 initializeOnly、或 inputOutput)的属性值。

以下是原型声明范例(不包括或包括相应的域声明):

<ProtoDeclare name='NewWorldInfoNode'>
<ProtoBody>
<WorldInfo DEF='ExamplePrototypeBody'/>
</ProtoBody>
</ProtoDeclare>

<ProtoDeclare name='EmissiveMaterial'>
<ProtoInterface>
<field name='onlyColor' type='MFColor' accessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<!-- Override default diffuseColor value 0.8 0.8 0.8 -->
<Material diffuseColor='0 0 0'>
<!-- Connect emissiveColor field of current node to onlyColor field of parent ProtoDeclare. -->
<IS>
<connect nodeField='emissiveColor' protoField='onlyColor'/>
</IS>
</Material>
</ProtoBody>
</ProtoDeclare>

当 field 的 accessType initializeOnlyinputOutput 值,语句也包括域的缺省值。简单值被包含在 value 属性中(例如 value='true')节点(或节点组)的值被包括为 field 域声明的子节点。例如以下范例中 <Group DEF='DefaultNodeValue'/> 提供了 ProtoDeclare 主体中 children 域的缺省的初始值:

<ProtoDeclare name='ShiftGroupUp2m'>
<ProtoInterface>
<field name='children' type='MFNode' accessType='inputOutput'>
<Group DEF='DefaultNodeValue' bboxSize='2 2 2'/>
</field>
</ProtoInterface>
<ProtoBody>
<Transform translation='0 2 0'>
<Group>
<IS>
<connect nodeField='children' protoField='children'/>
</IS>
</Group>
</Transform>
</ProtoBody>
</ProtoDeclare>

同样域的名称可以用在多个节点原型中。

每种节点类型的 XML 域类型的编码规格参见 5 Encoding of fields

4.3.8 IS/connect 语句语法

原型定义中节点语句的主体可以包括一个单一的 <IS> 语句, <IS> 语句其中还可以依次包括一个或多个 <connect> 语句。每个 <connect> 语句由一个父节点的界面中的域名相关的 nodeField 属性和其后的一个祖 ProtoDeclare 中域名相关的 protoField 属性组成。

每个 field typeaccessType 必须严格的匹配。这些 nodeFieldprotoField 名称可以被重复载入,例如由于属于不同的命名空间,这两个名称可以相同。

IS/connect 构造的用法参见前面的原型声明范例。

原型语句的细节参见 ISO/IEC 19775-1 中的 4.4.4 Prototype semantics(参见 2.[I19775])。

4.3.9 ExternProtoDeclare 语句语法

ExternProtoDeclare 语句的构成包括:ExternProtoDeclare 元素、引用的原型的 name 属性、包括此原型定义的场景的单个或多个 url 网址、零个或多个包含以提供原型界面的 field 定义。

包含的域语句构成包括 field 关键字,和其后任意顺序的 name(名称)、域 type(类型)、域 accessType(存取类型,值为 inputOnly、或 outputOnly、或 initializeOnly、或 inputOutput)的属性值。

url 值是“引号界定”的本地文件名或远程网址。每个文件名或网址应附有 # 打击符,其后是大小写敏感的外部定义的原型节点的名称。(此 url 语法和 HTML 书签或 X3D Anchor 视点链接相似。)

以下是外部原型声明范例:

<ExternProtoDeclare name='ViewPositionOrientation' nodeType='Viewpoint' url='"ViewPositionOrientationPrototype.wrl#ViewPositionOrientation" "http://web.nps.navy.mil/~brutzman/Savage/Tools/Authoring/ViewPositionOrientationPrototype.wrl#ViewPositionOrientation" "ViewPositionOrientationPrototype.x3d#ViewPositionOrientation" "http://web.nps.navy.mil/~brutzman/Savage/Tools/Authoring/ViewPositionOrientationPrototype.x3d#ViewPositionOrientation"'>
<field name='enabled' type='Boolean' accessType='exposedField'/>
</ExternProtoDeclare>

外部原型语句的细节参见 ISO/IEC 19775-1 中的 4.4.5 External prototype semantics (参见 2.[I19775])。

4.3.10 ProtoInstance 和 fieldValue 语句语法

ProtoInstance 元素用来创建节点的实例,这个节点必须在前面的场景中使用 ProtoDeclare 语句或 ExternProtoDeclare 语句定义过。

ProtoInstance 可以包括零个或多个 fieldValue 元素,以用来提供相应的的 ProtoDeclare 语句或 ExternProtoDeclare 语句中预定义的域的初始值。这些 fieldValue 初始化只适用于 accesstypeinitializeOnlyinputOutput 的域定义。

以下是范例:

<Transform translation='0 -2.5 0'>
<Shape>
<Appearance>
<ProtoInstance name='EmissiveMaterial'>
<fieldValue name='onlyColor' value='0.2 0.6 0.6'/>
</ProtoInstance>
</Appearance>
<Text string='"Prototype syntax" "examples"'>
<FontStyle justify='MIDDLE MIDDLE'/>
</Text>
</Shape>
</Transform>

<ProtoInstance name='ViewPositionOrientation'>
<fieldValue name='enabled' value='true'/>
</ProtoInstance>

4.3.11 ROUTE 语句语法

ROUTE 语句由 ROUTE 元素、和其后的 fromNodefromFieldtoNodetoField 属性构成。fromNodetoNode 属性为 XML 类型 IDREF,这意味着相应的 DEF 值必须在上文的节点中出现。

重要的语义限制:

以下范例说明了 ROUTE 语句的语法:

<TimeSensor DEF='Clock' cycleInterval='4' loop='true'/>
<OrientationInterpolator DEF='Spinner' key='0 0.5 1' keyValue='0 1 0 0,0 1 0 3.1416, 0 1 0 6.2832'/>
<ROUTE fromNode='Clock' fromField='fraction' toNode='Spinner' toField='set_fraction'/>
<ROUTE fromNode='Spinner' fromField='value_changed' toNode='TransformExampleUSE' toField='rotation'/>

此条款中介绍的 X3dHeaderPrototypeSyntaxExamples.x3d 的完整范例可在 Annex C Examples 中得到。

4.3.12 IMPORT/EXPORT 语句语法

以下 XML 语法用于 X3D 的 IMPORT/EXPORT 功能。

[A description of how IMPORT and EXPORT statements are encoded is needed prior to the example.]

IMPORT 语句的编码范例:

<Inline DEF='I1' url='"someUrl.x3d"'/> 
<IMPORT InlineDEF='I1' exportedDEF='rootTransform' AS='I1Root'/> 
<PositionInterpolator DEF='PI'/> 
<ROUTE fromNode='PI' fromField='value_changed' toNode='I1Root' toField='set_translation'/> 

EXPORT  语句的编码范例:

<Transform DEF='T1'/> 
<EXPORT localDEF='T1' AS='rootTransform'/>

cube 4.4 XML 编码的 X3D 文件和万维网

4.4.1 文件扩展名和 MIME 类型

XML 编码的 X3D 文件扩展名为 .x3d(表示 Extensible 3D - 可扩展 3D)。

[preliminary draft]

[MIME] (Multipart Internet Mail Extensions - 多部分的网络邮件扩展)原来是设计用来分发电子邮件附件的。MIME 类型通知客户文件中包含何种数据以使其可以被适当的解码并处理。对于本机,这可以由简单的由文件扩展名代替。然而在网络服务器的前后处理关系中,首先发送的是单行的不包括在文档源中的 MIME 类型。每个网络服务器都为每种文件扩展名设置了一种关联的可发送到客户的文档 MIME 类型。网络浏览器也可以维护这样一个列表以决定采用何种插件或应用程序来显示相应内容。

4.4.2 脚本语言协议

Script 脚本节点的 url 域可以支持不同的脚本语言所使用的定制协议。例如以 ecmascript 为前缀的脚本 url 应包括 ECMAScript 元代码,此时可以在字符串中使用行终止符。每种语言协议 ISO/IEC 19777 中对应相应语言的部分(参见 2.[I19777])中有详细定义。以下例子说明在单个 url 域中混合使用定制协议和标准协议的用法(先后顺序决定优先权):

[show examples, including discussion of enclosed CDATA as preferred form of containing script code.]

4.4.3 X3D XML Schema

X3D Schema 在 Annex A—X3D XML Schmea 中定义。

4.4.4 X3D XML 文档类型定义(DTD - Document Type Definition)

X3D DTD 在 Annex BX3D XML Document Type Definition (DTD) 中定义。

--- X3D separator bar ---