Qt opengl 图片实现3D效果

  • Post author:
  • Post category:其他


首先清楚OpenGL中的常用几个函数作用:

(1)initializeGL() 初始化OpenGL函数

(2)resizeGL(int w, int h)调整窗口大小函数

(3)paintGL()绘制图像函数


1、paintGL()函数作调整


先定义模型、观察、投影3个矩阵。

   //1、定义的4*4的矩阵 模型 观察 投影矩阵
    QMatrix4x4 model;
    QMatrix4x4 view;
    QMatrix4x4 projection;

    /*----------按照时间对图片进行旋转----------*/
    QMatrix4x4 matrix;
    unsigned int time=QTime::currentTime().msec();//毫秒
    //matrix.translate(0.5,-0.5,0);//移动到该位置 z坐标不变
    //1、值 旋转后的矩阵 旋转角度-45度 往x轴进行旋转
    model.rotate(-45, 1.0f, 0.0f, 0.0f);
    //2、观察坐标 z轴网上移动3
    view.translate(0.0,0.0,-3);
    //3、角度45度 宽高比 远近值分别为0.1和100
    projection.perspective(45,(float)width()/height(),0.1,100);

效果如下:

在这里插入图片描述

顶点着色器和c文件代码部分作相应调整

在这里插入图片描述

在这里插入图片描述


2、顶点坐标改变


顶点坐标位置如下:

float vertices[] = { //坐标 3              纹理坐标 2
                     -0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
                     0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
                     0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
                     0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
                     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
                     -0.5f, -0.5f, -0.5f, 0.0f, 0.0f,

                     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
                     0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
                     0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
                     0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
                     -0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
                     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,

                     -0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
                     -0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
                     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
                     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
                     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
                     -0.5f, 0.5f, 0.5f, 1.0f, 0.0f,

                     0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
                     0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
                     0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
                     0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
                     0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
                     0.5f, 0.5f, 0.5f, 1.0f, 0.0f,

                     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
                     0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
                     0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
                     0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
                     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
                     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,

                     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
                     0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
                     0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
                     0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
                     -0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
                     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f
                   };


3、initializeGL()函数作调整


由于顶点坐标位置做了相应调整,所以初始化函数initializeGL()中的解析属性的函数glVertexAttribPointer()和glEnableVertexAttribArray()对应的参数需要作相应调整。比如占据的字节数3float,总的步长5float,还有对应的偏移量根据实际占用float数目作调整。

在这里插入图片描述


4、顶点着色器作调整


增加model、view、projection矩阵

在这里插入图片描述


5、片段着色器作调整


在这里插入图片描述


6、剪切坐标系不需要每一帧都更新projection


在initializeGL()函数中,增加对projection矩阵的初始化。

   QMatrix4x4 projection;//不需要每一帧都更新projection 剪切坐标系
    //3、角度45度 宽高比 远近值分别为0.1和100
    projection.perspective(45,(float)width()/height(),0.1,100);
    shaderProgram.setUniformValue("projection", projection);//projection单位矩阵

在这里插入图片描述


7、paintgl()函数中清空深度、颜色缓冲区域


在这里插入图片描述


8、根据时间 围绕x轴进行旋转


在这里插入图片描述



版权声明:本文为weixin_45571586原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。