Qt OpenGL 入門


23-Aug-2013
Nobuhide Tsuda

自己紹介

名前:津田伸秀

サイト: http://vivi.dyndns.org/    twitter:vivisuke

facebook:https://www.facebook.com/nobuhide.tsuda

ぼちぼちソフト作家、年齢不詳のおじさん、自宅研究員(主席)

趣味:テニス、オセロ、思考ゲーム・パズル類

Qt/C++ 使い, 一応webアプリ(PHP, JS, jQ, SQL)も出来るよ

Windows用テキストエディタ ViVi を延々開発中

パズルアプリ(Androidtmlib)も公開中だよ

最近は、世界最速「さくさくエディタ」 開発中だよ

迷走中、お仕事募集中でござるぞ

Qt (キュート)

Qt


  • C++アプリケーション フレームワーク
  • http://qt-project.org/
  • マルチプラットフォーム対応
    • Windows, Mac, Linux, Android, iOS,...
  • IDE
    • QtCreator (clang/gcc 使用
    • VisualStudio、Qt-Addin

Qt

  • moc によるC++拡張
    • signal/slot による動的バインディング
    • メタオブジェクト
  • 動的レイアウト、動的翻訳による多国語対応
  • OpenGL, Webkit, XML など便利なモジュール満載
  • 素直な設計、高生産性
  • 詳しくは 「Qtプログラミング入門」 買って読んでね ;^p

Qt で OpenGL

Qt で OpenGL

  • プロジェクト作成時:「OpenGL」モジュール選択
  • プロジェクト設定>モジュール で選択
  • pro ファイル:「QT += opengl」 追加
OpenGL ライブラリ選択


Project Settings で追加



pro ファイルを修正



#include


  • Windows, Mac でファイルが違うので注意
  • Windows, Linux (未確認)
    • #include <GL/glu.h>
  • Mac OSX
    • #include <OpenGL/glu.h>
  • ソースを共通にしたい場合は #ifdef 使用
    • Q_OS_WIN32
    • Q_OS_MAC
    • Q_OS_LINUX

QGLWidget

  • OpenGL 画像を描画するウィジェット:
    • QGLWidget 派生クラスを定義・実装
  • 以下の3つの仮想関数を再実装
    • initializeGL()
    • resizeGL(int width, int height)
    • paintGL()
  • ソース

    initializeGL()

    • 初期化
    • qglClearColor(Qt::lightGray);  // 背景色指定
    • glEnable(GL_DEPTH_TEST);  //  for 印面消去

    resizeGL(int w, int h)


    • ウィジェットリサイズ時の処理
    • ビューポートの指定
      • glViewport(0, 0, w, h);

    paintGL()

    • OpenGL 機能を使って画面描画
      • バッファクリア
      • 視野・視点設定
      • 変換行列設定
      • 描画処理
    • 具体的なコードはここを見てね

      Qt に OpenGL

      アニメーション

      • タイマー設定
        • QTimer オブジェクト追加
        • connect でハンドラ登録
        • start(1000/FPS) でタイマースタート
      • タイマハンドラでオブジェクト位置を更新
      • ソース
      • 実行結果

      視点変更UI

      • 視点変更UIウィジェット追加
      • スライダー、spinBox などを配置
      • ハンドラを定義・実装
      • connect でコネクト
      • ハンドラで視点を変更
      • ソース
      • 実行結果

        まとめ

        • Qt を使えば、GUI を備えた OpenGL アプリをとりあえず簡単に作れるぞ。
        • ちゃんとしたアプリを作るには、OpenGL 自体の勉強が必須
        • 個人的にはシェーディングが難しかったでござる
        Made with Slides.com