介绍
虚拟现实建模语言 (VRML) 是在 1990 年代中期创建的,作为一种将 3D 场景放在网页上的格式。1997 年,设计了该格式的第二个版本,并由 ISO 对其进行了标准化。但它并没有得到广泛使用,因为当时带宽非常有限。在 2000 年代初期,VRML 的继任者 X3D(代表可扩展 3D 图形)发布,其目标是在 Web 上集成 3D 图形。它的规范从那时起不断发展,因此 X3D 现在的范围比以前的 VRML 更大,支持在 3D 图形管道中可获得的各种效果。
尽管在将 3D 图形集成到网页中的格式采用缓慢,VRML 和 X3D 已被广泛用作网格模型的中性交换格式,特别是使用 CAD 软件创建的模型。这是因为这两种格式都是开放的且功能丰富。
技术细节
VRML 和 X3D 的关系非常密切。这两种格式的模型通常用文本文件表示。它们由节点组成,每个节点都携带有关模型的某种类型的信息,例如几何形状、位置、外观、模型结构等。 VRML 具有独特的语法(见图 1),它是从Silicon Graphics 的 Open Inventor 软件的数据模型。另一方面,X3D 通常是用 XML 编写的(见图 2)。尽管图 1 和图 2 是从不同的模型创建的,但人们可以很容易地看到节点类型和节点所具有的字段的相似性。这两种格式还有其他持久性形式(gzip 压缩用于 VRML 和 X3D,类似 VRML 和二进制仅用于 X3D),但它们不像下面描述的主要形式那么常见。

图 1. VRML 文件的典型内容

图 2. X3D 文件的典型内容
长处和短处
VRML 和 X3D 具有广泛的功能。自然地,它们都支持 3D 多边形几何(面集和线集)、材料和纹理。网格被索引,这意味着它们的拓扑结构可以保持完整(与STL不同),它们可以包括任意多边形(不仅仅是三角形)并且它们可以携带所有重要属性 - 顶点法线、顶点颜色和纹理坐标。支持 LOD,并且能够定义模型的层次结构并将转换附加到其部分。此外,X3D 提供了以键值对的形式存储元数据的能力。在涉及中性交换格式时,这已经满足了很多要求。当人们考虑网状数据交换时,没有什么可要求的。
但是 VRML 和 X3D 的设计意图是描述虚拟交互世界。交互式世界不仅仅是 3D 几何、结构和元数据,因此 VRML 还提供了一些功能,例如设置观看者头像的属性、基于关键帧的动画、照明、音频引用、事件系统和支持脚本以最大限度地提高交互性。X3D 走得更远,支持着色器、粒子效果、体积渲染和刚体物理。当考虑 3D 图形工作流程时,它恰好使用 CAD 模型作为资产,这是一个非常好的价值主张。图 3 说明了一些可以在 VRML 和 X3D 中编码的基本交互功能。

图 3.1。X3D 场景中的交互示例。动画中的颜色变化平滑。
图 3.2。X3D 场景中的交互示例。立方体在单击时旋转 1 圈。
图 3.3。X3D 场景中的交互示例。直升机叶片在咔嗒声时无限旋转。
由于 VRML 用于 CAD 数据交换,X3D 也试图扩展这种方式,并且它丰富了特定于计算机辅助设计领域的功能,例如对 NURBS 的支持和使用 CAD 术语指定模型元素的机制装配体、零件和面。诚然,这些功能并不符合成熟的 B-Rep 数据模型的要求,而更像是一种使用 CAD 语义增强网格和节点的工具。
VRML 和 X3D 都有一个简洁的系统,其中模型的某个部分可以用 DEF 语句标识,然后用 USE 语句多次实例化,有点像宏。每个 USE 语句仅包含一个 DEF 的名称,从而通过重用对象定义来减少文件大小。与此类似的另一种机制是原型设施——一种根据已经可用的节点定义您自己的节点的内置功能。与 DEF/USE 的主要区别在于能够为您的节点定义参数并将它们包含在事件处理中。
尽管如此,即使具有所有这些功能,VRML 尤其是 X3D 还远未成为 CAD 和一般 3D 图形空间中的行业标准。尽管有开放的规范和免费可用的转换器库,但对 3D 应用程序的支持还是参差不齐。VRML 经常作为导入或导出选项之一出现,X3D 则不然。这两种格式都有多个持久性选项,但实际上都是基于文本的,通常会产生一些后果 - 数字精度限制和文件大小大于 JT 等二进制格式可以实现的大小。总之,如果您需要一种有效的格式来存储网格模型,同时保留所有网格属性和模型层次结构,那么使用 VRML 和 X3D 是有意义的。如果模型还包含元数据,X3D 是更好的选择。