memo

プログラミング備忘録

【Qt】OpenGLを使う、三角

OpenGLで簡単な図を書いてみます。

色々調べたところ、

  • QOpenGLWidget
  • QOpenGLFunctions

このクラスを使えばよいらしいです。

QGLWidgetクラスは古いそうで、非推奨とのこと。

 

そして、

  • initializeGL()
  • resizeGL(int, int)
  • paintGL()

これらの関数を宣言しておくと、コンストラクタの後かちょっとわかりませんが、

初期化、サイズ変更時、OpenGLを描くときにそれぞれの関数が呼ばれるようです。

initializeGL()とか、最初はコンストラクタで呼べばいいのか? と思っていましたが、

これをする必要はなかったです。

 

完成は以下のようになりました。

f:id:shinopikapi:20180617192645p:plain

参考

QOpenGLWidget Class | Qt Widgets 5.11

c++ - How do I render a triangle in QOpenGLWidget? - Stack Overflow

 

下準備

QOpenWidgetクラスのRaiクラスを作成します。

 

まず、新しいフォームクラスとして、Raiクラスを作成しました。

クラス名 Rai

rai.cpp / rai.h / rai.ui

 

QOpenGLWidgetクラスを継承したクラスに変更したいと思います。

変更方法がいまいちわからなかったので、rai.uiをエディタで開き、classをQOpenGLWidgetクラスに変更します。

 <widget name="Rai" class="QWidget"> 

 

 

手動で変更する方法以外はすぐには探せなかったのですが、おそらく最初にフォームクラスを作成するときにテンプレートにQOpenGLWidgetが選択できるようにする方法があるはず……(Qt落としてくるときに、選択していたらあるのかも……?)

 

 # rai.h

以下をインクルード

#include <QOpenGLWidget>

rai.hclass Rai : public QWidget

QWidget→QOpenGLWidget

 

# rai.cpp

Rai::Rai(QWidget *parent) :
    QWidget(parent),

QWidget(parent)→QOpenGLWidget

親は何になるかわからないので、とりあえずそのままです。

 

Pikaクラスで作成したボタンを押すと、Raiクラスのuiを表示するようにしました。

f:id:shinopikapi:20180617192708p:plain

何も描いていないので、真っ暗です。

 

仮想関数を派生クラスで再定義

QOpenGLWidgetクラスの、上で記載した3つの関数を使います。

 

# rai.h

以下を追加

#include "GL/gl.h"
#include "GL/glu.h"
    virtual void initializeGL();
    virtual void resizeGL(int w,int h);
    virtual void paintGL();

 

プロジェクトTest.proを開き、以下も追加します。

LIBS += -lOpenGL32

 

 paintGL()で描写する

void Rai::paintGL()
{
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(-0.5, -0.5, 0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f(0.5, -0.5, 0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.5, 0);
    glEnd();
}

これを追加して実行すると、冒頭の三角形の図のようになりました。

 

glBegin~glEndの間で設定します。

glBeginのGL_TRIANGLESは、頂点3つを組として三角形を作ります。

 

glColor3fは色、glVertex3fは座標を設定するようです。

この関数を3回繰り返して、各頂点の設定を行います。

描写の順番としては、左上→左下→右上→右下という感じなのかな……( ^ω^)?

 

glColor3d(GLdouble red, GLdouble green, GLdouble blue)は、

色の三原色というのはすぐわかりました。

近いうちに四角形とか、円とか作ってみたいです。

 

 

 

余談:

rai.uiのタイトルがFormになっていたので、以下のように変更。

this->setWindowTitle(this->objectName());

objectName()をタイトルにしました。