请输入您要查询的百科知识:

 

词条 gluNurbsSurface
释义

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存储控制点!

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/4 2:48:18