OpenGL学习笔记--旋转的五彩立方体(探索3D编程的奇妙世界)

参考链接: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=04

周炜的NeHe中文教程 :http://www.owlei.com/DancingWind/

// glwidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QtCore>
#include <QtGui>
#include <QtOpenGL>

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    GLWidget(int timerInterval = 0, QWidget *parent = 0);

protected:
    virtual void initializeGL() = 0;
    virtual void resizeGL(int width, int height) = 0;
    virtual void paintGL() = 0;
    virtual void keyPressEvent(QKeyEvent *e);
    virtual void timeOut();

protected slots:
    virtual void timeOutSlot();

private:
    QTimer *m_timer;
};

#endif

 

// glwidget.cpp

#include "glwidget.h"

GLWidget::GLWidget(int timerInterval, QWidget *parent)
    : QGLWidget(parent)
{
    if (timerInterval == 0) {
        m_timer = 0;
    } else {
        m_timer = new QTimer(this);
        connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
        m_timer->start(timerInterval);
    }
}

void GLWidget::keyPressEvent(QKeyEvent *e)
{
    switch (e->key()) {
    case Qt::Key_Escape:
        close();
    }
}

void GLWidget::timeOut()
{
}

void GLWidget::timeOutSlot()
{
    timeOut();
}

 

// glwidget5.h

#ifndef GLWIDGET5_H
#define GLWIDGET5_H

#include "../glwidget.h"

class GLWidget5 : public GLWidget
{   
    // Q_OBJECT //! 注意:此处不能有Q_OBJECT   
public:
    GLWidget5(int timerInterval = 0, QWidget *parent = 0);

protected:
    virtual void initializeGL();
    virtual void resizeGL( int width, int height );
    virtual void paintGL();
    virtual void timeOut();

private:
    GLfloat rtri, rquad;
};

#endif // GLWIDGET5_H

 

// glwidget5.cpp

#include "glwidget5.h"

GLWidget5::GLWidget5(int timerInterval, QWidget *parent)
    : GLWidget(timerInterval, parent)
{
    rtri = rquad = 0.0f;
}

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

void GLWidget5::resizeGL(int width, int height)
{
    height = height?height:1;
    glViewport( 0, 0, (GLint)width, (GLint)height );

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void GLWidget5::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
    glLoadIdentity(); // 重置当前的模型观察矩阵

    glTranslatef(-1.5f,0.0f,-6.0f); // 相对当前所在的屏幕位置移动
    glRotatef(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(rquad, 1.0f, 1.0f, 1.0f);

    /* 开始画立方体,它由六个四边形组成,所有的四边形都以逆时针顺序绘制
       (右上角->左上角->左下角->右下角)
     */
    glBegin(GL_QUADS);

    glColor3f(0.5f, 0.5f, 1.0f);
    glVertex3f(1.0f, 1.0f, -1.0f); // 四边形的右上顶点(顶面)
    glColor3f(0.1f, 0.0f, 0.2f);
    glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上顶点(顶面)
    glColor3f(0.2f, 0.2f, 0.3f);
    glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点(顶面)
    glColor3f(0.3f, 0.3f, 0.3f);
    glVertex3f(1.0f, 1.0f, 1.0f); // 四边形的右下顶点(顶面)

    glColor3f(1.0f, 0.5f, 0.0f); // 橙色
    glVertex3f(1.0f, -1.0f, 1.0f); // 四边形的右上顶点(底面)
    glColor3f(0.2f, 0.4f, 0.4f);
    glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左上顶点(底面)
    glColor3f(0.3f, 0.4f, 0.1f);
    glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的左下顶点(底面)
    glColor3f(0.5f, 0.2f, 0.4f);
    glVertex3f(1.0f, -1.0f, -1.0f); // 四边形的右下顶点(底面)

    glColor3f(1.0f, 0.0f, 0.0f); // 红色
    glVertex3f(1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面)
    glColor3f(0.6f, 0.8f, 0.9f);
    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); // 四边形的右上顶点(后面)
    glColor3f(0.6f, 0.2f, 0.1f);
    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); // 四边形的右上顶点(左面)
    glColor3f(0.7f, 0.5f, 0.9f);
    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();
}

void GLWidget5::timeOut()
{
    rtri += 0.5f;
    rquad -= 0.25f;
    updateGL();
}

 

// main.cpp

#include "glwidget5.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    GLWidget *w = new GLWidget5(10);
    w->show();

    return a.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值