当前位置 博文首页 > 似水流年:Qt5--OpenGL加载3D模型--立方体

    似水流年:Qt5--OpenGL加载3D模型--立方体

    作者:[db:作者] 时间:2021-09-07 22:25

    原文出处:https://www.infotutoriales.info/2016/10/opengl-con-qt.html?m=1

    ?效果图,使用三个滑块来调节3D图像的三个轴,来让3D图像旋转,然后在实际中三个滑块的值可以通过其他数据来加载。

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    添加类mywidget

    • 右键单击项目,添加新的…选择C ++类
    • 给Widget命名,在“ 自定义” 基类中写入WidgetOpenGL

    mywidget.h

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    #include <QOpenGLWidget>
    #include <QOpenGLFunctions>
    
    #include <QGLFramebufferObjectFormat>
    
    class MyWidget : public QOpenGLWidget, protected QOpenGLFunctions
    {
    public:
    
        explicit MyWidget(QWidget *parent = 0);
    
    protected:
        void initializeGL() Q_DECL_OVERRIDE;
        void resizeGL(int w, int h)Q_DECL_OVERRIDE;
        void paintGL()Q_DECL_OVERRIDE;
        void graficarLineas();
    
    public:
        double rotate_y=0;
        double rotate_x=0;
        double rotate_z=0;
    
    private:
    };
    
    #endif // MYWIDGET_H
    
    

    mywidget.c

    #include "mywidget.h"
    
    MyWidget::MyWidget(QWidget *parent):QOpenGLWidget(parent)
    {
    
    }
    
    void MyWidget::initializeGL()
    {
        initializeOpenGLFunctions();
    
        glEnable(GL_DEPTH_TEST);
    }
    
    void MyWidget::resizeGL(int w, int h)
    {
        glViewport(0, 0, w, h);
    }
    
    void MyWidget::paintGL()
    {
         // 清除屏幕和Z缓冲区
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glDepthFunc(GL_LESS);
        glEnable(GL_DEPTH_TEST);
        glShadeModel(GL_SMOOTH);
    
        // 重置转换
        glLoadIdentity();
    
        // 当用户更改“ rotate_x”和“ rotate_y”时旋转
        glRotatef( rotate_x, 1.0, 0.0, 0.0 );
        glRotatef( rotate_y, 0.0, 1.0, 0.0 );
        glRotatef( rotate_z, 0.0, 0.0, 1.0 );
    
        // 前侧:多色侧
        glBegin(GL_POLYGON); // 显示一个矩形,就使用GL_POLYGON
    
        glColor3f( 1.0, 0.0, 0.0 );
        glVertex3f(  0.5, -0.5, -0.5 );      // P1 是红色
        glColor3f( 0.0, 1.0, 0.0 );
        glVertex3f(  0.5,  0.5, -0.5 );      // P2 是绿色
        glColor3f( 0.0, 0.0, 1.0 );
        glVertex3f( -0.5,  0.5, -0.5 );      // P3 是蓝色
        glColor3f( 1.0, 0.0, 1.0 );
        glVertex3f( -0.5, -0.5, -0.5 );      // P4 是紫色
    
        glEnd();
    
         // 背面:白色面
        glBegin(GL_POLYGON);
        glColor3f(   1.0,  1.0, 1.0 );
        glVertex3f(  0.5, -0.5, 0.5 );
        glVertex3f(  0.5,  0.5, 0.5 );
        glVertex3f( -0.5,  0.5, 0.5 );
        glVertex3f( -0.5, -0.5, 0.5 );
        glEnd();
    
        // 右侧:紫色侧
        glBegin(GL_POLYGON);
        glColor3f(  1.0,  0.0,  1.0 );
        glVertex3f( 0.5, -0.5, -0.5 );
        glVertex3f( 0.5,  0.5, -0.5 );
        glVertex3f( 0.5,  0.5,  0.5 );
        glVertex3f( 0.5, -0.5,  0.5 );
        glEnd();
    
        // 左侧:绿色侧
        glBegin(GL_POLYGON);
        glColor3f(   0.0,  1.0,  0.0 );
        glVertex3f( -0.5, -0.5,  0.5 );
        glVertex3f( -0.5,  0.5,  0.5 );
        glVertex3f( -0.5,  0.5, -0.5 );
        glVertex3f( -0.5, -0.5, -0.5 );
        glEnd();
    
        // 顶部:蓝色面
        glBegin(GL_POLYGON);
        glColor3f(   0.0,  0.0,  1.0 );
        glVertex3f(  0.5,  0.5,  0.5 );
        glVertex3f(  0.5,  0.5, -0.5 );
        glVertex3f( -0.5,  0.5, -0.5 );
        glVertex3f( -0.5,  0.5,  0.5 );
        glEnd();
    
        // 下侧:红色侧
        glBegin(GL_POLYGON);
        glColor3f(   1.0,  0.0,  0.0 );
        glVertex3f(  0.5, -0.5, -0.5 );
        glVertex3f(  0.5, -0.5,  0.5 );
        glVertex3f( -0.5, -0.5,  0.5 );
        glVertex3f( -0.5, -0.5, -0.5 );
        glEnd();
    
        graficarLineas();
        glFlush();
        this->makeCurrent();
    }
    
    void MyWidget::graficarLineas()
    {
        glBegin(GL_LINES);
        glColor3f(1,0,0);
        glVertex3f(0,0,0);
        glVertex3f(20,0,0);
    
        glColor3f(1,1,0);
        glVertex3f(0,0,0);
        glVertex3f(0,20,0);
    
        glColor3f(0,1,1);
        glVertex3f(0,0,0);
        glVertex3f(0,0,20);
        glEnd();
    }
    

    修改.pro文件–添加opengl和库

    #-------------------------------------------------
    
    下一篇:没有了