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

图形学题总结

一. 论述题(共1题,100分)

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

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文件源代码效果图:
图形学曲面算法:基于Bezier曲线的Bezier曲面绘制_第1张图片

曲线源码:

#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 }

    }

};

图形学曲面算法:基于Bezier曲线的Bezier曲面绘制_第2张图片

你可能感兴趣的:(算法,图形渲染)