OpenGL中如何绘制Bezier曲线和NURBS曲线

一、Bezier曲线

      主要注意两个函数:glMap1和glEvalCoord1。

1.void glMap1{fd}(GLenum target,TYPE u1,TYPE u2,GLint stride, GLint order,const TYPE *points);
功能:定义求值器。 

参数:target:指出了控制顶点的意义以及在points参数中需要提供多少值。

         points:可以指向控制点集、RGBA颜色值或是纹理坐标串等。

         u1、u2:限定了变量U的取值范围,通常是从0变化到1。

         stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。

         order:阶数,等于次数加1,与控制点数相等。

2.void glEvalCoord1{fd}[v](TYPE u)。
功能:该函数将产生曲线坐标值并将其绘制。

参数:u:为定义域内的任意值,每调用一次将只产生一个坐标,此坐标值也是任意的。

      但目前较多采用的是定义均匀间隔曲线坐标值,依次调用glMapGrid1*()和glEvalMesh1()可以获得等间隔值。这两个函数分别用来定义一个一维网格和计算相应的坐标值。

      另外,曲线定义后必须再glEnable()函数显式启动后才能起作用,其参数与target保持一致。在使用完毕后通过glDisable()函数将其关闭。

 

 

二、NURBS曲线

      主要注意函数:
1.void gluNurbsCurve(GLUnurbsObj *nobj, GLint nknots, GLfloat *knot, Glint stride, GLfloat *ctlarray, GLint order,GLenum type)

功能:定义曲线形状。
参数:nobj:指向NURBS对象的指针。
     nknots:节点数,节点数=控制点数+阶数。
     knot:nknots数组非递减节点值。
     stride:跨度,相邻控制点的偏移量。
     Ctlarry:指向NURBS的控制点数组的指针。
     order:NURBS曲线的阶数,阶数=次数+1。
     type:曲线、面类型。

2.void gluNurbsProperty(GLUnurbsObj* nobj, GLenum property, GLfloat value)

功能:设置NURBS属性。

参数:nobj:指向NURBS对象的指针。
     property:需设置的属性。
     value:设置指定属性的值。

3.gluBeginCurve、gluEndCurve限定NURBS曲面。返回值均为void,参数均为GLUnurbsObj* nobj,为指向NURBS对象的指针。

 

 

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
下面是用OpenGL绘制贝塞尔曲线的示例代码: ```cpp #include <GL/glut.h> GLfloat ctrlpoints[4][3] = { {-4.0, -4.0, 0.0}, {-2.0, 4.0, 0.0}, {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}}; void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); glEnable(GL_MAP1_VERTEX_3); glBegin(GL_LINE_STRIP); for (int i = 0; i <= 30; i++) glEvalCoord1f((GLfloat)i / 30.0); glEnd(); glFlush(); } void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-5.0, 5.0, -5.0, 5.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("Bezier Curve"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 这里我们使用了OpenGL的GL_MAP1_VERTEX_3功能来绘制三维的贝塞尔曲线,其ctrlpoints数组存储了控制点的坐标,glMap1f函数指定了控制点的数据格式,glEvalCoord1f函数用于生成贝塞尔曲线上的点。在display函数,我们将贝塞尔曲线的点绘制出来,最终显示在屏幕上。在init函数,我们初始化了OpenGL的投影矩阵和模型视图矩阵,用于确定视口的大小和位置。 运行上述代码会显示一个窗口,其绘制了一条贝塞尔曲线。你可以修改ctrlpoints数组来改变控制点的位置,从而绘制不同形状的曲线

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值