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

13 Geometry3D component

三维几何体组件

--- X3D separator bar ---

cube 13.1 介绍

13.1.1 名称

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

13.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Geometry3D component(三维几何体组件)。其中包括如何指定三维几何体及其可见的形状如何。表 13.1 列出了这一条款的主要主题。

表 13.1 — 主题

cube 13.2 概念

13.2.1 几何体概述

几何组件由四种类型的节点组成:形(shape)、几何体(geometry)、几何属性(geometry property)、外观(appearance)。这些节点类型共同用来描述一个 X3D 场景中的可视元素。

13.2.2 Shape 节点和几何节点

Shape 节点把一个几何节点和定义此几何体外观的节点联合起来。为了自身可以被看见,Shape 节点必须为变换层级的一部分,反之如果可以看见任何几何体,则变换层级中必须包括相应的 Shape 节点(只有 Shape 节点和 24 Environmental effects 中的背景节点可以渲染出可见结果)。Shape 节点在 geometry 域中包括且只包括一个类型为 X3DGeometryNode 的几何节点。Shape 节点的细节见 12 形组件 Shape component

可以定义其它的组件以添加几何节点类型。

13.2.3 几何属性节点

许多几何节点都包含了作为几何属性节点的 Coordinate、Color、Normal、TextureCoordinate 节点。这些节点在 11 渲染组件 Rendering component 中定义。

13.2.4 Appearance 节点

Shape 节点可以指定一个 Appearance 节点用以描述应用到 Shape 节点中的几何体上的外观属性(材质和纹理)。Appearance 在 12 形组件 Shape component 中定义。

13.2.5 一般几何域

一些 3D 几何体共用描述属性的一般域。这些域指定了顶点顺序,此形状是否是实体(solid),此形状包含的是否是凸多边形(convex faces),面之间呈现褶皱(crease)的角度,相应域名为 ccwsolidconvexcreaseAngle。一般 3D 几何域的描述见 11 渲染组件 Rendering component.

cube 13.3 节点参考

13.3.1 Box

Box : X3DGeometryNode { 
  SFNode  [in,out] metadata NULL  [X3DMetadataObject]
  SFVec3f []       size     2 2 2 (0,∞)
  SFBool  []       solid    TRUE
}

Box(盒子)节点指定了一个直角平行六面体盒子,其中心定位在局部坐标系 (0, 0, 0) 并和局部坐标系轴对齐。缺省时为每个方向上都为 -1 到 1 的 2 个单位长度的盒子。size 域指定了沿 X 轴、Y 轴、Z 轴进行延伸的长度的对应分量,每个分量的值应大于。附图 13.1 举例介绍了 Box 节点。

Box node

Figure 13.1 — Box node

纹理将被独立地应用到盒子的每个面上。当在外面且 +Y 轴为视图中向上的方向时,图像将被按其通常在 2D 中显示的方向在盒子的前(+Z)、后(-Z)、右(+X)、左(-X)面上贴图。当从上方沿 Y 轴向下看向原点且 -Z 轴为视图中向上的方向时,图像将被按其通常在 2D 中显示的方向在盒子的顶(+Y)面上贴图。当从下方沿 Y 轴向上看向原点且 +Z 轴为视图中向上的方向时观看,图像将被按其通常在 2D 中显示的方向在盒子的底(-Y)面上贴图。TextureTransform 能影响 Box 的纹理坐标(见 18.4.9 TextureTransform)。

solid 域决定了盒子从内部观察时是否可见。solid 域的完整描述见 11.2.3 一般几何域 Common geometry fields

 

13.3.2 Cone

Cone : X3DGeometryNode { 
  SFNode  [in,out] metadata     NULL [X3DMetadataObject]
  SFBool  []       bottom       TRUE
  SFFloat []       bottomRadius 1    (0,∞)
  SFFloat []       height       2    (0,∞)
  SFBool  []       side         TRUE
  SFBool  []       solid        TRUE
}

Cone(圆锥)节点指定了一个圆锥,其中心定位在局部坐标系 (0, 0, 0) 且其中心轴和局部 Y 轴对齐。bottomRadius 域指定了圆锥底面的半径,height 域指定了从圆锥底面中心到顶点的高度。缺省时为圆锥底面的半径为 1,高度为 2,顶点位于 y = height/2,底面位于 y = -height/2。bottomRadiusheight 的值都应大于 0。附图 13.2 举例介绍了 Cone 点。

Cone node

Figure 13.2 — Cone node

side 域指定是否创建圆锥的侧面。bottom 域指定是否创建圆锥的底面。TRUE 值指定圆锥的此部分存在,FALSE 值指定圆锥的此部分不存在(不被渲染,不做碰撞检测,不做传感器交点测试)。

当纹理应用到圆锥的侧面时,纹理从圆锥的背面开始逆时针地包裹(从上面看)。纹理的垂直接缝位于背面,是 X=0 平面上的从顶点 (0, height/2, 0) 到底面中心 (0, -height/2, -bottomRadius) 的连线。对于底盖,纹理为一个中心位于 (0, -height/2, 0) 的 (2 × bottomRadius) X  (2 × bottomRadius) 尺寸的单位纹理方形中裁出的圆形。当圆锥的顶被旋转到对向 -Z 轴时,底面纹理看起来为正面的向上的。TextureTransform 能影响 Cone 的纹理坐标(见 18.4.9 TextureTransform)。

solid 域决定了圆锥从内部观察时是否可见。solid 域的完整描述见 11.2.3 一般几何域 Common geometry fields

13.3.3 Cylinder

Cylinder : X3DGeometryNode { 
  SFNode  [in,out] metadata NULL [X3DMetadataObject]
  SFBool  []       bottom   TRUE
  SFFloat []       height   2    (0,∞)
  SFFloat []       radius   1    (0,∞)
  SFBool  []       side     TRUE
  SFBool  []       solid    TRUE
  SFBool  []       top      TRUE
}

Cylinder(圆柱)节点指定了一个圆柱,其中心定位在局部坐标系 (0,0,0) 且其中心轴和局部 Y 轴对齐。缺省时圆柱三个方向上都为 -1 到 1 的尺寸。radius 域指定了圆柱的半径,height 域指定圆柱沿中心轴的高度。radiusheight 的值都应大于 0。附图 13.3 举例介绍了 Cylinder 节点。

圆柱有三个部分(parts):side(侧面)、top(位于 Y = +height/2 的顶面)、bottom (位于 Y = −height/2 的底面)。每一个部分都和一个 SFBool 域关联以指示是(值为 TRUE)否(值为 FALSE)存在相应的部分并做交点测试(范例 碰撞检测或传感器活动)。

Cylinder node

Figure 13.3 — Cylinder node

当纹理应用到圆柱的时,将以不同的方式应用到侧面、顶面、底面。应用到侧面,纹理从圆柱的背面开始逆时针地包裹(从上面看)。纹理有一条垂直接缝,接缝在背面和 X=0 的平面相交。对于顶面和底面,纹理为一个中心位于 (0, -±height/2, 0) 的 (2 × radius) X  (2 ×  radius) 尺寸的单位纹理方形中裁出的圆形。当圆柱的顶被旋转到对向 +Z 轴时,顶面纹理看起来为正面的向上的。当圆柱的顶被旋转到对向 -Z 轴时,底面纹理看起来为正面的向上的。TextureTransform 能影响 Cylinder 的纹理坐标(见 18.4.9 TextureTransform)。

solid 域决定了圆柱从内部观察时是否可见。solid 域的完整描述见 11.2.3 一般几何域 Common geometry fields

13.3.4 ElevationGrid

ElevationGrid : X3DGeometryNode {
  MFFloat [in]     set_height
  SFNode  [in,out] color           NULL [X3DColorNode]
  SFNode  [in,out] metadata        NULL [X3DMetadataObject]
  SFNode  [in,out] normal          NULL [X3DNormalNode]
  SFNode  [in,out] texCoord        NULL [X3DTextureCoordinateNode]
  SFBool  []       ccw             TRUE  
  SFBool  []       colorPerVertex  TRUE
  SFFloat []       creaseAngle     0    [0,∞)
  MFFloat []       height          []   (-∞,∞)
  SFBool  []       normalPerVertex TRUE
  SFBool  []       solid           TRUE
  SFInt32 []       xDimension      0    [0,∞)
  SFFloat []       xSpacing        1.0  (0,∞)
  SFInt32 []       zDimension      0    [0,∞)
  SFFloat []       zSpacing        1.0  (0,∞)
}

ElevationGrid(高程格网)节点指定了一个相对局部坐标系中 Y=0 平面的高低起伏的均匀矩形格网。 此几何体将被描述为一个高度值的标量数组,这个数组将指定表面在网格每个点之上的高度。

xDimension(x轴尺寸)域和 zDimension(z轴尺寸)域表示了网格 height(高度)数组在 X 方向和 Z 方向上的元素数量。xDimensionzDimension 都应大于或等于 0。如果 xDimensionzDimension 其中的任一个值小于 2,则此 ElevationGrid 将不包含四边形。矩形顶点的位置是由 height 域、xSpacing(x轴间距)域、zSpacing(z轴间距)域定义的:

这样,格网上对应点 P[i, j] 的顶点将被放置在:

  P[i,j].x = xSpacing × i

  P[i,j].y = height[ i + j × xDimension]

  P[i,j].z = zSpacing × j

    其中 0 ≤ i < xDimension 且 0 ≤ j < zDimension,
    P[0,0] 为局部坐标系原点之上/之下的单位高度值即 height[0] 。 

set_height inputOnly 域允许改变高度值的 MFFloat 域以支持 ElevationGrid 节点动画。

color 域将根据 colorPerVertex 的值来为 ElevationGrid 节点的每个多边形或每个四边形指定颜色。如果 color 域为 NULL(空),ElevationGrid 节点将根据包含此 ElevationGrid 节点的 Shape 节点的整体属性来渲染(见 12 形组件 Shape component)。

colorPerVertex 域决定了 color 域中的颜色将被指定到 ElevationGrid 节点的每个顶点上还是被指定到每个四边形上。如果 colorPerVertexFALSEcolor 域不为 NULL(空),则 color 域中应指定一个至少包含 (xDimension-1)×(zDimension-1) 个颜色值的 Color 节点;每个颜色值对应一个四边形,颜色值对应顺序如下:

    QuadColor[i,j] = Color[ i + j × (xDimension-1)]

    其中 0 ≤ i < xDimension-1 且 0 ≤ j < zDimension-1,
    QuadColor[i,j] 为附给由 height[i+j × xDimension], height[(i+1)+j × xDimension],
    height[(i+1)+(j+1) × xDimension], height[i+(j+1) × xDimension] 定义的四边形的颜色值

如果 colorPerVertexTRUEcolor 域不为 NULL(空),则 color 域中应指定一个至少包含 xDimension × zDimension 个颜色值的 Color 节点;每个颜色值对应一个顶点,颜色值对应顺序如下:

    VertexColor[i,j] = Color[ i + j × xDimension ]

    其中 0 ≤ i < xDimension 且 0 ≤ j < zDimension,
    VertexColor[i,j] 为附给由 height[ i+j × xDimension ] 定义的顶点的颜色值

normal 域将根据 normalPerVertex 的值 ElevationGrid 节点的每个多边形或每个四边形指定法线。如果 normal 域为 NULL(空),浏览器将自动生成法线,并使用 creaseAngle 域决定跨表面的法线如何被平滑(参见 11.2.3 一般几何域 Common geometry fields)。

normalPerVertex 域决定了法线将被指定到 ElevationGrid 节点的每个顶点上还是被指定到每个四边形上。如果 normalPerVertexFALSEnormal 节点不为 NULL(空)normal 域中应指定一个至少包含 (xDimension-1)×(zDimension-1) 个法线的 Normal 节点;每个颜色值对应一个四边形,值的对应顺序如下:

    QuadNormal[i,j] = Normal[ i + j × (xDimension-1)]

    其中 0 ≤ i < xDimension-1 且 0 ≤ j < zDimension-1,
    QuadNormal[i,j] 为附给由 height[i+j × xDimension], height[(i+1)+j × xDimension],
    height[(i+1)+(j+1) × xDimension], height[i+(j+1) × xDimension] 定义的四边形的法线值

如果 normalPerVertexTRUEnormal 域不为 NULL(空),则 normal 域中应指定一个至少包含 xDimension × zDimension 个颜色值的 Normal 节点;每个值对应一个顶点,值的对应顺序如下:

    VertexNormal[i,j] = Normal[ i + j × xDimension]

    其中 0 ≤ i < xDimension 且 0 ≤ j < zDimension,
    VertexNormal[i,j] 为附给由 height[i+j × xDimension] 定义的顶点的法线值

texCoord 域为 ElevationGrid 节点的每个顶点指定了纹理坐标。如果 texCoordNULL(空),将应用缺省的纹理坐标。缺省的纹理坐标的范围在第一个顶点为 (0,0),在最后一个顶点为 (1,1)。S 纹理坐标沿着 +X 轴,T 纹理坐标沿着 +Z 轴。如果 texCoord 不为 NULL(空),则域中应指定一个至少包含 xDimension × zDimension 个纹理坐标的 TextureCoordinate 节点;每个值对应一个顶点,值的对应顺序如下:

    VertexTexCoord[i,j] = TextureCoordinate[ i + j × xDimension]

    其中 0 ≤ i < xDimension 且 0 ≤ j < zDimension,
    VertexTexCoord[i,j] 为附给由 height[i+j × xDimension] 定义的顶点的纹理坐标

ccw 域、solid域、convex 域、creaseAngle 域的描述见 11.2.3 一般几何域 Common geometry fields

在缺省状态下,四边形按逆时针方向定义。因此法线的 Y 分量为正值。ccw 域设置为 FALSE 将反转法线的方向。当 solid 域为 TRUE 时将允许背面剔出。

ElevationGrid 节点的描述见 附图 13.4

ElevationGrid node

附图 13.4 — ElevationGrid 节点

13.3.5 Extrusion

13.3.5.1 语法

Extrusion : X3DGeometryNode {
  MFVec2f    [in]     set_crossSection
  MFRotation [in]     set_orientation
  MFVec2f    [in]     set_scale
  MFVec3f    [in]     set_spine
  SFNode     [in,out] metadata         NULL                      [X3DMetadataObject]
  SFBool     []       beginCap         TRUE
  SFBool     []       ccw              TRUE
  SFBool     []       convex           TRUE
  SFFloat    []       creaseAngle      0                         [0,∞)
  MFVec2f    []       crossSection     [1 1 1 -1 -1 -1 -1 1 1 1] (-∞,∞)
  SFBool     []       endCap           TRUE
  MFRotation []       orientation      0 0 1 0                   [-1,1] or (-∞,∞)
  MFVec2f    []       scale            1 1                       (0,∞)
  SFBool     []       solid            TRUE
  MFVec3f    []       spine            [0 0 0 0 1 0]             (-∞,∞)
}   

13.3.5.2 概述

Extrusion(挤压)节点把一个二维剖面线沿着局部坐标系中的一个三维脊干挤压以指定一个几何体。剖面线可以在脊干的不同点上旋转或缩放以生成复杂的造型。

Extrusion 节点由以下参数定义:

  1. 一个二维分段线性曲线(描述为一系列相连接的顶点)用来定义 crossSection(剖面)
  2. 一个三维分段线性曲线(描述为一系列相连接的顶点)用来定义 spine(脊干)
  3. 一个二维 scale(缩放)参数序列;
  4. 一个三维 orientation(方向)参数序列。

13.3.5.3 算法描述

造型将按以下方式被构建。从位于 Y=0 平面的剖面曲线开始的剖面曲线将根据第一个 scale 参数(其中第一个值缩放 X,第二个值缩放 Z)沿原点进行第一次缩放。然后它将变换到第一个脊干点并使用第一个 orientation 参数(解释见下文) 调节方向。重复相同的过程,下一个剖面使用第二个缩放和方向值以被放置在第二个脊干点上。随后第一个剖面和第二个剖面上对应的节点将被连接起来,在每对顶点之间将形成一个四边的多边形。其余的脊干上也重复相同的过程,最终将形成一个沿脊干挤压出的表面。

每个剖面的最终方向通过以下方式计算:首先相对于剖面将被放置的点两侧的脊干段定义一个 SCP 平面(spine-aligned cross-section plane 脊干对齐的剖面平面),SCP 平面被设计为提供从一个脊干段到另一个段的平滑过渡(参见 附图 13.5)。SCP 平面随后旋转到对应的 orientation 值的方向。这种旋转是相对 SCP 平面执行的。例如,为了在剖面上进行扭转,则应使用沿 Y 轴 (0 1 0) 的旋转。其它的方向的旋转将把剖面旋转出 SCP 平面,但这样也是允许的。

Spine-aligned cross-section plane at a spine point

Figure 13.5 — Spine-aligned cross-section plane at a spine point.

SCP 平面首先根据 Y 轴和 Z 轴计算,然后取其差积以决定 X 轴。这三个轴随后被用来决定把 Y=0 平面旋转到 SCP 平面所需的旋转值。结果是形成了脊干上每个点的近似切平面,如 附图 13.5 所示。第一个 Y 轴将按以下方式决定:

设 n 为脊干点的数量,设 i 为索引的变量,0 ≤ i < n:

  1. 对于除第一个点和最后一个点外的所有点:spine[i] 对应的 Y 轴根据由 (spine[i+1] − spine[i−1]) 定义的矢量的法线化来查找。
  2. 如果脊干曲线是闭合的:第一个点和最后一个点对应的 SCP 平面是相同的,这个 SCP 平面的 Y 轴由 (spine[1] − spine[n−2]) 计算而来。
  3. 如果脊干曲线不是闭合的:第一个脊干点对应的 Y 轴为由 spine[0] 到 spine[1] 的矢量,最后一个脊干点对应的 Y 轴为由 spine[n−2] 到 spine[n−1] 的矢量。

Z 轴将按以下方式决定:

  1. 对于除第一个点和最后一个点外的所有点:取以下差积:
    	Z = (spine[i+1] − spine[i]) × (spine[i-1] − spine[i])
    
  2. 如果脊干曲线是闭合的:第一个点和最后一个点对应的 SCP 平面是相同的,这个 SCP 平面的 Z 轴由取以下差积而来:
    	Z = (spine[1] − spine[0]) × (spine[n-2] − spine[0]) 
    
  3. 如果脊干曲线不是闭合的:第一个脊干点的 Z 轴为 spine[1] 的 Z 轴,最后一个脊干点的 Z 轴为 spine[n−2] 的 Z 轴。
  4. 当 Z 轴决定以后,将计算其和前一个脊干点的 Z 轴的点积。如果此结果值为负,Z 轴将被反转(乘以 −1)。在大多情况下,这将能防止脊干段角度的很小变化导致的剖面的 180 度翻转。

一旦计算出 Y 轴和 Z 轴,则 X 轴可以使用它们的差积计算。

13.3.5.4 特殊情况

如果 scale 缩放值和 orientation 方向值的数量大于脊干点的数量,多余的值将被忽略。如果其中只有一个值,则这个值将被应用到所有的脊干点上。如果缩放值和方向值的数量大于 1 而小于脊干点的数量,则结果不确定。scale 值应为正值。

如果用于计算 Z 轴的三个点共线时差积为 0,则使用前一个点的值来代替。

如果第一个点的 Z 轴未定义(因为脊干是不闭合的且前两个脊干段是共线的),则使用可以定义 Z 轴第一个的脊干点的 Z 轴。

如果整个脊干都是共线的,则 SCP 平面通过查找沿正 Y 轴 (v1) 矢量到脊干点 (v2)形成的矢量之间的选装值得来,Y=0 平面随后将根据此值旋转。

如果两个点重合,则他们都有一个相同的 SCP 平面。如果每个点有不同的方向值,那么这个表面还是按照正常的方式通过连接剖面的边界构建。这可以用来建立转动的表面。

注意:把重合的或不重合的脊干段组合,以及其它组合可能导致自相交的表面,挤压运算中不会试图消除这种情况。

13.3.5.5 通常情况

以下是 Extrusion 节点支持效果的通常案例:

回转表面:
如果剖面为一个近似的圆形且脊干线为直线,Extrusion 将等同于一个回转表面,其中用 scale 参数定义沿脊干的剖面的尺寸。
均匀挤压:
如果 scale 比例值为 (1, 1) 且脊干为直线,则剖面将沿脊干进行没有扭曲或缩放的均匀挤压。结果将生成一个柱状的剖面不变的造型。
弯曲/扭曲/锥化物体:
这些造型是使用所有域以后的结果。脊干曲线可以弯曲挤压出的由剖面定义的造型,方向参数(以沿 Y 轴旋转的方式给出)可以使造型沿脊干扭曲,缩放参数可以使造型锥化(通过沿脊干的缩放)。

13.3.5.6 其它域

Extrusion 分为三个 部分(parts):侧面、beginCap起始端封口 - 脊干初始端的表面)、endCap末端封口 - 脊干末端的表面)。用的 SFBool 域指示存在 (TRUE) 相应封口或没有 (FALSE) 相应的封口。

beginCap 域或 endCap 域被指定为 TRUE 时,则不管 crossSection 是否是一个闭合曲线都将生成一个平面的封口表面。如果 crossSection 是不闭合的曲线,则通过在 crossSection 的初始点上添加终点来生成封口。开口的表面仍可以有封口,结果(举例来说)类似汽水瓶被垂直切开的造型。这些表面甚至在 spine 为闭合曲线时也会生成。如果域值为 FALSE,则不生成相应的封口。

纹理坐标由 Extrusion 节点自动生成。纹理将按以下方式映射,U 方向沿着 crossSection 曲线,坐标范围从 0 到 1(这里 0 对应了 crossSection 中的第一个点,1 对应了最后一个)V 方向沿着 spine 曲线,坐标范围从 0 到 1(这里 0 对应了 spine 中的第一个脊干点,1 对应了最后一个)。如果 endCapbeginCap 不存在,则将对 crossSection 曲线进行均匀缩放和变换以使较大尺寸的剖面(X 或 Z 方向上)生成范围 0.0 到 1.0 的纹理坐标。beginCapendCap 纹理坐标的 S 方向和 T 方向对应用来定义 crossSection 坐标的 S 方向和 T 方向。

浏览器应支持自动为 Extrusion 节点生成法线,使用 creaseAngle 域决定了如何平滑表面交接的部分。封口使用的法线沿着 SCP 平面的 Y 轴生成,法线顺序通过从上方观测剖面(沿 SCP 的负 Y 轴观测)来决定。缺省情况下,逆时针顺序的 beginCap 起始端封口的法线为负 Y 轴方向。顺时针顺序的 endCap 末端封口的法线为正 Y 轴方向。

每个组成挤压造型边的四边形将按从底剖面(位于先出现的脊干点上)到顶剖面排序。所以,每个四边形由如下点依次构成:

    spine[0](crossSection[0], crossSection[1])
    spine[1](crossSection[1], crossSection[0])

按这个顺序,面的缺省情况下的法线将按照 13.2.2 Shape 节点和几何节点 中描述的方式生成。

例如,一个由逆时针排序的圆形剖面和缺省脊干组成的圆柱,在 solid 域为 TRUEccw 域为 TRUE 时,此圆柱可以从外部观测到。如果此时把 ccw 域改为 FALSE 则圆柱可以从内部观测到。

ccw 域、solid域、convex 域、creaseAngle 域的描述见 11.2.3 一般几何域 Common geometry fields

13.3.6 IndexedFaceSet

IndexedFaceSet : X3DComposedGeometryNode {
  MFInt32 [in]     set_colorIndex
  MFInt32 [in]     set_coordIndex
  MFInt32 [in]     set_normalIndex
  MFInt32 [in]     set_texCoordIndex
  SFNode  [in,out] color             NULL [X3DColorNode]
  SFNode  [in,out] coord             NULL [X3DCoordinateNode]
  SFNode  [in,out] metadata          NULL [X3DMetadataObject]
  SFNode  [in,out] normal            NULL [X3DNormalNode]
  SFNode  [in,out] texCoord          NULL [X3DTextureCoordinateNode]
  SFBool  []       ccw               TRUE
  MFInt32 []       colorIndex        []   [0,∞) or -1
  SFBool  []       colorPerVertex    TRUE
  SFBool  []       convex            TRUE
  MFInt32 []       coordIndex        []   [0,∞) or -1
  SFFloat []       creaseAngle       0    [0,∞)
  MFInt32 []       normalIndex       []   [0,∞) or -1
  SFBool  []       normalPerVertex   TRUE
  SFBool  []       solid             TRUE
  MFInt32 []       texCoordIndex     []   [-1,∞)
}

IndexedFaceSet(索引面集)是一个几何节点, 代表一个由一组顶点构建的一系列平面多边形形成的3D形体,

IndexedFaceSet 节点呈现一个由一系列面(多边形)构成的 3D 造型,这些面由 coord 域中定义一组顶点构建。coord 域包含一个 Coordinate 节点,这个 Coordinate 节点定义了 coordIndex 域将引用的 3D 顶点。IndexedFaceSet 使用 coordIndex 域中的索引在 Coordinate 节点中按索引方式查找坐标并指定多边形面。索引值为 "-1" 表示当前的面结束和下一个面开始。最后一个面可以(但不一定非)跟随一个 "-1" 索引。假定 coordIndex 域中最大的索引为 N,则 Coordinate 节点中应包括 N+1 坐标(索引为 0 到 N)。IndexedFaceSet 的每一个面应:

  1. 至少三个不重合的顶点;
  2. 定义了平面多边形的顶点;
  3. 定义了非自相交多边形的顶点。

否则结果未定义。

IndexedFaceSet 指定在局部坐标系中并受祖先变换的影响。

coordnormaltexCoord 域的在 Coordinate、Normal、TextureCoordinate 节点中有相应描述(见 11 渲染组件 Rendering component)。

光照方程及其和 color 域、normal 域、纹理、材质的反应见 11 渲染组件 Rendering component12 形组件 Shape component.

如果 color 域为非 NULL,则其中应包含一个 Color 节点,这个 Color 节点中的颜色应按以下方式被应用到 IndexedFaceSet 的顶点或面上:

  1. 如果 colorPerVertexFALSE,颜色值将按以下方式应用到每个面上:
    1. 如果 colorIndex 域不为空,每一个颜色值将被应用到 IndexedFaceSet 的每一个面上。colorIndex 域中的索引数量至少应对应 IndexedFaceSet 的面的数量。如果 colorIndex 域中最大的索引为 N,则 Color 节点中至少应有 N+1 个颜色值。colorIndex 域中应不包含任何负值项。
    2. 如果 colorIndex 域为空,Color 节点中的颜色值应按顺序被应用到 IndexedFaceSet 的每一个面上。Color 节点中的颜色值的数量至少应对应面的数量。
  2. 如果 colorPerVertexTRUE,颜色值将按以下方式应用到每个顶点上:
    1. 如果 colorIndex 域不为空,颜色值将被应用到 IndexedFaceSet 的每一个顶点上,应用的方法和用 coordIndex 域来为每个顶点从 Coordinate 节点中选取坐标的方法相同。colorIndex 至少应包含和 coordIndex 域中的一样数量的索引值,并且应在和 coordIndex 域中对应的相同位置包含面终止符 (−1)。如果 colorIndex 域中最大的索引为 N,则 Color 节点中至少应有 N+1 个颜色值。
    2. 如果 colorIndex 域为空,则使用 coordIndex 域来从 Color 节点中选取颜色。如果 coordIndex 域中最大的索引为 N,则 Color 节点中至少应有 N+1 个颜色值。

如果 color 域为 NULL(空),则此几何体将根据其 Appearance 节点中的 Material(材质)和 texture(纹理)定义来进行常规渲染(细节见 12 形组件 Shape component)。

如果 normal 域为非 NULL(空),则应包含一个 Normal 节点,这个 Normal 节点中的法线被应用到 IndexedFaceSet 的顶点或面上的方式和以上描述的把色彩值应用到顶点/面上的方式相同(这里 normalPerVertex 对应 colorPerVertexnormalIndex 对应 colorIndex)。如果 normal 域为 NULL(空),浏览器将自动生成法线,并使用 creaseAngle 域决定共享顶点的法线是否将被平滑以及如何被平滑(见 11.2.3 一般几何域 Common geometry fields)。

如果 texCoord 域为 NULL(空),则应包含一个 TextureCoordinate 节点。此节点中的纹理坐标将按以下方式被应用到 IndexedFaceSet 的顶点上:

  1. 如果 texCoordIndex 域不为空,则其将用于为 IndexedFaceSet 的每一个顶点选取顶点坐标,应用的方法和用 coordIndex 域来为每个顶点从 Coordinate 节点中选取坐标的方法相同。texCoordIndex 域至少应包含和 coordIndex 域中的一样数量的索引值,并且应在和 texCoordIndex 域中对应的相同位置包含面终止符 (−1)。如果 colorIndex 域中最大的索引为 N,则 TextureCoordinate 节点中至少应有 N+1 个纹理坐标值。
  2. 如果 texCoordIndex 域为空,则使用 coordIndex 域来从 TextureCoordinate 节点中选取纹理坐标。如果 coordIndex 域中最大的索引为 N,则 TextureCoordinate 节点中至少应有 N+1 个颜色值。

如果 texCoord 域为 NULL(空),则使用此造型的边界盒在局部坐标系中计算一个缺省的局部坐标系映射。边界盒上最长的尺寸方向定义了 S 坐标,第二长的尺寸方向定义了 T 坐标。如果边界盒的两个或三个尺寸相等,则以 X、Y、Z 方向上的尺寸排序。从边界盒的一端到另一端,S 坐标值的范围为 0 到 1。T  坐标值的范围为 0 到边界盒最大长度方向除以第二长的方向所得的比值。附图 13.6  图示说明了一个 X 方向上长度为 Z 方向上长度两倍,为 Z 方向上长度四倍的缺省的盒形的 IndexedFaceSet 的缺省的纹理坐标。附图 13.7附图 13.6 中使用的原始的纹理图像。

IndexedFaceSet node texture mapping

Figure 13.6 — IndexedFaceSet texture default mapping

ImageTexture for IndexedFaceSet in Figure 6.10

Figure 13.7 — ImageTexture for IndexedFaceSet in Figure 13.6

ccw 域、solid域、convex 域、creaseAngle 域的描述见 11.2.3 一般几何域 Common geometry fields

13.3.7 Sphere

Sphere : X3DGeometryNode { 
  SFNode  [in,out] metadata NULL [X3DMetadataObject]
  SFFloat []       radius   1    (0,∞)
  SFBool  []       solid    TRUE
}

Sphere(球体)节点指定了一个球体,其中心定位在局部坐标系 (0, 0, 0) 。radius 域指定了球体的半径,其值应大于 0。附图 13.8 描述了 Sphere 节点的域。

Sphere node

Figure 13.8 — Sphere node

当纹理应用到球体时,纹理将覆盖整个球体,从球体背面(即和 -Z 轴相交的经度弧)开始逆时针地包裹(从上面看)。纹理有一条接缝,接缝在背面和 X=0 的平面相交,其上的 Z 值为负。TextureTransform 能影响 Sphere 的纹理坐标(见 18.4.9 TextureTransform)。

solid 域决定了球体从内部观察时是否可见。solid 域的完整描述见 11.2.3 一般几何域 Common geometry fields

13.4 Geometry3D 组件支持级别

Geometry3D 组件提供 表 13.2 中规定的四个支持级别。Level 1 提供了 Shape 节点、几何体图元以及基本的索引几何体类型的有限的域的支持。Level 2 添加了 IndexedFaceSet 节点支持。Level 3 中添加了 ElevationGrid 节点支持以满足入门级的地形和数据可视化应用,另外 Level 3 中的所有节点的域都完全支持。Level 4 添加了 Extrusion 节点支持。

表 13.2 — Geometry3D 组件支持级别

级别Level 必备条件 节点/特性 支持
1 Core 1
Grouping 1
Rendering 1
Shape 1
Box 所有域完全支持
Cone 所有域完全支持
Cylinder 所有域完全支持
Sphere 所有域完全支持
2 Core 1
Grouping 1
Rendering 1
Shape 1
Level 1 中的所有几何体节点 Level 1 中支持的所有域
IndexedFaceSet ccw 可选地支持。set_colorIndex 可选地支持。set_normalIndex 可选地支持。normal 可选地支持。 只有凸多边形索引面集支持,所以 convex 可选地支持。creaseAngle 中只支持 0 和 π 弧度值。normalIndex 可选地支持。

面列表应按以下规格精确定义:

  1. 每一个面由 -1 终止,包括数组中的最后一个面。
  2. 每一个面应包括至少三个不重合的顶点。
  3. 一个面上给定的 coordIndex 不应重复。
  4. 面上的顶点应定义一个平面多边形。
  5. 面上的顶点不应定义自相交的多边形。
3 Core 1
Grouping 1
Rendering 1
Shape 1
   
    Level 2 中的所有几何体节点 Level 2 中支持的所有域
ElevationGrid ccw 可选地支持。
4 Core 1
Grouping 1
Rendering 1
Shape 1
   
    Level 3 中的所有几何体节点 所有域完全支持
Extrusion 所有域完全支持

--- X3D separator bar ---