# 图形学曲面算法：基于Bezier曲线的Bezier曲面绘制

## 图形学题总结

1. (论述题)一、实验目的：
1.了解OpenGL下简单曲线/曲面绘制编程的基本思想；

2.掌握OpenGL下简单曲线/曲面绘制编程的基本步骤；

（1）Bezier曲线绘制:

Void glMap1{fd}(Glenum target, TYPE t1, TYPE t2, Glint stride, Glint order, const TYPE *points);

             for（k=0;k<=50;k++）

glEvalCoord1f(Glfloat(k)/100.0)

glEnd();


glMapGrid1{fd}(Glint n, TYPE t1, TYPE t2);//指定曲线步长

glEvalMesh1(Glenum mode,Glint n1,Glint n2);//绘制曲线

（2）Bezier曲面绘制:

Void glMap2{fd}(Glenum target, TYPE u1, TYPE u2, Glint ustride, Glint uorder, TYPE v1, TYPE v2, Glint vstride, Glint vorder, const TYPE *points); //求值函数

glEvalCoord2{fd}(TYPE u, TYPE v); //绘制曲面

glMapGrid2{fd}(Glint nu, TYPE u1, TYPE u2, Glint nv, TYPE v1, TYPE v2);

glEvalMesh2(Glenum mode, Glint nu1,Glint nu2, Glint nv1,Glint nv2);

Bezier曲线绘制的chap8-2.cpp文件源代码效果图：

#include <GL/glut.h>

void initial(void)

{

glClearColor (1.0, 1.0, 1.0, 0.0);

glLineWidth(4.0);

GLfloat ControlP[4][3]={{-80.0,-40.0,0.0},{-10.0,90.0,0.0},

{10.0,-90.0,0.0},{80.0,40.0,0.0}};

glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,*ControlP);//绘制Bezier曲线函数

glEnable(GL_MAP1_VERTEX_3);//激活控制点的三维坐标

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0.0, 0.0);

glMapGrid1f(100,0.0,1.0);//生成均匀分布的参数值，从0开始经过100步到1.0

glEvalMesh1(GL_LINE, 0, 100);//从0到100个参数绘制Bezier曲线

glFlush();

}

void Reshape(GLint newWidth, GLint newHeight)

{

glViewport(0,0,newWidth,newHeight);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(-100.0,100.0,-100.0,100.0);

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow("Bezier曲线");

initial();

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutMainLoop();

}



Bezier曲面绘制的教材中程序8-3文件部分源代码：

//绘制Bezier曲面函数

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,0,1, 12, 4, &ControlP[0][0][0]); //绘制Bezier曲面

glEnable(GL_MAP2_VERTEX_3);//激活控制点的三维坐标

glColor3f(1.0, 0.0, 0.0);

glRotatef(-65.0, 1.0, 0.3, 0.2);

glMapGrid2f(40,0.0,1.0,40,0.0,1.0);//生成均匀分布的参数值，从0开始经过100步到1.0

//glEvalMesh2(GL_LINE, 0, 40, 0, 40);//从0到100个参数绘制Bezier曲线

glEvalMesh2(GL_FILL,0,40,0,40);//绘制Bezier曲线并填充


GLfloat ControlP[4][4][3] =

{

{

{ -0.8f, 0.8f, 0.1f },

{ -0.9f, 0.3f, 0.3f },

{ -0.9f, -0.2f, 0.3f },

{ -0.8f, -0.7f, 0.2f }

},

{

{ -0.3f, 0.8f, 0.2f },

{ -0.3f, 0.2f, 0.5f },

{ -0.25f, -0.2f, 0.6f },

{ -0.3f, -0.6f, 0.2f }

},

{

{ 0.2f, 0.85f, 0.1f },

{ 0.25f, 0.25f, 0.6f },

{ 0.3f, -0.2f, 0.4f },

{ 0.2f, -0.65f, 0.3f }

},

{

{ 0.7f, 0.8f, 0.1f },

{ 0.8f, 0.3f, 0.3f },

{ 0.75f, -0.2f, 0.3f },

{ 0.7f, -0.7f, 0.2f }

}

};


• 1
点赞
• 7
收藏
• 打赏
• 0
评论
12-07
04-17 3968
01-01
08-15 9868
01-12 7023
06-06 2659
10-27 2087
04-09 4430

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

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

lml spq

¥2 ¥4 ¥6 ¥10 ¥20

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