前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >7.5.5编程实例-Bezier曲线曲面绘制

7.5.5编程实例-Bezier曲线曲面绘制

作者头像
步行者08
发布2018-10-09 17:13:43
1.2K0
发布2018-10-09 17:13:43
举报
文章被收录于专栏:图形学与OpenGL图形学与OpenGL
clip_image003
clip_image003

      (a)Bezier曲线                         (b) Bezier曲面

1. 绘制Bezier曲线

#include <GL/glut.h>

GLfloat ctrlpoints[4][3] =

{{ -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0},

{2.0, 4.5, 0.0}, {3.0, -3.0, 0.0}};

void init(void)

{

glClearColor(1.0, 1.0, 1.0, 0.0);

glShadeModel(GL_FLAT);

//下行用于定义曲线函数

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);

glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活

}

void display(void)

{

int i;

glClear(GL_COLOR_BUFFER_BIT);

//下面用求值器按20等分计算Bezier曲线上的点

glColor3f(0.0, 0.0, 0.0);

glLineWidth(2);

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord1f((GLfloat) i/20.0); //相当于调用了glVertex*()

glEnd();

//下面绘制控制多边形

glLineWidth(1);

glColor3f(0.0, 0.0, 1.0);

glBegin(GL_LINE_STRIP);

for (i = 0; i < 4; i++)

glVertex3fv(&ctrlpoints[i][0]);

glEnd();

glFlush();

}

void reshape(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if (w <= h)

glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);

else

glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow (argv[0]);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

2. 绘制Bezier曲面

#include <GL/glut.h>

GLfloat ctrlpoints[4][4][3] = {

{{-3, 0, 4.0}, {-2, 0, 2.0}, {-1, 0, 0.0}, {0, 0, 2.0}},

{{-3, 1, 1.0}, {-2, 1, 3.0}, {-1, 1, 6.0}, {0, 1, -1.0}},

{{-3, 2, 4.0}, {-2, 2, 0.0}, {-1, 2, 3.0}, {0, 2, 4.0}},

{{-3, 3, 0.0}, {-2, 3, 0.0}, {-1, 3, 0.0}, {0, 3, 0.0}}

};

void display(void)

{

int i, j;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0);

glPushMatrix ();

glRotatef(85.0, 1.0, 1.0, 1.0);

for (j = 0; j <= 20; j++)

{

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord2f((GLfloat)i/20.0, (GLfloat)j/20.0); //调用求值器

glEnd();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord2f((GLfloat)j/20.0, (GLfloat)i/20.0); //调用求值器

glEnd();

}

glPopMatrix ();

glFlush();

}

void init(void)

{

glClearColor (1.0, 1.0, 1.0, 0.0);

//下行的代码用控制点定义Bezier曲面函数

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);

glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数

glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //构造平行投影矩阵

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow (argv[0]);

init ();

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档