QT5.7中使用OpenGL开发记录(三)---- 绘制立方体

QT5.7中使用OpenGL开发记录(三)

    前言:最近在做一个项目,需要使用QT结合OpenGL进行开发。由于原来没有怎么用过OpenGL,只知道是个开源图形库,所以先在网上查询了一些资料,发现QT5.5以上版本已经集成了OpenGL,不过和纯OpenGL的使用有些区别,而且相关资料较少。为了便于后续开发并且方便大家共同学习,这里将我的学习过程进行记录(本博客内容只记录了本人的学习过程,不保证完整性和准确性,如想系统学习请绕行。)。由于本人图形开发经验较少,如有错漏敬请指出。

绘制立方体

        与绘制平面三角形类似,绘制立方体也需要准备三个数据数组:顶点、三角形顶点索引、颜色。与平面相比,该数据更为复杂。以如下立方体为例:

QT5.7中使用OpenGL开发记录(三)---- 绘制立方体_第1张图片

        在OpenGL中,使用的是右手坐标系,所以上图中立方体的8个顶点坐标(0~7)可以用如下坐标表示:

GLfloat vertex[] = {
    -0.5,-0.5,-0.5,
    -0.5,-0.5,0.5,
    0.5,-0.5,0.5,
    0.5,-0.5,-0.5,
    -0.5,0.5,-0.5,
    -0.5,0.5,0.5,
    0.5,0.5,0.5,
    0.5,0.5,-0.5,
};

       按照立方体图中的红线进行三角形划分,总共12个三角形(划分方式随意,这里只是给出一个例子),三角形序号数组如下:

GLuint triIndexs[] = {0,2,1,
                      0,2,3,
                      2,5,1,
                      2,5,6,
                      2,7,3,
                      2,7,6,
                      0,5,1,
                      0,5,4,
                      4,6,5,
                      4,6,7,
                      0,7,4,
                      0,7,3};

      颜色数组与三角形序号数组中顶点个数对应,位12*3,共计36个顶点颜色,每个顶点的颜色使用RGBA共4个数表示,如下所示:

GLfloat colors[] = {1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                   };

        三个数组定义好后,其它代码与绘制三角形中的代码类似,需要修改如下两个地方:

        (1)激活顶点数据的函数glVertexAttribPointer,需要将第2个入参从2修改为3,代表每个顶点的坐标为3个数字,如下所示

glVertexAttribPointer( vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);

        (2)为了看出是立体图形,在resizeGL函数的最后添加一句:

projection.rotate(45, QVector3D(0.0, 1.0, 0.0));

        即将整个图形绕y轴旋转45度。

运行结果

QT5.7中使用OpenGL开发记录(三)---- 绘制立方体_第2张图片

        如上图所示为本例程的运行结果,由于按照y轴旋转了45度,所以是如图所示的效果。

        但是,本例运行结果的立体感不强,主要由于颜色设置不好,以及没有添加光照系统。到这里为止,QT结合OpenGL的基本使用已经介绍完成,其它方面的使用与原始OpenGL类似,网上教程很多,大家可以结合自己的情况学习如何优化,实现更多功能。

你可能感兴趣的:(QT+OpenGL)