一. 论述题(共1题,100分)
2.掌握OpenGL下简单曲线/曲面绘制编程的基本步骤;
二、实验原理:
在OpenGL中,可以使用下面函数便捷地实现曲线和曲面的绘制:
(1)Bezier曲线绘制:
Void glMap1{fd}(Glenum target, TYPE t1, TYPE t2, Glint stride, Glint order, const TYPE *points);
或者 glBegin(GL_LINE_STRIP);
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);
三、实验内容:
基于学习通上“资料”中的chap8-2.cpp关于Bezier曲线绘制的程序,实现Bezier曲面绘制,可以参考教材中程序8-3的内容。要求:曲面绘制控制点至少16个,曲面形状,颜色,旋转角度等均可自行调整。提示:在chap8-2.cpp中Bezier曲线绘制基础上修改程序即可实现Bezier曲面绘制。
Bezier曲线绘制的chap8-2.cpp文件源代码效果图:
曲线源码:
#include
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);
glLoadIdentity();
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 }
}
};