Qtサンプル OpenGLを使用する実装

Qtデザイナーでの画面作成ができたので(作り方が大雑把に分かったくらいですが。。)

今度は、実装する内容について調べたいと思います。
サンプルを見るのが一番でしょう(笑)

Cubeを作成したサンプルです。

ヘッダファイルでいろいろとインクルードして。。。赤線部は継承
【イベント処理】マウス タイマー

【描画処理】GL初期処理 リサイズ シェーダ? テクスチャ...

一部わからないものもありましたがそんなことは日常的な事なので(笑)

それでも、プログラムなので処理は、
1「メインメソッドが動く」
2「上から下へ処理が走る」

のでそれを読んでいくだけです。。。がすべては読んでいられませんので

C++の優れているところ、「ヘッダとソースに分かれている」ことを考慮に入れて
ヘッダファイルから見ていきます。

↓ヘッダファイル

f:id:Takunoji:20170323205447p:plain

赤線部分より...
OpenGL使ってんなぁ」
protected:より
「マウス押下、マウスのボタンを離す」イベント。
OpenGLの初期化」「リサイズ」「シェーダ?」「テクスチャ」の処理があるだなぁ

CPPファイル※長いので抜粋します。
コメント書いてあるじゃん(笑)
//! [0]

void MainWidget::mousePressEvent(QMouseEvent *e)
{
    // Save mouse press position
    mousePressPosition = QVector2D(e->localPos());
}
 
void MainWidget::mouseReleaseEvent(QMouseEvent *e)
{
    // Mouse release position - mouse press position
    QVector2D diff = QVector2D(e->localPos()) - mousePressPosition;
 
    // Rotation axis is perpendicular to the mouse position difference
    // vector
    QVector3D n = QVector3D(diff.y(), diff.x(), 0.0).normalized();
 
    // Accelerate angular speed relative to the length of the mouse sweep
    qreal acc = diff.length() / 100.0;
 
    // Calculate new rotation axis as weighted sum
    rotationAxis = (rotationAxis * angularSpeed + n * acc).normalized();
 
    // Increase angular speed
    angularSpeed += acc;
}

(ヘッダファイルより)QVector2D = > mousePressPosition なので
マウスイベントを受け取りマウスのポジションを取得しているようだ。。。
のように読み進める大雑把にマウスポインタの座標計算してるなぁと認識しておく(笑)

じゃ、画面の初期表示は何をしているの?と思いました。
クラスが起動するとき、基本的にコンストラクタが起動します。
※もちろん例外もあり、コンストラクタが起動しないことも多々あります。

コンストラクタは以下のように各メンバを初期化しています。
MainWidget::MainWidget(QWidget *parent) :

    QOpenGLWidget(parent),
    geometries(0),
    texture(0),
    angularSpeed(0)
{
}

とりあえず、QOpenGLWidgetがわかりませんなぁ(笑)
じゃ調べよう※上のリンクにドキュメントがあるのでそれで調べました。
ははぁ「initializeGL()」をオーバーライドしているのね。。。

「QOpenGLWidgetクラスが起動するときにinitializeGL()が呼ばれますので
このメソッドに初期化処理を記述してくださいよ」という設計になっているようだ。
(・_・D フムフムちょいとわかってたかな?

次回は、その中身を理解していきたいと思います。