---
name: "SoNurbsSurface"
section: "3"
platform: "linux"
package: "coin"
version: "1:4.0.10-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/SoNurbsSurface"
---

# SoNurbsSurface(3)

The SoNurbsSurface class is used to render smooth surfaces.

## NAME

SoNurbsSurface - The **SoNurbsSurface** class is used to render smooth surfaces.

## SYNOPSIS

\#include \<Inventor/nodes/SoNurbsSurface.h\>

Inherits **SoShape**.

### Public Member Functions

virtual **SoType** **getTypeId** (void) const\
 **SoNurbsSurface** (void)\
 virtual void **GLRender** (**SoGLRenderAction** \*action)\
 virtual void **rayPick** (**SoRayPickAction** \*action)\
 virtual void **getPrimitiveCount** (**SoGetPrimitiveCountAction** \*action)\
 void **sendPrimitive** (**SoAction** \*, **SoPrimitiveVertex** \*)\

Public Member Functions inherited from **SoShape** virtual SbBool **affectsState** (void) const\
 virtual void **notify** (**SoNotList** \*nl)\
 virtual void **getBoundingBox** (**SoGetBoundingBoxAction** \*action)\
 virtual void **callback** (**SoCallbackAction** \*action)\
 const **SoBoundingBoxCache** \* **getBoundingBoxCache** (void) const\

Public Member Functions inherited from **SoNode** void **setOverride** (const SbBool state)\
 SbBool **isOverride** (void) const\
 void **setNodeType** (const **NodeType** type)\
 **NodeType** **getNodeType** (void) const\
 virtual **SoNode** \* **copy** (SbBool copyconnections=FALSE) const\
 virtual void **doAction** (**SoAction** \*action)\
 virtual void **GLRenderBelowPath** (**SoGLRenderAction** \*action)\
 virtual void **GLRenderInPath** (**SoGLRenderAction** \*action)\
 virtual void **GLRenderOffPath** (**SoGLRenderAction** \*action)\
 virtual void **getMatrix** (**SoGetMatrixAction** \*action)\
 virtual void **handleEvent** (**SoHandleEventAction** \*action)\
 virtual void **pick** (**SoPickAction** \*action)\
 virtual void **search** (**SoSearchAction** \*action)\
 virtual void **write** (**SoWriteAction** \*action)\
 virtual void **audioRender** (**SoAudioRenderAction** \*action)\
 virtual void **grabEventsSetup** (void)\
 virtual void **grabEventsCleanup** (void)\
 virtual void **startNotify** (void)\
 SbUniqueId **getNodeId** (void) const\
 virtual **SoChildList** \* **getChildren** (void) const\
 virtual void **writeInstance** (**SoOutput** \*out)\
 virtual **SoNode** \* **addToCopyDict** (void) const\
 virtual void **copyContents** (const **SoFieldContainer** \*from, SbBool copyconnections)\
 virtual **SoFieldContainer** \* **copyThroughConnection** (void) const\

Public Member Functions inherited from **SoFieldContainer** void **setToDefaults** (void)\
 SbBool **hasDefaultValues** (void) const\
 SbBool **fieldsAreEqual** (const **SoFieldContainer** \*container) const\
 void **copyFieldValues** (const **SoFieldContainer** \*container, SbBool copyconnections=FALSE)\
 SbBool **set** (const char \*const fielddata)\
 void **get** (**SbString** &fielddata)\
 virtual int **getFields** (**SoFieldList** &l) const\
 virtual int **getAllFields** (**SoFieldList** &l) const\
 virtual **SoField** \* **getField** (const **SbName** &name) const\
 virtual **SoField** \* **getEventIn** (const **SbName** &name) const\
 virtual **SoField** \* **getEventOut** (const **SbName** &name) const\
 SbBool **getFieldName** (const **SoField** \*const field, **SbName** &name) const\
 SbBool **enableNotify** (const SbBool flag)\
 SbBool **isNotifyEnabled** (void) const\
 SbBool **set** (const char \*fielddata, **SoInput** \*input)\
 void **get** (**SbString** &fielddata, **SoOutput** \*out)\
 virtual SbBool **validateNewFieldValue** (**SoField** \*field, void \*newval)\
 virtual void **addWriteReference** (**SoOutput** \*out, SbBool isfromfield=FALSE)\
 SbBool **getIsBuiltIn** (void) const\
 virtual void **getFieldsMemorySize** (size\_t &managed, size\_t &unmanaged) const\
 void **setUserData** (void \*userdata) const\
 void \* **getUserData** (void) const\

Public Member Functions inherited from **SoBase** void **ref** (void) const\
 void **unref** (void) const\
 void **unrefNoDelete** (void) const\
 int32\_t **getRefCount** (void) const\
 void **touch** (void)\
 SbBool **isOfType** (**SoType** type) const\
 Returns TRUE if the type of this object is either of the same type or inherited from *type*.  virtual **SbName** **getName** (void) const\
 virtual void **setName** (const **SbName** &newname)\
 void **addAuditor** (void \*const auditor, const **SoNotRec::Type** type)\
 void **removeAuditor** (void \*const auditor, const **SoNotRec::Type** type)\
 const **SoAuditorList** & **getAuditors** (void) const\
 SbBool **shouldWrite** (void)\
 void **assertAlive** (void) const\

### Static Public Member Functions

static **SoType** **getClassTypeId** (void)\
 static void **initClass** (void)\

Static Public Member Functions inherited from **SoShape** static **SoType** **getClassTypeId** (void)\
 static void **initClass** (void)\
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.     static void **getScreenSize** (**SoState** \*const state, const **SbBox3f** &boundingbox, **SbVec2s** &rectsize)\
 static float **getDecimatedComplexity** (**SoState** \*state, float complexity)\

Static Public Member Functions inherited from **SoNode** static uint32\_t **getCompatibilityTypes** (const **SoType** &nodetype)\
 static **SoType** **getClassTypeId** (void)\
 static **SoNode** \* **getByName** (const **SbName** &name)\
 static int **getByName** (const **SbName** &name, **SoNodeList** &l)\
 static void **initClass** (void)\
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.     static void **initClasses** (void)\
 static SbUniqueId **getNextNodeId** (void)\
 static int **getActionMethodIndex** (const **SoType** type)\
 static void **getBoundingBoxS** (**SoAction** \*action, **SoNode** \*node)\
 static void **GLRenderS** (**SoAction** \*action, **SoNode** \*node)\
 static void **callbackS** (**SoAction** \*action, **SoNode** \*node)\
 static void **getMatrixS** (**SoAction** \*action, **SoNode** \*node)\
 static void **handleEventS** (**SoAction** \*action, **SoNode** \*node)\
 static void **pickS** (**SoAction** \*action, **SoNode** \*node)\
 static void **rayPickS** (**SoAction** \*action, **SoNode** \*node)\
 static void **searchS** (**SoAction** \*action, **SoNode** \*node)\
 static void **writeS** (**SoAction** \*action, **SoNode** \*node)\
 static void **audioRenderS** (**SoAction** \*action, **SoNode** \*node)\
 static void **getPrimitiveCountS** (**SoAction** \*action, **SoNode** \*node)\

Static Public Member Functions inherited from **SoFieldContainer** static void **initClass** (void)\
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.     static **SoType** **getClassTypeId** (void)\
 This static method returns the **SoType** object associated with objects of this class.     static void **cleanupClass** (void)\
 static void **initCopyDict** (void)\
 static void **addCopy** (const **SoFieldContainer** \*orig, const **SoFieldContainer** \*copy)\
 static **SoFieldContainer** \* **checkCopy** (const **SoFieldContainer** \*orig)\
 static **SoFieldContainer** \* **findCopy** (const **SoFieldContainer** \*orig, const SbBool copyconnections)\
 static void **copyDone** (void)\

Static Public Member Functions inherited from **SoBase** static void **initClass** (void)\
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.  static **SoType** **getClassTypeId** (void)\
 This static method returns the **SoType** object associated with objects of this class.  static void **addName** (**SoBase** \*const base, const char \*const name)\
 static void **removeName** (**SoBase** \*const base, const char \*const name)\
 static void **incrementCurrentWriteCounter** (void)\
 static void **decrementCurrentWriteCounter** (void)\
 static **SoBase** \* **getNamedBase** (const **SbName** &name, **SoType** type)\
 static int **getNamedBases** (const **SbName** &name, **SoBaseList** &baselist, **SoType** type)\
 static SbBool **read** (**SoInput** \*input, **SoBase** \*&base, **SoType** expectedtype)\
 static void **setInstancePrefix** (const **SbString** &c)\
 static void **setTraceRefs** (SbBool trace)\
 static SbBool **getTraceRefs** (void)\
 static SbBool **connectRoute** (**SoInput** \*input, const **SbName** &fromnodename, const **SbName** &fromfieldname, const **SbName** &tonodename, const **SbName** &tofieldname)\
 static SbBool **readRoute** (**SoInput** \*input)\

### Public Attributes

**SoSFInt32** **numUControlPoints**\
 **SoSFInt32** **numVControlPoints**\
 **SoSFInt32** **numSControlPoints**\
 **SoSFInt32** **numTControlPoints**\
 **SoMFFloat** **uKnotVector**\
 **SoMFFloat** **vKnotVector**\
 **SoMFFloat** **sKnotVector**\
 **SoMFFloat** **tKnotVector**\

### Protected Member Functions

virtual const **SoFieldData** \* **getFieldData** (void) const\
 virtual **~SoNurbsSurface** ()\
 virtual void **generatePrimitives** (**SoAction** \*action)\
 virtual void **computeBBox** (**SoAction** \*action, **SbBox3f** &box, **SbVec3f** &center)\
 **SoDetail** \* **createTriangleDetail** (**SoRayPickAction** \*action, const **SoPrimitiveVertex** \*v1, const **SoPrimitiveVertex** \*v2, const **SoPrimitiveVertex** \*v3, **SoPickedPoint** \*pp)\

Protected Member Functions inherited from **SoShape** **SoShape** (void)\
 virtual **~SoShape** ()\
 float **getComplexityValue** (**SoAction** \*action)\
 virtual SbBool **shouldGLRender** (**SoGLRenderAction** \*action)\
 void **beginSolidShape** (**SoGLRenderAction** \*action)\
 void **endSolidShape** (**SoGLRenderAction** \*action)\
 void **GLRenderBoundingBox** (**SoGLRenderAction** \*action)\
 SbBool **shouldPrimitiveCount** (**SoGetPrimitiveCountAction** \*action)\
 SbBool **shouldRayPick** (**SoRayPickAction** \*const action)\
 void **computeObjectSpaceRay** (**SoRayPickAction** \*const action)\
 void **computeObjectSpaceRay** (**SoRayPickAction** \*const action, const **SbMatrix** &matrix)\
 virtual **SoDetail** \* **createLineSegmentDetail** (**SoRayPickAction** \*action, const **SoPrimitiveVertex** \*v1, const **SoPrimitiveVertex** \*v2, **SoPickedPoint** \*pp)\
 virtual **SoDetail** \* **createPointDetail** (**SoRayPickAction** \*action, const **SoPrimitiveVertex** \*v, **SoPickedPoint** \*pp)\
 void **invokeTriangleCallbacks** (**SoAction** \*const action, const **SoPrimitiveVertex** \*const v1, const **SoPrimitiveVertex** \*const v2, const **SoPrimitiveVertex** \*const v3)\
 void **invokeLineSegmentCallbacks** (**SoAction** \*const action, const **SoPrimitiveVertex** \*const v1, const **SoPrimitiveVertex** \*const v2)\
 void **invokePointCallbacks** (**SoAction** \*const action, const **SoPrimitiveVertex** \*const v)\
 void **beginShape** (**SoAction** \*const action, const **TriangleShape** shapetype, **SoDetail** \*const detail=NULL)\
 void **shapeVertex** (const **SoPrimitiveVertex** \*const v)\
 void **endShape** (void)\
 void **generateVertex** (**SoPrimitiveVertex** \*const pv, const **SbVec3f** &point, const SbBool useTexFunc, const **SoMultiTextureCoordinateElement** \*const tce, const float s, const float t, const **SbVec3f** &normal)\
 void **generateVertex** (**SoPrimitiveVertex** \*const pv, const **SbVec3f** &point, const SbBool useTexFunc, const **SoMultiTextureCoordinateElement** \*const tce, const float s, const float t, const float r, const **SbVec3f** &normal)\
 SbBool **startVertexArray** (**SoGLRenderAction** \*action, const **SoCoordinateElement** \*coords, const **SbVec3f** \*pervertexnormals, const SbBool texpervertex, const SbBool colorpervertex)\
 void **finishVertexArray** (**SoGLRenderAction** \*action, const SbBool vbo, const SbBool normpervertex, const SbBool texpervertex, const SbBool colorpervertex)\

Protected Member Functions inherited from **SoNode** **SoNode** (void)\
 virtual **~SoNode** ()\
 virtual SbBool **readInstance** (**SoInput** \*in, unsigned short flags)\

Protected Member Functions inherited from **SoFieldContainer** **SoFieldContainer** (void)\
 virtual **~SoFieldContainer** ()\

Protected Member Functions inherited from **SoBase** **SoBase** (void)\
 virtual **~SoBase** ()\
 virtual void **destroy** (void)\
 SbBool **hasMultipleWriteRefs** (void) const\
 SbBool **writeHeader** (**SoOutput** \*out, SbBool isgroup, SbBool isengine) const\
 void **writeFooter** (**SoOutput** \*out) const\
 virtual const char \* **getFileFormatName** (void) const\
 virtual **SoNotRec** **createNotRec** (void)\

### Static Protected Member Functions

static const **SoFieldData** \*\* **getFieldDataPtr** (void)\

Static Protected Member Functions inherited from **SoShape** static const **SoFieldData** \*\* **getFieldDataPtr** (void)\

Static Protected Member Functions inherited from **SoNode** static const **SoFieldData** \*\* **getFieldDataPtr** (void)\
 static void **setNextActionMethodIndex** (int index)\
 static int **getNextActionMethodIndex** (void)\
 static void **incNextActionMethodIndex** (void)\
 static void **setCompatibilityTypes** (const **SoType** &nodetype, const uint32\_t bitmask)\

Static Protected Member Functions inherited from **SoBase** static uint32\_t **getCurrentWriteCounter** (void)\
 static void **staticDataLock** (void)\
 static void **staticDataUnlock** (void)\

### Additional Inherited Members

Public Types inherited from **SoShape** enum **TriangleShape** { **TRIANGLE\_STRIP**, **TRIANGLE\_FAN**, **TRIANGLES**, **POLYGON**, **QUADS**, **QUAD\_STRIP**, **POINTS**, **LINES**, **LINE\_STRIP** }\

Public Types inherited from **SoNode** enum **NodeType** { **INVENTOR** = 0x0000, **VRML1** = 0x0001, **VRML2** = 0x0002, **INVENTOR\_1** = 0x0004, **INVENTOR\_2\_0** = 0x0008, **INVENTOR\_2\_1** = 0x0010, **INVENTOR\_2\_5** = 0x0020, **INVENTOR\_2\_6** = 0x0040, **COIN\_1\_0** = 0x0080, **COIN\_2\_0** = 0x0100, **EXTENSION** = 0x0200, **COIN\_2\_2** = 0x0400, **COIN\_2\_3** = 0x0800, **COIN\_2\_4** = 0x1000, **INVENTOR\_5\_0** = 0x2000, **COIN\_2\_5** = 0x4000, **COIN\_3\_0** = 0x8000, **INVENTOR\_6\_0** = 0x10000, **COIN\_4\_0** = 0x20000 }\

Protected Types inherited from **SoBase** enum **BaseFlags** { **IS\_ENGINE** = 0x01, **IS\_GROUP** = 0x02 }\

Protected Attributes inherited from **SoNode** SbUniqueId **uniqueId**\

Protected Attributes inherited from **SoFieldContainer** SbBool **isBuiltIn**\

Static Protected Attributes inherited from **SoNode** static SbUniqueId **nextUniqueId** = 1\
 static int **nextActionMethodIndex** = 0\

## Detailed Description

The **SoNurbsSurface** class is used to render smooth surfaces.

A general explanation of NURBS is beyond the scope of the Coin documentation. For detailed information, refer to the specialized literature on the topic (for example "An Introduction to NURBS: WithHistorical Perspective" by David F. Rogers). A basic overview of curve and surface rendering using NURBS can be found in chapter 8 of "The Inventor Mentor".

Note that knot values should be specified as \[0, 1, 2,..., a\] rather than \[0, 1/a, 2/a,..., 1\] to avoid tessellation errors due to floating point precision problems. (Even if the rendered surface *looks* correct, such issues might surface when e.g. doing picking, since the tessellated representation used internally is not the same as the one you see rendered by OpenGL on-screen.)

Each control point has a weight that changes the shape of its basis function. Weight is analogous to having magnets pulling on the curve. Coordinate3 sets control points to have an equal weight of 1.0 (nonrational). Use Coordinate4 to specify x, y, z and weight values (rational).

A basic usage example:

```
#Inventor V2.1 ascii
ShapeHints {
  vertexOrdering COUNTERCLOCKWISE
}
Coordinate3 {
   point [
     -3 -3 -3, -3 -1 -3, -3  1 -3, -3  3 -3,
     -1 -3 -3, -1 -1  3, -1  1  3, -1  3 -3,
      1 -3 -3,  1 -1  3,  1  1  3,  1  3 -3,
      3 -3 -3,  3 -1 -3,  3  1 -3,  3  3 -3
    ]
}
NurbsSurface {
   numUControlPoints 4
   numVControlPoints 4
   uKnotVector [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0 ]
   vKnotVector [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0 ]
}
```

**FILE FORMAT/DEFAULTS:**

```
NurbsSurface {
    numUControlPoints 0
    numVControlPoints 0
    numSControlPoints 0
    numTControlPoints 0
    uKnotVector 0
    vKnotVector 0
    sKnotVector 0
    tKnotVector 0
}
```

## Constructor & Destructor Documentation

### SoNurbsSurface::SoNurbsSurface (void )

Constructor.

### SoNurbsSurface::~SoNurbsSurface () \[protected\], \[virtual\]

Destructor.

## Member Function Documentation

### SoType SoNurbsSurface::getClassTypeId (void ) \[static\]

This static method returns the **SoType** object associated with objects of this class.

### SoType SoNurbsSurface::getTypeId (void ) const \[virtual\]

Returns the type identification of an object derived from a class inheriting **SoBase**. This is used for runtime type checking and "downward" casting.

Reimplemented from **SoShape**.

### const SoFieldData \*\* SoNurbsSurface::getFieldDataPtr (void ) \[static\], \[protected\]

*This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.*\

 Returns the **SoFieldData** class which holds information about fields in this node.

### const SoFieldData \* SoNurbsSurface::getFieldData (void ) const \[protected\], \[virtual\]

Returns a pointer to the class-wide field data storage object for this instance. If no fields are present, returns NULL.

Reimplemented from **SoShape**.

### void SoNurbsSurface::initClass (void ) \[static\]

### void SoNurbsSurface::GLRender (SoGLRenderAction \* action) \[virtual\]

Action method for the **SoGLRenderAction**.

This is called during rendering traversals. Nodes influencing the rendering state in any way or want to throw geometry primitives at OpenGL override this method.

Reimplemented from **SoShape**.

### void SoNurbsSurface::rayPick (SoRayPickAction \* action) \[virtual\]

Calculates picked point based on primitives generated by subclasses.

Reimplemented from **SoShape**.

### void SoNurbsSurface::getPrimitiveCount (SoGetPrimitiveCountAction \* action) \[virtual\]

Action method for the **SoGetPrimitiveCountAction**.

Calculates the number of triangle, line segment and point primitives for the node and adds these to the counters of the *action*.

Nodes influencing how geometry nodes calculate their primitive count also override this method to change the relevant state variables.

Reimplemented from **SoShape**.

### void SoNurbsSurface::sendPrimitive (SoAction \* , SoPrimitiveVertex \* )

This method is part of the original SGI Inventor API, but not implemented in Coin, as it looks like a method that should probably have been private in Open Inventor.

### void SoNurbsSurface::generatePrimitives (SoAction \* action) \[protected\], \[virtual\]

The method implements action behavior for shape nodes for **SoCallbackAction**. It is invoked from **SoShape::callback()**. (Subclasses should *not* override **SoNode::callback()**.)

The subclass implementations uses the convenience methods **SoShape::beginShape()**, **SoShape::shapeVertex()**, and **SoShape::endShape()**, with **SoDetail** instances, to pass the primitives making up the shape back to the caller.

Implements **SoShape**.

### void SoNurbsSurface::computeBBox (SoAction \* action, SbBox3f & box, SbVec3f & center) \[protected\], \[virtual\]

Calculates the bounding box of all control points, and sets the center to the average of these points.

Implements **SoShape**.

### SoDetail \* SoNurbsSurface::createTriangleDetail (SoRayPickAction \* action, const SoPrimitiveVertex \* v1, const SoPrimitiveVertex \* v2, const SoPrimitiveVertex \* v3, SoPickedPoint \* pp) \[protected\], \[virtual\]

Will create triangle detail for a **SoPickedPoint**. This method will only be called internally, when **generatePrimitives()** is used for picking (**SoShape::rayPick()** is not overridden).

This method returns NULL in Open Inventor, and subclasses will need to override this method to create details for a **SoPickedPoint**.

This is not necessary with Coin. Of course, if you choose to override it, it will work in the same way as Open Inventor.

For this to work, you must supply a face or line detail when generating primitives. If you supply NULL for the detail argument in **SoShape::beginShape()**, you'll have to override this method.

Reimplemented from **SoShape**.

## Member Data Documentation

### SoSFInt32 SoNurbsSurface::numUControlPoints

Number of control points in the U direction.

### SoSFInt32 SoNurbsSurface::numVControlPoints

Number of control points in the V direction.

### SoSFInt32 SoNurbsSurface::numSControlPoints

Number of control points in the S direction.

### SoSFInt32 SoNurbsSurface::numTControlPoints

Number of control points in the T direction.

### SoMFFloat SoNurbsSurface::uKnotVector

The Bezier knot vector for the U direction.

### SoMFFloat SoNurbsSurface::vKnotVector

The Bezier knot vector for the V direction.

### SoMFFloat SoNurbsSurface::sKnotVector

The Bezier knot vector for the S direction.

### SoMFFloat SoNurbsSurface::tKnotVector

The Bezier knot vector for the T direction.

## Author

Generated automatically by Doxygen for Coin from the source code.
