利用求值器绘制三次Bezier曲线

来源:互联网 发布:软件测试脚本 编辑:程序博客网 时间:2024/05/18 08:14

在第一篇文章中我顶点与 Bernstein基函数绘制了三次Bezier曲线,正准备用同样的方法绘制双三次Bezier曲面,突然发现不行,好像和matlab不是很一样,网上找到了一段代码,发现要先学习求值器,对于一维曲线,主要涉及到的有这么两个函数

glMap1以及glEvalCoord1


为此,我专门查阅了一下opengl网站上关于glmap1的段落

https://www.opengl.org/sdk/docs/man2/xhtml/glMap1.xml

比较有用的摘录如下


void glMap1f(GLenum  target, GLfloat  u1, GLfloat  u2, GLint  stride, GLint  order, const GLfloat *  points);

其参数

target指定了由求值器产生的值的类型,可以被接受的类型为

GL_MAP1_VERTEX_3GL_MAP1_VERTEX_4GL_MAP1_INDEXGL_MAP1_COLOR_4GL_MAP1_NORMALGL_MAP1_TEXTURE_COORD_1,GL_MAP1_TEXTURE_COORD_2GL_MAP1_TEXTURE_COORD_3, and GL_MAP1_TEXTURE_COORD_4

GL_MAP1_VERTEX_3

每个控制点都是由三个float组成,分别代表x,y,z值


u1,u2是限定了变量U的取值范围,通常是从0变化到1。
stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。
order:阶数,等于次数加1,与控制点数相等。


void glEvalCoord1f(GLfloat u);

u为在glmap1函数中提到的值

具体实现的代码如下

#include <GL/glut.h>#include <stdio.h>#include<Windows.h>#include <stdlib.h>GLfloat ctrlpoints[4][3] = {{ -0.8f, 0.1f, 0.0 }, { -0.4f, 0.6f, 0.0 },{ 0.2f, 0.8f, 0.0 }, { 0.7f, 0.2f ,0.0} };void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);glEnable(GL_MAP1_VERTEX_3);glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i <= 10; i++)glEvalCoord1f((GLfloat)i / 10.0);glEnd();glDisable(GL_MAP1_VERTEX_3);/* The following code displays the control points as dots. */glPointSize(5.0);glColor3f(1.0, 1.0, 0.0);glBegin(GL_POINTS);for (int i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glColor3f(0.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 4; i++){glVertex3fv(&ctrlpoints[i][0]);}glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}

其中主要用来绘制Bezier曲线的代码部分其实很短

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);glEnable(GL_MAP1_VERTEX_3);glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i <= 10; i++)glEvalCoord1f((GLfloat)i / 10.0);glEnd();glDisable(GL_MAP1_VERTEX_3);
只有这么一段

其中i表示分为几段表示曲线,我的理解就是通过前面的函数其实就已经计算好了这一整条B曲线,然后通过后面这个函数输入想要绘制出来的点,就可以计算得出整条曲线了,最后放上最后效果。


这下总可以开始画曲面了吧。。下午继续探索,哦也
1 0
原创粉丝点击