NeHeチュートリアルQt実装-lesson 04


NeHeシリーズチュートリアルの4:多角形回転
英文教程住所:lesson 04
このレッスンでは、第3レッスンに加えて、回転ポリゴンのコードを追加しました.具体的には、次のようにします.
まず、ヘッドファイルに2つの回転係数を追加します.
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include <QGLWidget>

class QTimer;
class QKeyEvent;

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 *);
    void closeEvent(QCloseEvent *);

private:
    QTimer *timer;

    bool fullscreen;

    GLfloat     rtri;                       // Angle For The Triangle ( NEW )
    GLfloat     rquad;                      // Angle For The Quad     ( NEW )
};

#endif // MYGLWIDGET_H

構築方法で回転係数を初期化するには、次の手順に従います.
MyGLWidget::MyGLWidget(QWidget *parent) :
    QGLWidget(parent), fullscreen(false),rtri(0), rquad(0)
{
    setWindowTitle(tr("nehe----lesson04"));
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateGL()));
    timer->start(10);
}

最後に、回転を実現する部分です.
void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth Buffer
    glLoadIdentity();       // Reset The Current Modelview Matrix

    glTranslatef(-1.5f,0.0f,-6.0f);     // Move Left 1.5 Units And Into The Screen 6.0
    glPushMatrix();
    glRotatef(rtri, 0, 1.0f, 0);
    glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
        glColor3f(1.0f,0.0f,0.0f);	       // Set The Color To Red
        glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
        glColor3f(0.0f,1.0f,0.0f);          // Set The Color To Green
        glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
        glColor3f(0.0f,0.0f,1.0f);          // Set The Color To Blue
        glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
    glEnd();                            // Finished Drawing The Triangle
    glPopMatrix();
    glTranslatef(3.0f,0.0f,0.0f);                   // Move Right 3 Units
    glColor3f(0.5f,0.5f,1.0f);              // Set The Color To Blue One Time Only
    glRotatef(rquad, 1.0f, 0, 0);
    glBegin(GL_QUADS);                      // Draw A Quad
           glVertex3f(-1.0f, 1.0f, 0.0f);              // Top Left
           glVertex3f( 1.0f, 1.0f, 0.0f);              // Top Right
           glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
           glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glEnd();                         // Done Drawing The Quad

    rtri += 0.2f;                    // Increase The Rotation Variable For The Triangle ( NEW )
    rquad -= 0.15f;                  // Decrease The Rotation Variable For The Quad     ( NEW )
}

次のように動作します.