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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值