跳转至

创建线段和多边形示例

安装nupengl程序包

在上一节中,已经说明白怎么安装nupengl程序包了,不会的可以去翻一下。

安装nupengl程序包

后面每次我们新建项目的话都需要重新安装程序包,程序包是跟着项目走的。

创建基本窗体

首先,引入头文件:

#include <GL/glut.h>

创建主函数:

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(300, 100);
    glutInitWindowSize(600, 500);
    glutCreateWindow("Lines | Triangle");

    init();
    //glutDisplayFunc(lines); //传递需要勾画的函数
    glutMainLoop();
    return 0;
}

创建init()-窗口初始化函数:

void init()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-10, 20, -10, 20);   //可视的范围,类似鼠标滚轮的远近
}

Ctrl+F5运行,会生成窗体如下:

在这里插入图片描述

创建线段

接下来要在这个空的窗体上画我们的线段。

首先,将main函数中的//glutDisplayFunc(lines); //传递需要勾画的函数取消注释,这是调用线段的操作;

然后,创建lines-线段函数:

void lines()
{
    int p1[] = { 0,4 };
    int p2[] = { 6,4 };
    int p3[] = { 1,0 };
    int p4[] = { 3,7 };
    int p5[] = { 5,0 };
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.3, 0.1, 0.8);
    glPointSize(3);
    //glBegin(GL_POINTS); //画点
    //glBegin(GL_LINES); //画线段
    //glBegin(GL_LINE_STRIP); //画连续线段
    glBegin(GL_LINE_LOOP);  //画封闭线段,你的第一个五角星
    glVertex2iv(p1);    //glVertex2i后加v可直接调用向量,向量可提前写到前面
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glEnd();
    glFlush();
}

画点还是画线段由glBegin后面的参数决定,上面我试了几种。

线段的渲染效果如下:

在这里插入图片描述

创建多边形

上面我们已经用线段勾勒出一个五角星了,不过还都是点和线的操作,这部分我们来绘制一个多边形(包括三角形、四边形)。

首先将main函数glutDisplayFunc()中的参数改为polgonTriangle,表示我们现在要画多边形了;

然后创建polgonTriangle函数:

void polgonTriangle()
{
    int p1[] = { 1,3 };
    int p2[] = { 3,0 };
    int p3[] = { 6,0 };
    int p4[] = { 7,3 };
    int p5[] = { 6,6 };
    int p6[] = { 3,6 };
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.6,0.5,0.2);
    glPointSize(3);
    //glBegin(GL_POINTS);
    //glBegin(GL_POLYGON); //画多边形
    glBegin(GL_TRIANGLES);  //画三角形(3个顶点)
    //glBegin(GL_QUADS); //画四边形
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glVertex2iv(p6);
    glEnd();
    glFlush();
}

因为我这个函数中创建了6个顶点,所以会创建2个三角形,绘制效果如下:

在这里插入图片描述

完整程序

main.cpp

/*
** 绘制线段、多边形和三角形(理解点、线、面,会绘制各种图元)
*/

#include <GL/glut.h>

void lines()
{
    int p1[] = { 0,4 };
    int p2[] = { 6,4 };
    int p3[] = { 1,0 };
    int p4[] = { 3,7 };
    int p5[] = { 5,0 };
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.3, 0.1, 0.8);
    glPointSize(3);
    //glBegin(GL_POINTS); //画点
    //glBegin(GL_LINES); //画线段
    //glBegin(GL_LINE_STRIP); //画连续线段
    glBegin(GL_LINE_LOOP);  //画封闭线段,你的第一个五角星
    glVertex2iv(p1);    //glVertex2i后加v可直接调用向量,向量可提前写到前面
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glEnd();
    glFlush();
}

void polgonTriangle()
{
    int p1[] = { 1,3 };
    int p2[] = { 3,0 };
    int p3[] = { 6,0 };
    int p4[] = { 7,3 };
    int p5[] = { 6,6 };
    int p6[] = { 3,6 };
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.6,0.5,0.2);
    glPointSize(3);
    //glBegin(GL_POINTS);
    //glBegin(GL_POLYGON); //画多边形
    glBegin(GL_TRIANGLES);  //画三角形(3个顶点)
    //glBegin(GL_QUADS); //画四边形
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glVertex2iv(p6);
    glEnd();
    glFlush();
}

void init()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-10, 20, -10, 20);   //可视的范围,类似鼠标滚轮的远近
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(300, 100);
    glutInitWindowSize(600, 500);
    glutCreateWindow("Lines | Triangle");

    init();
    glutDisplayFunc(polgonTriangle);    //传递需要的函数
    glutMainLoop();
    return 0;
}

Ubuntu端创建多面体

# 安装opengl
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev g++

创建多面体程序:

#include <GL/glut.h>

#define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
static int angle = 0;
static int rotateMode = 0;

void myDisplay(void)
{
    static int list = 0;
    if (list == 0)
    {
        GLfloat
            PointA[] = { 0.5f, 0.5f, -0.5f },
            PointB[] = { 0.5f, -0.5f, -0.5f },
            PointC[] = { -0.5f, -0.5f, -0.5f },
            PointD[] = { -0.5f, 0.5f, -0.5f },
            PointE[] = { 0.5f, 0.5f, 0.5f },
            PointF[] = { 0.5f, -0.5f, 0.5f },
            PointG[] = { -0.5f, -0.5f, 0.5f },
            PointH[] = { -0.5f, 0.5f, 0.5f };
        GLfloat
            ColorA[] = { 1, 0, 0 },
            ColorB[] = { 0, 1, 0 },
            ColorC[] = { 0, 0, 1 },
            ColorD[] = { 1, 1, 0 },
            ColorE[] = { 1, 0, 1 },
            ColorF[] = { 0, 1, 1 },
            ColorG[] = { 1, 1, 1 },
            ColorH[] = { 0, 0, 0 };

        list = glGenLists(1);
        glNewList(list, GL_COMPILE);

        // 面1
        glBegin(GL_POLYGON);
        ColoredVertex(ColorA, PointA);
        ColoredVertex(ColorE, PointE);
        ColoredVertex(ColorH, PointH);
        ColoredVertex(ColorD, PointD);
        glEnd();

        // 面2
        glBegin(GL_POLYGON);
        ColoredVertex(ColorD, PointD);
        ColoredVertex(ColorC, PointC);
        ColoredVertex(ColorB, PointB);
        ColoredVertex(ColorA, PointA);
        glEnd();

        // 面3
        glBegin(GL_POLYGON);
        ColoredVertex(ColorA, PointA);
        ColoredVertex(ColorB, PointB);
        ColoredVertex(ColorF, PointF);
        ColoredVertex(ColorE, PointE);
        glEnd();

        // 面4
        glBegin(GL_POLYGON);
        ColoredVertex(ColorE, PointE);
        ColoredVertex(ColorH, PointH);
        ColoredVertex(ColorG, PointG);
        ColoredVertex(ColorF, PointF);
        glEnd();

        // 面5
        glBegin(GL_POLYGON);
        ColoredVertex(ColorF, PointF);
        ColoredVertex(ColorB, PointB);
        ColoredVertex(ColorC, PointC);
        ColoredVertex(ColorG, PointG);
        glEnd();

        // 面6
        glBegin(GL_POLYGON);
        ColoredVertex(ColorG, PointG);
        ColoredVertex(ColorH, PointH);
        ColoredVertex(ColorD, PointD);
        ColoredVertex(ColorC, PointC);
        glEnd();
        glEndList();

        glEnable(GL_DEPTH_TEST);
    }

    // 已经创建了显示列表,在每次绘制正四面体时将调用它
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(angle / 10, 1, 0.5, 0.0);
    glCallList(list);
    glPopMatrix();
    glutSwapBuffers();
}

void myIdle(void)
{
    ++angle;
    if (angle >= 3600.0f)
    {
        angle = 0.0f;
    }
    myDisplay();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(700, 700);
    glutCreateWindow("First OpenGL Program");

    glutDisplayFunc(&myDisplay);
    glutIdleFunc(&myIdle);     //空闲调用

    glutMainLoop();

    return 0;
}

编译运行:

g++ -o main main.cpp -lglut -lGLU -lGL && ./main

结果如下:

在这里插入图片描述

在这里插入图片描述

以上。