Qt|OpenGL学习笔记-绕X轴、Y轴、以及XY轴旋转的四边体

程序运行截图如下:

源码如下:

myglwidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
class QTimer;


class MyGLWidget : public QOpenGLWidget
{
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent=0);
    void setRelyX(const double x);
    void setRelyY(const double y);

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

protected slots:
    void beginRotate();

private:
    int m_angle;
    double m_relyX;
    double m_relyY;

    QTimer *m_timer;
};

#endif // MYGLWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>


namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void rotateXClicked();
    void rotateYClicked();
    void rotateXAndYClicked();
    void rotateAngleChanged();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

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

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

    return a.exec();
}

myglwidget.cpp

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

MyGLWidget::MyGLWidget(QWidget *parent):
    QOpenGLWidget(parent)
{
    m_angle=0;
    m_relyX=0.0;
    m_relyY=1.0;    //默认向Y轴转
    m_timer=new QTimer;
    connect(m_timer,SIGNAL(timeout()),this,SLOT(beginRotate()));
    m_timer->start(0);
}

void MyGLWidget::setRelyX(const double x)
{
    m_relyX=x;
}

void MyGLWidget::setRelyY(const double y)
{
    m_relyY=y;
}

void MyGLWidget::initializeGL()
{
    glClearColor(0.0,0.0,0.0,0.0);
    glShadeModel(GL_SMOOTH);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
}

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);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-6.0);
    glRotatef(m_angle,m_relyX,m_relyY,0.0);
    glBegin(GL_QUADS);
    // 上面
    glColor3f(1.0,0.0,0.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0, 1.0);
    //下面
    glColor3f(0.0,1.0,0.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,1.0);
    //前面
    glColor3f(0.0,0.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    //左面
    glColor3f(0.2,0.2,0.5);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    //右面
    glColor3f(0.5,0.4,0.5);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(1.0,1.0,-1.0);
    //后面
    glColor3f(0.8,0.1,0.7);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glEnd();
}

void MyGLWidget::beginRotate()
{
    if(m_angle==360){
        m_angle=0;
        update();
    }
    m_angle++;
    update();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->rotateXPushButton,SIGNAL(clicked(bool)),this,SLOT(rotateXClicked()));
    connect(ui->rotateYPushButton,SIGNAL(clicked(bool)),this,SLOT(rotateYClicked()));
    connect(ui->rotateXandYpushButton,SIGNAL(clicked(bool)),this,SLOT(rotateXAndYClicked()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::rotateXClicked()
{
    ui->openGLWidget->setRelyX(1);
    ui->openGLWidget->setRelyY(0);
}

void Widget::rotateYClicked()
{
    ui->openGLWidget->setRelyX(0);
    ui->openGLWidget->setRelyY(1);
}

void Widget::rotateXAndYClicked()
{
    ui->openGLWidget->setRelyX(1);
    ui->openGLWidget->setRelyY(1);
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81223756
今日推荐