OpenGL之NURBS曲面构建

一个NURBS曲面F(s,t)包含三个要素:
           控制顶点(x,y,z),节点序列(s,t)和权因子(w),
或者说是
           带权控制顶点(x*w,y*w,z*w,w)和节点序列(s,t)。

OpenGL中提供了对两类曲面的绘制:

GL_MAP2_VERTEX_4:控制顶点带权,每个点记为(x*w,y*w,z*w,w)

GL_MAP2_VERTEX_3:控制顶点权都为1,每个点记为(x,y,z)

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              //确定求值器类型
);

代码示例:

/*****************初始化*********************/
/*设置特殊效果*/
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
	glEnable(GL_BLEND);

	glEnable(GL_AUTO_NORMAL);
	glEnable(GL_NORMALIZE);
	glFrontFace(GL_CW);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_LINE_SMOOTH);

//打开自动法矢量开关
	glEnable(GL_AUTO_NORMAL);
	//允许正则化法矢量
	glEnable(GL_NORMALIZE);
	theNurb = gluNewNurbsRenderer(); // 创建一个NURBS曲面对象  
	//修改NURBS曲面对象的属性——glu库函数
	采样sampling容错torerance
	gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 5.0);
	gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);

/************************在绘制函数中调用**************************/
/*******************nurbs***********************/
	GLfloat ctrlpoints[6][5][3] = { 
	{{-3,0,0}, {-1,1,0}, {0,0,0}, {1,-1,0}, {3,0,0}},
	{{-3,0,-1},{-1,1,-1},{0,0,-1},{1,-1,-1},{3,0,-1}},
	{{-3,0,-3},{-1,1,-3},{0,0,-3},{1,1,-3},{3,0,-3}},
	{{-3,1,-3},{-1,1,-3},{0,0,-3},{1,-1,-3},{3,0,-3}},
	{{-3,0,-4},{-1,1,-4},{0,0,-4},{1,-1,-4},{3,0,-4}}, 
	{{-3,2,-5},{-1,1,-5},{0,0,-5},{1,-1,-5},{3,1,-5}} };
	
	//各控制点影响力参数设置
    GLfloat knots1[12] = { 0.0, 0.0, 0.0, 0.0,0.0,0.0,
		1.0, 1.0, 1.0, 1.0 ,1.0,1.0 }; // NURBS曲面的控制向量 
	GLfloat knots2[10] = { 0.0, 0.0, 0.0, 0.0,0.0,
		1.0, 1.0, 1.0, 1.0 ,1.0}; // NURBS曲面的控制向量     
  
	gluBeginSurface(theNurb); // 开始曲面绘制 	
	gluNurbsSurface(theNurb, 12, knots1, 10, knots2, 5 * 3, 3, &ctrlpoints[0][0][0], 6, 5, GL_MAP2_VERTEX_3); // 定义曲面的数学模型,确定其形状  
	gluEndSurface(theNurb); // 结束曲面绘制  


运行效果:

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值