qt opengl lesson4 围绕不同轴旋转图形

本篇博客介绍如何在QT环境下使用OpenGL实现图形围绕不同轴进行旋转,通过设置定时器动态调整旋转角度,展示3D图形的动态效果。
摘要由CSDN通过智能技术生成

在上一篇lesson的基础上进行图形的旋转,设置一个timer,每经过一个周期开始增加旋转角度。

#-------------------------------------------------
#
# Project created by QtCreator 2017-01-20T21:24:37
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = lesson4
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
    myglwidget.cpp

HEADERS  += \
    myglwidget.h

LIBS += -lglut -lGLU

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QGLWidget>
#include <QKeyEvent>
#include <QTimerEvent>

class MyGLWidget : public QGLWidget {
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent = 0);
    ~MyGLWidget();
protected:
    virtual void paintGL();
    virtual void initializeGL();
    virtual void resizeGL(int width, int height);
    virtual void timerEvent(QTimerEvent *event);
    virtual void keyPressEvent(QKeyEvent *event);

private:
    bool mFullScreen;
    GLfloat mRotateTriangle;
    GLfloat mRotateQuad;
};

#endif // MYGLWIDGET_H

#include <QApplication>
#include <GL/glu.h>
#include "myglwidget.h"


MyGLWidget::MyGLWidget(QWidget *parent) :
    QGLWidget(parent), mFullScreen(false), mRotateTriangle(0.0f),
    mRotateQuad(0.0f)
{
    showNormal();
    startTimer(10);
}

MyGLWidget::~MyGLWidget()
{

}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslated(-1.5f, 0.0f, -6.0f);
    glRotatef(mRotateTriangle, 0.0f, 1.0f, 0.0f);

    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, 0.0f, 1.0f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
    glEnd();

    glLoadIdentity();
    glTranslatef(1.5f, 0.0f, -6.0f);
    glRotatef(mRotateQuad, 1.0f, 0.0f, 0.0f);
    glColor3f(0.5f, 0.5f, 1.0f);
    glBegin(GL_QUADS);
        glVertex3f(-1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 0.0f);
    glEnd();
}

void MyGLWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void MyGLWidget::resizeGL(int width, int height)
{
    if (height ==0) height = 1;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void MyGLWidget::timerEvent(QTimerEvent *event)
{
    mRotateTriangle += 1.0f;
    mRotateQuad -= 0.5f;

    updateGL();
    QGLWidget::timerEvent(event);
}

void MyGLWidget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_F2: {
        mFullScreen = !mFullScreen;
        if (mFullScreen) {
            showFullScreen();
        } else {
            showNormal();
        }
        updateGL();
        break;
    }
    case Qt::Key_Escape: {
        qApp->exit();
        break;
    }
    }
}

#include <QApplication>
#include "myglwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyGLWidget w;
    w.show();

    return a.exec();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值