您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 3浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenGL之NURBS曲面构建

phymat.nico 发布时间:2020-01-16 14:01:13 ,浏览量:3

一个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); // 结束曲面绘制  

运行效果:

 

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0863s