标题：gluNurbsSurface
名称
gluNurbsSurface
帮助
English HelpNAME
gluNurbsSurface -- define the shape of a NURBS surface 
C SPECIFICATION
void gluNurbsSurface(GLUnurbsObj *nobj,
GLint sknot_count,
GLfloat *sknot,
GLint tknot_count,
GLfloat *tknot,
GLint s_stride,
GLint t_stride,
GLfloat *ctlarray,
GLint sorder,
GLint torder,
GLenum type)
PARAMETERS
nobj
Specifies the NURBS object (created with gluNewNurbsRenderer).
sknot_count
Specifies the number of knots in the parametric s direction.
sknot
Specifies an array of sknot_count nondecreasing knot values in the parametric s direction.
tknot_count
Specifies the number of knots in the parametric t direction.
tknot
Specifies an array of tknot_count nondecreasing knot values in the parametric t direction.
s_stride
Specifies the offset (as a number of single-precision floating point values) between successive control points in the parametric s direction in ctlarray.
t_stride
Specifies the offset (in single-precision floating-point values) between successive control points in the parametric t direction in ctlarray.
ctlarray
Specifies an array containing control points for the NURBS surface. The offsets between successive control points in the parametric s and t directions are given by s_stride and t_stride.
sorder
Specifies the order of the NURBS surface in the parametric s direction. The order is one more than the degree, hence a surface that is cubic in s has a sorder of 4.
torder
Specifies the order of the NURBS surface in the parametric t direction. The order is one more than the degree, hence a surface that is cubic in t has a torder of 4.
type
Specifies type of the surface. type can be any of the valid two-dimensional evaluator types (such as GL_MAP2_VERTEX_3 or GL_MAP2_COLOR_4). 
DESCRIPTION
Use gluNurbsSurface within a NURBS (Non-Uniform Rational B-Spline) surface definition to describe the shape of a NURBS surface (before any trimming). To mark the beginning of a NURBS surface definition, use the gluBeginSurface command. To mark the end of a NURBS surface definition, use the gluEndSurface command. Call gluNurbsSurface within a NURBS surface definition only.
Positional, texture, and color coordinates are associated with a surface by presenting each as a separate gluNurbsSurface between a gluBeginSurface / gluEndSurface pair. No more than one call to gluNurbsSurface for each of color, position, and texture data can be made within a single gluBeginSurface / gluEndSurface pair. Exactly one call must be made to describe the position of the surface (a type of GL_MAP2_VERTEX_3 or GL_MAP2_VERTEX_4).
A NURBS surface can be trimmed by using the commands gluNurbsCurve and gluPwlCurve between calls to gluBeginTrim and gluEndTrim.
Note that a gluNurbsSurface with sknot_count knots in the s direction and tknot_count knots in the t direction with orders sorder and torder must have (sknot_count - sorder) * (tknot_count - torder) control points. 
EXAMPLE
The following commands render a textured NURBS surface with normals; the texture coordinates and normals are also NURBS surfaces: 
gluBeginSurface(nobj);
gluNurbsSurface(nobj, ..., GL_MAP2_TEXTURE_COORD_2);
gluNurbsSurface(nobj, ..., GL_MAP2_NORMAL);
gluNurbsSurface(nobj, ..., GL_MAP2_VERTEX_4);
gluEndSurface(nobj);
中文帮助gluNurbsSurface函数 收藏 
NURBS的两种表示
通常，一个NURBS曲面F(s,t)包含三个要素：
控制顶点（x,y,z），节点序列(s,t)和权因子(w)，
或者说是
带权控制顶点（x*w,y*w,z*w,w）和节点序列(s,t)。
OpenGL中提供了对两类曲面的绘制：
type=4：GL_MAP2_VERTEX_4 控制顶点带权，每个点记为（x*w,y*w,z*w,w）
type=3：GL_MAP2_VERTEX_3 控制顶点权都为1，每个点记为（x,y,z）
第二种情况就是通常的B样条曲面，本文代码考虑的是第一种情况。
1.2 NURBS的基本关系式
假设曲面F(s,t)在s，t方向阶数分别为sorder，torder，控制网格和节点序列分别为
GLfloat ctrlpoints[s_count][t_count][type], //控制网格
GLfloat sknot[sknot_count], //s节点序列
GLfloat tknot[tknot_count], //t节点序列
那么，OpenGL中，控制网格和节点序列的大小必须满足
sknot_count = s_count + sorder
tknot_count = t_count + torder
2. NURBS曲面的绘制
OpenGL中的gluNurbsSurface()函数是绘制NURBS曲线曲面的关键函数，其函数原型定义如下
void gluNurbsSurface(
GLUnurbsObj * nobj, 　 //NURBS曲面对象
GLint sknot_count, //s方向节点数目
GLfloat * sknot, //s方向节点数组指针
GLint tknot_count, //t方向节点数目
GLfloat * tknot, //t方向节点数组指针
GLint s_stride, //s方向控制点数据跨度
GLint t_stride, //t方向控制点数据跨度
GLfloat * ctlarray, //控制点数组指针
GLint sorder, //s方向上多项式阶数
GLint torder, //t方向上多项式阶数
GLenum type //确定求值器类型
);
该函数的参数包括：
2.1 NURBS对象： GLUnurbsObj *nobj
绘制NURBS曲面之前，必须创建一个NURBS对象并设定其属性,例如
nobj = gluNewNurbsRenderer(); 
gluNurbsProperty(nobj , GLU_SAMPLING_TOLERANCE, 20);
gluNurbsProperty(nobj , GLU_DISPLAY_MODE, GLU_FILL);[Page]
2.2 曲线阶数
GLint sorder,
GLint torder,
对应两个方向的阶数
2.3 节点序列
GLint sknot_count,
GLfloat * sknot,
GLint tknot_count,
GLfloat * tknot,
需要指定指针，数组大小。
2.4 控制网格
GLfloat * ctlarray, 
GLint s_stride, 
GLint t_stride,
a）这里，控制网格被保存到一个一维数组里面，所以，如果我们定义控制网格为
GLfloat ***ctrlpoints；
在非配空间时，我们必须保证整个网格数据保存与一个连续区域里面。
b）假设控制网格为ctrlpoints[s_count][t_count][4]
如果控制网格以行优先保存进入ctlarray，那么
s_stride = 4 * t_count//注意 此处的t_count是控制点第二坐标值
t_stride = 4
反之，如果控制网格以列优先保存进入ctlarray，那么
s_stride = 4
t_stride = 4 * s_count
2.5 求值器类型
GL_MAP2_VERTEX_4
GL_MAP2_VERTEX_3
举例：
gluNurbsSurface(theNurb3,11,knot1,11,knot2,3*7,3,&ctrl[0][0][0],4,4,GL_MAP2_VERTEX_3);
为双三次b样条曲面，其中11表示两个方向节点个数，ctrl存储控制点！