QT4.7版本的OPENGL的3D旋转模型例子

简介: QT4.7版本的OPENGL的3D旋转模型例子

test.pro

QT += widgets core opengl
SOURCES += \
    main.cpp \
    myglwidget.cpp
HEADERS += \
    myglwidget.h
FORMS += \
    form.ui

myglwidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QGLWidget>
#include <QKeyEvent>
#include <QTimer>
class MyGLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent = 0);
protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
    void keyPressEvent(QKeyEvent *event);
private:
    bool fullScreen;
    GLfloat m_rtri;    //控制三角形的角度
    GLfloat m_rquad;   //控制四边形的角度
};
#endif // MYGLWIDGET_H

myglwidget.cpp

#include "myglwidget.h"
MyGLWidget::MyGLWidget(QWidget *parent) :
    QGLWidget(parent)
{
    fullScreen = false;
    m_rtri = 0.0f;
    m_rquad = 0.0f;
    QTimer *timer = new QTimer;
    connect(timer, SIGNAL(timeout()), this, SLOT(updateGL()));
    timer->start(20);
}
void MyGLWidget::initializeGL()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);                   //黑色背景
    glShadeModel(GL_SMOOTH);                            //启用阴影平滑
    glClearDepth(1.0);                                  //设置深度缓存
    glEnable(GL_DEPTH_TEST);                            //启用深度测试
    glDepthFunc(GL_LEQUAL);                             //所作深度测试的类型
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  //告诉系统对透视进行修正
}
void MyGLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);               //重置当前的视口
    glMatrixMode(GL_PROJECTION);                        //选择投影矩阵
    glLoadIdentity();                                   //重置投影矩阵
    //设置视口的大小
    gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);                         //选择模型观察矩阵
    glLoadIdentity();                                   //重置模型观察矩阵
}
void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存
    glLoadIdentity();                                   //重置当前的模型观察矩阵
    glTranslatef(-1.5f, 0.0f, -6.0f);                   //左移1.5单位,并移入屏幕6.0单位
    glRotatef(m_rtri, 0.0f, 1.0f, 0.0f);                //绕y轴旋转三角形
    glBegin(GL_TRIANGLES);                              //开始绘制金字塔
        glColor3f(1.0f, 0.0f, 0.0f);                    //红色
        glVertex3f(0.0f, 1.0f, 0.0f);                   //上顶点(前侧面)
        glColor3f(0.0f, 1.0f, 0.0f);                    //绿色
        glVertex3f(-1.0f, -1.0f, 1.0f);                 //左下(前侧面)
        glColor3f(0.0f, 0.0f, 1.0f);                    //蓝色
        glVertex3f(1.0f, -1.0f, 1.0f);                  //右下(前侧面)
        glColor3f(1.0f, 0.0f, 0.0f);                    //红色
        glVertex3f(0.0f, 1.0f, 0.0f);                   //上顶点(右侧面)
        glColor3f(0.0f, 0.0f, 1.0f);                    //蓝色
        glVertex3f(1.0f, -1.0f, 1.0f);                  //左下(右侧面)
        glColor3f(0.0f, 1.0f, 0.0f);                    //绿色
        glVertex3f(1.0f, -1.0f, -1.0f);                 //右下(右侧面)
        glColor3f(1.0f, 0.0f, 0.0f);                    //红色
        glVertex3f(0.0f, 1.0f, 0.0f);                   //上顶点(后侧面)
        glColor3f(0.0f, 1.0f, 0.0f);                    //绿色
        glVertex3f(1.0f, -1.0f, -1.0f);                 //左下(后侧面)
        glColor3f(0.0f, 0.0f, 1.0f);                    //蓝色
        glVertex3f(-1.0f, -1.0f, -1.0f);                //右下(后侧面)
        glColor3f(1.0f, 0.0f, 0.0f);                    //红色
        glVertex3f(0.0f, 1.0f, 0.0f);                   //上顶点(左侧面)
        glColor3f(0.0f, 0.0f, 1.0f);                    //蓝色
        glVertex3f(-1.0f, -1.0f, -1.0f);                //左下(左侧面)
        glColor3f(0.0f, 1.0f, 0.0f);                    //绿色
        glVertex3f(-1.0f, -1.0f, 1.0f);                 //右下(左侧面)
    glEnd();                                            //金字塔绘制结束
    glLoadIdentity();                                   //重置模型观察矩阵
    glTranslatef(1.5f, 0.0f, -6.0f);                    //右移1.5单位,并移入屏幕6.0单位
    glRotatef(m_rquad, 1.0f, 0.0f, 0.0f);               //绕x轴旋转四边形
    glBegin(GL_QUADS);                                  //开始绘制立方体
        glColor3f(0.0f, 1.0f, 0.0f);                    //绿色
        glVertex3f(1.0f, 1.0f, -1.0f);                  //右上(顶面)
        glVertex3f(-1.0f, 1.0f, -1.0f);                 //左上(顶面)
        glVertex3f(-1.0f, 1.0f, 1.0f);                  //左下(顶面)
        glVertex3f(1.0f, 1.0f, 1.0f);                   //右下(顶面)
        glColor3f(1.0f, 0.5f, 0.0f);                    //橙色
        glVertex3f(1.0f, -1.0f, 1.0f);                  //右上(底面)
        glVertex3f(-1.0f, -1.0f, 1.0f);                 //左上(底面)
        glVertex3f(-1.0f, -1.0f, -1.0f);                //左下(底面)
        glVertex3f(1.0f, -1.0f, -1.0f);                 //右下(底面)
        glColor3f(1.0f, 0.0f, 0.0f);                    //红色
        glVertex3f(1.0f, 1.0f, 1.0f);                   //右上(前面)
        glVertex3f(-1.0f, 1.0f, 1.0f);                  //左上(前面)
        glVertex3f(-1.0f, -1.0f, 1.0f);                 //左下(前面)
        glVertex3f(1.0f, -1.0f, 1.0f);                  //右下(前面)
        glColor3f(1.0f, 1.0f, 0.0f);                    //黄色
        glVertex3f(1.0f, -1.0f, -1.0f);                 //右上(后面)
        glVertex3f(-1.0f, -1.0f, -1.0f);                //左上(后面)
        glVertex3f(-1.0f, 1.0f, -1.0f);                 //左下(后面)
        glVertex3f(1.0f, 1.0f, -1.0f);                  //右下(后面)
        glColor3f(0.0f, 0.0f, 1.0f);                    //蓝色
        glVertex3f(-1.0f, 1.0f, 1.0f);                  //右上(左面)
        glVertex3f(-1.0f, 1.0f, -1.0f);                 //左上(左面)
        glVertex3f(-1.0f, -1.0f, -1.0f);                //左下(左面)
        glVertex3f(-1.0f, -1.0f, 1.0f);                 //右下(左面)
        glColor3f(1.0f, 0.0f, 1.0f);                    //紫色
        glVertex3f(1.0f, 1.0f, -1.0f);                  //右上(右面)
        glVertex3f(1.0f, 1.0f, 1.0f);                   //左上(右面)
        glVertex3f(1.0f, -1.0f, 1.0f);                  //左下(右面)
        glVertex3f(1.0f, -1.0f, -1.0f);                 //右下(右面)
    glEnd();                                            //立方体绘制结束
    m_rtri += 0.5f;                                     //增加金字体的旋转变量
    m_rquad -= 0.5f;                                    //减少立方体的旋转变量
}
void MyGLWidget::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
    case Qt::Key_F1:         //F1为全屏和普通屏的切换键, Shitf+F1
        fullScreen = !fullScreen;
        if (fullScreen)
        {
            showFullScreen();
        }
        else
        {
            showNormal();
        }
        updateGL();
        break;
    case Qt::Key_Escape:   //ESC为退出键
        close();
        break;
    }
}

main.cpp

#include <QtGui/QApplication>
#include "myglwidget.h"
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MyGLWidget widget;
    widget.resize(400, 300);
    widget.show();
    return app.exec();
}

结果截图

相关文章
|
1月前
|
数据可视化 API vr&ar
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
121 2
|
5月前
|
编译器
Qt获取当前所用的Qt版本、编译器、位数等信息
Qt获取当前所用的Qt版本、编译器、位数等信息
|
1月前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
29 0
|
1月前
|
SQL XML API
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
13 0
|
1月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
112 4
|
1月前
QT 5.14.2版本 MAC环境安装部署流程
QT 5.14.2版本 MAC环境安装部署流程
|
1月前
Qt+OpenGL 打砖块游戏
Qt+OpenGL 打砖块游戏
21 0
|
2月前
|
数据可视化 API vr&ar
qt“五彩斑斓“ opengl
qt“五彩斑斓“ opengl
|
5月前
12 QT - Qt4版本的信号槽写法
12 QT - Qt4版本的信号槽写法
23 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件

热门文章

最新文章

推荐镜像

更多