【Qt】OpenGLを使う、三角
OpenGLで簡単な図を書いてみます。
色々調べたところ、
- QOpenGLWidget
- QOpenGLFunctions
このクラスを使えばよいらしいです。
QGLWidgetクラスは古いそうで、非推奨とのこと。
そして、
- initializeGL()
- resizeGL(int, int)
- paintGL()
これらの関数を宣言しておくと、コンストラクタの後かちょっとわかりませんが、
初期化、サイズ変更時、OpenGLを描くときにそれぞれの関数が呼ばれるようです。
initializeGL()とか、最初はコンストラクタで呼べばいいのか? と思っていましたが、
これをする必要はなかったです。
完成は以下のようになりました。
参考
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を表示するようにしました。
何も描いていないので、真っ暗です。
仮想関数を派生クラスで再定義
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()をタイトルにしました。