gluNurbsSurface

gluNurbsSurface shape surface

gluNurbsSurface

English Help

NAME
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存儲控制點!

相關詞條

相關搜尋

熱門詞條

聯絡我們