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

27 NURBS component

NURBS 组件

--- X3D separator bar ---

cube 27.1 介绍

27.1.1 名称

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

27.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Non-uniform Rational B-Spline (NURBS) component( 非均匀有理B样条 - NURBS 组件)。表 27.1 列出了这一条款的主要主题。

表 27.1 — 本条款的主题

cube 27.2 概念

27.2.1 NURBS 概述

NURBS(Non-uniform Rational B-Splines 非均匀有理B样条)提供了一种简便有效的生成曲线或曲面的方法,由 NURBS 生成的曲线或曲面在任何距离上看都将是平滑的。由于这些曲线是参数化的,所以只需要提供很少的数据就可以描述复杂的表面。

27.2.2 NURBS 相关节点

和 ElevationGrid(高程格网)相似,典型的 NurbsSurface (NURBS 曲面)或 NurbsCurve(NURBS 曲线)的形状也是由一组的点控制点(CV:控制顶点 - control vertices)决定的。根据各控制点被定义的权重值,形状将不同程度地逼近这些控制点点。整个表面将可以被看作所有控制点加权平均值,并且其中每个控制点有一个自己影响的范围和强度。影响的范围将由结向量(knot vector)决定。

NURBS 中的表面构建技术包括:

  1. 特殊的 NURBS 表面,如球体,圆柱或贝塞尔(Bezier)表面;
  2. 挤压/扫出(extrusion / swept)表面,由脊柱线和截面线构建,其中脊柱线和截面线都可用 NURBS 曲线;
  3. 回转(revolution)表面,由一个圆/弧和 NURBS 截面线构建;
  4. 蒙皮(skinned)表面,由一组曲线构建;
  5. 戈登(Gordon)曲面,由两个曲线插值构建;
  6. 孔斯(Coons)片面,由 4 个边界曲线构建的双三次插值融合表面;
  7. 由一组点插值构建的表面。

在此标准中,假定以上的曲面构建只是创作时的一个步骤,在 X3D 运行时交付的 NURBS 曲面应转换为一般的 NurbsSurface 表示。

27.2.3 镶嵌策略

因为底层实时渲染系统现在只能处理平面化的三角形,NURBS 曲面需要被塌陷(例如镶嵌 - Tessellation)到一组逼近真实表面的三角形。

镶嵌可以在不同的坐标空间中进行:

  1. 镶嵌可以在对象空间中进行,内在计算为等价的 X3D IndexedFaceSet。
  2. 转换控制点到屏幕空间,在屏幕空间中镶嵌。

表面上的镶嵌点也可以由不同的方法决定:

  1. 基于绝对细分数量的固定的镶嵌;
  2. 基于弦长的自适应镶嵌;
  3. 基于两个三角形之间角度的自适应镶嵌;
  4. 基于视点的镶嵌,相邻轮廓线的最佳化镶嵌。

此标准中不指定使用哪种方法进行表面镶嵌。然而,执行渲染 NURBS 时应镶嵌产生的渲染图像中不能感觉到镶嵌块的边界。

在荧幕空间中镶嵌时应注意需要能为渲染传送变换过的顶点。这需要应用程序先对每个三角形的顶点进行光照计算(见 17, Lighting component)并传送计算出的色彩和高光的 RGB 值。

为了避免两个表面间连接的破裂,这个表面集合的镶嵌值可以在 NurbsGroup 中指定。

27.2.4 自动细节层次

通过完全利用 NURBS 模型可伸缩的镶嵌模式,可以使用新方法来建立细节层次(LOD)。由不同的参数决定,镶嵌处理的输出可以在每一帧自适应。在渲染模型的质量和帧速率之间的权衡可以考虑到以下的因素:

  1. 需要的目标帧速率;
  2. 每帧/对象可用的三角形预算;
  3. 最后一帧/对象的三角形数量;
  4. 可用的 CPU 性能;
  5. 对象到观测者的距离;
  6. 当前可见的 NURBS 曲面的数量;
  7. 控制点格网投射在屏幕空间的区域 / 控制点格网的边界盒投射在屏幕空间的区域。

自动细节层次不是必须支持的。

27.2.5 NURBS 修剪

修剪(trim)曲线指定了一个用来限定 NURBS 曲面的 NURBS 曲线,以建立包含洞孔或有平滑边界的 NURBS 曲面。修剪曲线是位于曲面参数化空间的曲线。以下是修剪方式的定义:

修剪的范围由位于曲面参数化空间的封闭修剪环(trimming loop)集定义。当环的导向是逆时针时,环里面的部分将被保留,环外面的部分将被删除。当环的导向是顺时针时,环外面的部分将被删除,剩下的部分将被保留。环可以被嵌套,但被嵌套的环的导向必须和嵌套其的环导向相反。最外面的环的导向必须是逆时针。

每一条修剪环由一个 NURBS 曲线及自动结合的线性曲线的连接序列构成。序列中每一条曲线的最后一个点必须是下一条曲线的第一个点,最后一条曲线的最后一个点必须是第一条曲线的第一个点。不允许使用自相交的曲线。

27.2.6 使用 NURBS 动画

NURBS 可以通过只改变单一的控制点来实现动画。因此 NURBS 曲面将一直保持自身的平滑。通过改变表面的阶数(order 值),可以改变相邻控制点相对控制点动画的范围和影响。

动画使用的值也可以用 NURBS 格式的平滑曲线来表示。PositionInterpolator 节点类型的 NURBS 化改编就是 NurbsPositionInterpolator

NURBS 曲线(单参数),NURBS 曲面(双参数)第三维参数的概念扩展就是 NURBS 容积(NurbsVolume)。如果给定一个入 (u,v,w) 参数将可以计算出一个 3D 的 (x,y,z) 。用 CoordinateDeformer 定义这个容积,并对此容积应用一个空间翘曲。这个节点可以用来给任何常见的 X3D 节点应用变形。

cube 27.3 抽象类型

27.3.1 X3DParametricGeometryNode

X3DParametricGeometryNode : X3DGeometryNode {
}

这个抽象节点类型是所有参数化几何体节点类型的基本类型。

cube 27.4 节点参考

27.4.1 Contour2D

Contour2D : X3DGroupingNode, X3DBoundedNode { 
  MFNode [in]     addChildren       [NurbsCurve|ContourPolyline2D]
  MFNode [in]     removeChildren    [NurbsCurve|ContourPolyline2D]
  MFNode [in,out] children       [] [NurbsCurve|ContourPolyline2D]
}

Contour2D 节点把一组曲线段(segment)组合为一个复合周线。所有的子段应形成一个封闭环,其中每一个子段的最后一个点将作为下一个依次相连的子段的第一个点,且第一个子段的第一个点将重复作为最后一个子段的最后一个点。段将由 NurbsCurve2D 节点或 ContourPolyline2D 节点定义,并在 children 域中按照周线的拓扑顺序依次相连地列出。

嵌套的 Contour2D 节点依照周线交替地指定有效的和无效的区域。Contour2D 还可以包含多个不相交的 Contour2D 节点。这允许在单一的外围的有效或无效区域中指定多个有效的和无效的区域。依照顺时针的计算的描述见 27.2.5 NURBS 修剪

27.4.2 ContourPolyline2D

ContourPolyline2D : X3DParametricGeometryNode {
  MFVec2f [in,out] point [] (-∞,∞);
}

ContourPolyline2D 节点定义了一个分段线性曲线段,这个曲线段是作为位于曲面 u-v 域上的裁剪周线的一部分的。

point 指定了分段线性曲线的终点。

ContourPolyline2D 被用于 Contour2D 组的子节点。

27.4.3 CoordinateDeformer

CoordinateDeformer : X3DGroupingNode, X3DBoundedNode { 
  MFNode   [in]     addChildren             [X3DShapeNode]
  MFNode   [in]     removeChildren          [X3DShapeNode]
  MFNode   [in,out] children       []       [X3DShapeNode]
  MFVec3f  [in,out] controlPoint   [] 
  MFNode   [in,out] inputCoord     []       [Coordinate]
  MFNode   [in,out] inputTransform []       [Transform]
  MFNode   [in,out] outputCoord    []       [Coordinate]
  MFFloat  [in,out] weight         []       (-∞,∞)
  SFVec3f  []       bboxCenter     0 0 0    (-∞,∞)
  SFVec3f  []       bboxSize       -1 -1 -1 (0,∞) or -1 -1 -1
  SFInt32  []       uDimension     0        (0,∞)
  MFDouble []       uKnot          []       (-∞,∞)  
  SFInt32  []       uOrder         2        (2,∞)
  SFInt32  []       vDimension     0        (0,∞)
  MFDouble []       vKnot          []       (-∞,∞)
  SFInt32  []       vOrder         2        (2,∞)
  SFInt32  []       wDimension     0        (0,∞)
  MFFloat  []       wKnot          []       (-∞,∞)
  SFInt32  []       wOrder         2        (2,∞)
}

CoordinateDeformer 允许通过使用一个 NURBS 容积(volume)来给一个 MFVec3f Coordinate 节点集施加自由变形(FFD - free form deformation)。概念上说,一个输入 Coordinate 节点集将放置到一个非一致格网容积中。如果格网上的控制点有动画或变形,输出的 Coordinate 节点也将相应地更新。

输入到变形器中的是一个 Coordinate 节点列表,其中每个 Coordinate 节点定义了一个用来计算的 3D 参数 (u,v,w) 。相应输出的笛卡尔值将根据 NURBS 控制格网来计算。children 子节点中将包含一个一般由 IndexedFaceSet 节点构成的场景图,其后 outputCoords 中变形过的 Coordinate 节点和这个场景图相关。

uDimensionvDimensionwDimensioncontrolPointweightuKnotvKnotwKnotuOrdervOrderwOrder 域定义了一个三维度的 NURBS。这些域的定义和其在 NurbsSurface 节点中的定义相似。

如果指定了 inputCoord 域,则其中应包括一组 Coordinate 节点。

outputCoord 域中应包括一组 Coordinate 节点。节点的数量和 inputCoord 中的节点数量应相等。这些节点将和 inputCoords 中的节点不同。

如果指定 inputTransform 域,应包含一组 Transform 节点,节点的数量和 inputCoord 中的节点数量应相等。

当动画 controlPoint 域时,IndexedFaceSet 节点按照 outputCoords 输出的 Coordinate 节点进行变形。输入的 Coordinate 节点中 point 域也可以相似地使用动画。通过改变 inputTransform 中 Transform 节点的参数,几何体可以在变形空间(空间翘曲)中移动。

CoordinateDeformer 是一个组节点,如果需要计算则应被视作变换层级的一部分。在 inputCoord Coordinate 中的点改变时,或 CoordinateDeformer 自身的 exposedField 改变时,或任何给定的 inputTransform 节点改变时,包含在 outputCoord 中 Coordinate 节点中的点都需要重新计算并更新。在 CoordinateDeformer 节点显示之前,执行可跳过甚至忽略计算;例如如果此节点不是当前遍历的场景图的一部份,或此节点的边界盒(或由 controlPoint 列表计算出的边界盒)在视点裁切范围外从而不渲染此节点时。

从某些角度来看,CoordinateDeformer 是一个特殊版本的 CoordinateInterpolator。CoordinateDeformer 是一个用来在场景图中进行位置动画的组节点。一般,X3D 插值器不定义边界盒也不裁切场景。建立 VisibilitySensor 输出到控制动画的 TimeSensor 节点的路由可以完成这样的行为。

以下是此节点的范例:

DEF FFD CoordinateDeformer {
  controlPoint [ ..... ]
  inputCoord  DEF inputCoord  
    Coordinate  { point [ ...] }
      outputCoord DEF outputCoord 
    Coordinate { point [] } 
      children Shape { 
        geometry IndexedFaceSet {
          coord USE outputCoord 
          coordIndex [ .... ]
       } 
   } 
 }
    ... # additional code to animate the FFDGrid goes here 

DEF Timer TimeSensor {}
DEF FFDGridInterpolator CoordinateInterpolator { ..... }
ROUTE FFDGridInterpolator.value_changed TO FFD.set_controlPoint
ROUTE Timer.fraction_changed O FFDGridInterpolator.set_fraction

如果给定的输入坐标值(可选地由相应的 Transform 节点矩阵变换)超出了某一个结矢量的参数化范围,则相应的输出坐标值将保持不变。这一般可以用来只变换坐标的子集或用不同的 CoordinateDeformer 节点来动画一个坐标节点的不同部分。

以下是运算此节点所用的伪代码方程:

function PerformDeformation() {
  for (n=0; n<inputCoords.length;i++) {
   Deform(inputCoord[i].point,MatrixOf(inputTransform[i]),outputCoord[i].point);
  }
}

function Deform(MFVec3f input, Matrix m, MFVec3f output)
  if (output.length < input.length) output.length = input.length;
  for (i=0; i<input.length;i++) {
    SFVec3f parameter = m * input[i];
    if (ParameterInRange(parameter)) {
      output[i] = NurbsEvaluate3(parameter);
    }
  } 
}
  Vec3f NurbsEvaluate3(SFVec3f parameter)
    -- evaluate standard NURBS formula

27.4.4 NurbsCurve

NurbsCurve : X3DParametricGeometryNode {
  MFVec3f  [in,out] controlPoint [] (-∞,∞)
  SFInt32  [in,out] tessellation 0  (-∞,∞)
  MFDouble [in,out] weight       [] (0,∞)
  MFDouble []       knot         [] (-∞,∞)
  SFInt32  []       order        3  [2,∞)
}

NurbsCurve 节点是一个几何节点,用来定义参数化的 B 样条(B-Spline)曲线。

order 域定义曲线的阶数。从数学上的观点看,曲线是由一个 order-1 次的多项式定义的。order 的值必须大于或等于 2。具体执行可能会限定阶数到某一数字。大多情况下阶数 3(二次多项式)和 4(三次多项式)就能够描述曲率。 曲线的控制点(control point)的数量最少应等于阶数。阶数还定义了一个给定控制点影响的相邻控制点的数量。

controlPoint(控制点)定义了一个分段线性曲线,其中控制点和曲线并不在一个一致空间上。基于权重(weight)值和阶数,这个分段线性曲线将由合成的参数化曲线逼近而成。控制点 (control point)的数量应大于或等于阶数。控制点全部定义为 x, y, z 域中的 3D 顶点。通过重复两端的限定控制点并指定一个周期结矢量(knot vector),可以指定一个 周期闭合的 B 样条曲线。

每个控制点将被赋予 weight(权重)值,且值应大于零。权重值的顺序和控制点值的顺序对应。如果一个控制点的权重大于 1,曲线将会更靠向这个点。然而如果给所有的权重都扩大一个因数,曲线的形状将不会改变。权重值的数量应和控制点值的数量相同。如果权重矢量的长度为 0,将假定每个控制点的权重为 1.0。

因为 X3D 中缺少 4D 坐标域类型,控制点和相应的权重值分开保存在的单独的域中。这种分开保存将允许对独立地对 controlPoint 域应用 CoordinateInterpolator 节点以进行动画。

knot(结)定义了结矢量。结的数量应等于控制点的数量加曲线的阶数。阶数应为非递减的。通过设置依次相连的结的值设置为相等且设置连续性的 程度为递减,来表示曲线有一个尖角。 一般曲线在一个结点的连续性为 Ck-1-m , 其中 k 为的阶数,m 为与依次相连的结等价的数。假设 k 为曲线的阶数,k 阶依次相连的结在矢量的终点或起点需要对曲线的最后终止控制点或起始控制点的做相应插值。不可能有 k-1 个以上的 结矢量等值的依次相连的结。 如果结矢量的长度为 0,将以缺省的统一的结矢量计算。

tessellation(镶嵌)域通过提供一个绝对细分步数给出了曲线镶嵌的提示。镶嵌值应大于或等于 order 域。镶嵌值 0 表示由浏览器选择合适的镶嵌方式。镶嵌值小于 0 时的解释将由执行模式来决定。

在细分一个表面到一个相等数量小块的执行步骤中,镶嵌值将按以下方式解释:

  1. 如果镶嵌值大于 0,镶嵌点的数量为 镶嵌值 +1;

  2. 如果镶嵌值小于 0,镶嵌点的数量为 (-镶嵌值 × (控制点的数量)+1);

  3. 如果镶嵌值为 0,镶嵌点的数量为 (2 × 控制点的数量)+1.

在基于弦长的镶嵌执行中,小于 0 的镶嵌值将被解释为最大的弦长偏差在像素级别。执行完全自动的镶嵌将可能忽略镶嵌这里的提示参数。

27.4.5 NurbsCurve2D

NurbsCurve2D : X3DParametricGeometryNode {
  MFVec2f  [in,out] controlPoint [] (-∞,∞)
  SFInt32  [in,out] tessellation 0  (-∞,∞)
  MFDouble [in,out] weight       [] (0,∞)
  MFDouble []       knot         [] (-∞,∞)
  SFInt32  []       order        3  [2,∞)
}

NurbsCurve2D 节点定义了一个裁剪曲线段,这个裁剪曲线段是作为位于曲面 u-v 域上的裁剪周线的一部分的。如果 NurbsCurve2D 形成了一个封闭的周线,则可以被用作一个 Contour2D 节点。

NurbsCurve2D 中其它方面的功能和 NurbsCurve 节点中定义的相同。

27.4.6 NurbsGroup

NurbsGroup : X3DGroupingNode, X3DBoundedNode {
  MFNode  [in]     addChildren                [NurbsSurface]
  MFNode  [in]     removeChildren             [NurbsSurface]
  MFNode  [in,out] children          []       [NurbsSurface]
  SFFloat [in,out] tessellationScale 1.0      (0,∞)
  SFVec3f []       bboxCenter        0 0 0    (-∞,∞)
  SFVec3f []       bboxSize          -1 -1 -1 (0,∞)|[-1 -1 -1]
}

NurbsGroup 节点将组合一组 NurbsSurface 节点到一个一般组节点中。这将提示浏览器把这组 NurbsSurface 是为一个单位,在镶嵌是对边界实施连续性的镶嵌。tessellationScale 参数是应用在低一级的子 NurbsSurface 节点镶嵌值上的缩放比例。如果一组 NurbsSurfaces 在边界使用匹配的控制点,则使用一般的镶嵌步骤。除此之外,NurbsGroup 的行为和一般 Group 节点相同。

27.4.7 NurbsPositionInterpolator

NurbsPositionInterpolator : X3DInterpolatorNode { 
  SFFloat  [in]     set_fraction     (-∞,∞)
  SFInt32  [in,out] dimension        0  (-∞,∞) 
  SFBool   [in,out] fractionAbsolute TRUE 
  MFVec3f  [in,out] keyValue         [] [0,1]
  MFDouble [in,out] keyWeight        [] (-∞,∞)
  MFDouble [in,out] knot             [] (-∞,∞)  
  SFInt32  [in,out] order            3  (2,∞)
  SFVec3f  [out]    value_changed
}

NurbsPositionInterpolator 使用 dimension、keyValue、keyWeight、knot、order 域描述了一个 3D NURBS 曲线,这些域的描述见 NurbsCurve 节点。

set_fraction 域和 value_changed 域和其在 PositionInterpolator 中的含义相同。

接受到 set_fraction 输入事件后将计算一个曲线上的 3D 位置,并将由 value_changed 域把值发送出去。set_fraction 值将作为镶嵌函数的输入值。knot 域对应一般插值器节点的 key 域;例如如果结矢量在 [0,2] 范围中而 set_fraction 值在 [0,1] 范围中,则只会计算到曲线的一半。

27.4.8 NurbsSurface

NurbsSurface : X3DParametricGeometryNode { 
  MFVec3f  [in,out] controlPoint  []   (-∞,∞)
  SFNode   [in,out] texCoord      []   [X3DTextureCoordinateNode]
  SFInt32  [in,out] uTessellation 0    (-∞,∞)
  SFInt32  [in,out] vTessellation 0    (-∞,∞)
  MFDouble [in,out] weight        []   (0,∞)
  SFBool   []       ccw           TRUE
  SFBool   []       solid         TRUE
  SFInt32  []       uDimension    0    [0,∞)
  MFDouble []       uKnot         []   (-∞,∞)
  SFInt32  []       uOrder        3    [2,∞)
  SFInt32  []       vDimension    0    [0,∞)
  MFDouble []       vKnot         []   (-∞,∞)
  SFInt32  []       vOrder        3    [2,∞)
}

uDimensionvDimension 定义了 u 维和 v 维上控制点的数量。

uOrdervOrder 定义了表面的阶数。从数学上的观点看,曲面是由一个 order-1 次的多项式定义的。曲线的阶数 uOrdervOrder 的值必须大于或等于 2具体执行可能会限定阶数 uOrdervOrder 到某一数字。大多情况下阶数 3(二次多项式)和 4(三次多项式)就能够描述曲率。曲线的控制点的数量最少应等于阶数。阶数还定义了一个给定控制点影响的相邻控制点的数量。

controlPoint 定义了一个二维的 uDimension × vDimension 个控制点的集。这个点集定义了一个网格,其中控制点和这个网格并不在一个一致空间上。基于权重值和阶数这个外壳将由合成的表面逼近而成。uDimension 点定义了一个 u 方向上的多线以及其后的升阶的附带 v 参数的 u - 多线。控制点的数量应大于或等于阶数。通过重复限定控制点,可以指定一个闭合的 B 样条曲面。

控制顶点(CV - control vertex)对应了控制格网上的控制点 P[i, j]:

    P[i,j].x = controlPoints[i + ( j × uDimension)].x
    P[i,j].y = controlPoints[i + ( j × uDimension)].y
    P[i,j].z = controlPoints[i + ( j × uDimension)].z
    P[i,j].w = weight[ i + (j × uDimension)]

    其中	0 ≤ i < uDimension 且 
        0 ≤ j < vDimension.

赋予每个控制点 weight(权重)值应大于零。权重值的顺序和控制点值的顺序对应。如果一个控制点的权重大于 1,表面将会更靠向这个点。权重值的数量应和控制点值的数量相同。如果权重矢量的长度为 0,将假定每个控制点的权重为 1.0。

控制点和相应的权重值分开保存在的单独的域中。这种分开保存将允许对独立地对 controlPoint 域应用 CoordinateInterpolator 节点以进行动画。

uKnotsvKnots 定义了结矢量。结的数量应等于控制点的数量加曲线的阶数。阶数应为非递减的。通过设置依次相连的结的值设置为相等且设置连续性的程度为递减,来表示表面有一个折皱。假设 k 为曲线的阶数,k 阶依次相连的结在矢量的终点或起点将是曲线会聚到相应的终止控制点或起始控制点。不可能有 k-1 个以上的结矢量等值的依次相连的结。如果结矢量的长度为 0,将以缺省的统一的结矢量计算。

uTessellationvTessellation 提供了一个表面镶嵌的提示,u/v Tessellation ≥ u/v。阶数设置一个绝对细分的步数,0 表示由浏览器选择合适的镶嵌方式。镶嵌值小于 0 时的解释将由执行模式来决定。

在细分一个表面到一个相等数量小块的执行步骤中,镶嵌值将按以下方式解释:

在基于弦长的镶嵌执行中,小于 0 的镶嵌值将被解释为最大的弦长偏差在像素级别。执行完全自动的镶嵌将可能忽略镶嵌这里的提示参数。

texCoord 提供了如何生成纹理坐标的信息。缺省情况下,纹理坐标位于参数化细分生成的四方形单位中 。NurbsSurfaceTextureCoordinate 节点或 TextureCoordinate 节点能给 NurbsSurface 设定 u/v 方向的参数,以用来计算纹理坐标。NurbsSurfaceTextureCoordinate 也可以用来给非动画的曲面指定基于弦长的参数化纹理坐标。

ccwsolid 的定义和其它 X3D 几何体节点相同。solid TRUE 将允许双面光照,法线将被反转到视点并优先描影。

27.4.9 NurbsTextureSurface

NurbsTextureSurface : X3DTextureCoordinateNode { 
  MFVec2f  [in,out] controlPoint [] (-∞,∞)
  MFFloat  [in,out] weight       [] (0,∞)
  SFInt32  []       uDimension   0  [0,∞)
  MFDouble []       uKnot        [] (-∞,∞)
  SFInt32  []       uOrder       3  [2,∞)
  SFInt32  []       vDimension   0  [0,∞)
  MFDouble []       vKnot        [] (-∞,∞)
  SFInt32  []       vOrder       3  [2,∞)
}

NurbsTextureSurface 节点是存在于其主表面参数域的一个 NURBS 曲面,用来为其主表面指定贴图坐标。

相关域的参数和 NurbsSurface 节点中指定的相似,不过这里的控制点是指定在 (u, v) 坐标中的。

镶嵌处理将生成一个 2D 纹理坐标。如果没有定义 NurbsTextureSurface,纹理坐标将基于参数化步尺寸的原则有由客户端计算。常规的顶点参数将不应用到 NURBS 上,因为只有在多边形化以后三角形才可用,当可以使用常规的纹理变换。

NurbsTextureSurface 节点保存或访问都通过 NurbsSurface 节点的 texCoord 域。单独出现的 NurbsTextureSurface 节点将被忽略。

27.4.10 TrimmedSurface

TrimmedSurface : X3DParametricGeometryNode { 
  MFNode [in]     addTrimmingContour         [Contour2D]
  MFNode [in]     removeTrimmingContour      [Contour2D]
  SFNode [in,out] surface               NULL [NurbsSurface]
  MFNode [in,out] trimmingContour       []   [Contour2D]
}

TrimmedSurface 节点定义了一个由一个修剪环修剪的 NURBS 曲面。最外面的修剪环的导向必须是逆时针。

surface 域应包含一个将被修剪的 NurbsSurface 节点。

如果指定了 trimmingContour 域,则其中应包括一组 Contour2D 节点。处理修剪环的描述见 Contour2D 节点。

cube 27.5 支持级别

Non-uniform rational B-spline (NURBS) 组件提供 表 27.2 中规定的两个支持级别。

表 27.2 — NURBS 组件支持级别

级别
Level
必备条件 节点/特性 节点/特性
1 Core 1
Grouping 1
Geometric property 1
Interpolator 1
Texturing 1
X3DParametricGeometryNode (抽象) n/a
CoordinateDeformer 所有域
NurbsCurve 所有域
NurbsGroup 所有域
NurbsPositionInterpolator 所有域
NurbsSurface 所有域
NurbsTextureSurface 所有域
2 Core 1
Grouping 1
Geometric property 1
Interpolator 1
Texturing 1
Level 1 的所有 NURBS 节点 Level 1 中支持的所有域
Contour2D 所有域
NurbsCurve2D 所有域
ContourPolyline2D 所有域
TrimmedSurface 所有域
--- X3D separator bar --- Site Meter