02.トラックOpenGLビュークラスを作る



トラッキング(マウス操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLビュークラスを、ベースOpenGLビュークラスの派生クラスとして作成します。

解説

トラッキング(マウス操作による描画領域の回転、拡大縮小、平行移動)をするためにすべきことは、以下です。

  1. マウスのドラッグ量に応じて、描画空間を、回転、拡大縮小、平行移動するようにOpenGLの行列計算をする関数を作成する。また、トラッキングの開始、終了に関する関数も作成する。
  2. マウス操作イベントハンドラを追加し、トラッキングに関する関数を呼び出す。

プロジェクトの作成

「メニュー/新規作成/プロジェクト」を選択します。

プロジェクトの種類:MFC
テンプレート:MFC アプリケーション
プロジェクト名:OpenGLTrack
場所:適当なフォルダを指定
ソリューションのディレクトリの作成:チェックしない
でOKボタンを押します。

以降、「01.ベースOpenGLビュークラスを作る」におけるプロジェクト作成と同じ設定でプロジェクトを作成します。

ビルドし、エラー、警告がないことを確認します。

ベースOpenGLビュークラスファイルをプロジェクトに追加

「01.ベースOpenGLビュークラスを作る」で作成した
OpenGLBaseView.cpp
OpenGLBaseView.h
をOpenGLTrackプロジェクトフォルダにコピーします。

「メニュー/プロジェクト/既存項目の追加」を選択します。
プロジェクトに
OpenGLBaseView.cpp
OpenGLBaseView.h
を追加します。

OpenGLBaseView.cppの
#include "OpenGLBase.h"
#include "OpenGLDoc.h"
をコメントアウトします。



OpenGLBaseView.cppおよびOpenGLBaseView.hの
「COpenGLBaseDoc」を「CDocument」に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)

ビルドし、エラー、警告がないことを確認します。

トラックOpenGLビュークラスの親クラスの変更

OpenGLTrackView.h に
#include "OpenGLBaseView.h"
を追加します。



OpenGLTrackView.cpp および OpenGLTrackView.h の
「CView」を「COpenGLBaseView」に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)

ビルドし、エラー、警告がないことを確認します。

トラックOpenGLビュークラスのOnDraw関数の削除

ベースOpenGLビュークラスのOnDraw関数が呼ばれるように、トラックOpenGLビュークラスのOnDraw関数を削除します。

(オーバーライド関数の削除は、「クラスビュー」と「プロパティビュー」を使用します。
 まず、「クラスビュー」で、メッセージハンドラを削除するクラスを選択します。
 次に、「プロパティビュー」のツールバーの「オーバーライド」を選択します。削除するオーバーライド関数の右側のドロップダウンリストを用いてオーバーライド関数を削除します)

上記オペレーションにより、OnDrawがコメントアウトされます。



ビルドし、エラー、警告がないことを確認します。

実行し、OpenGLBaseプログラムと同じ結果になることを確認します。

メンバ変数、メンバ関数の宣言の追加

OpenGLTrackView.h のトラックOpenGLビュークラス定義の前に
列挙型ETRACKINGMODEの定義
を追加します。
OpenGLTrackView.h のトラックOpenGLビュークラス定義の最初にメンバ変数、メンバ関数の宣言を追加します。



ビルドし、エラー、警告がないことを確認します。

メンバ変数の初期化

OpenGLTrackView.cpp のトラックOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。



ビルドし、エラー、警告がないことを確認します。

BeginTracking関数の追加、編集

OpenGLTrackView.cpp にマウス操作の開始処理に関するメンバ関数の定義を追加します。



ビルドし、エラー、警告がないことを確認します。

EndTracking関数の追加、編集

OpenGLTrackView.cpp にマウス操作の終了処理に関するメンバ関数の定義を追加します。



ビルドし、エラー、警告がないことを確認します。

DoTracking関数の追加、編集

OpenGLTrackView.cpp にマウス操作のマウス移動中の処理に関するメンバ関数の定義を追加します。



OpenGLBaseView.h のベースOpenGLビュークラスのメンバ変数
m_cx
m_cy
をprotected変数とします。

OpenGLBaseView.h のベースOpenGLビュークラスのメンバ関数
SetupProjectionMatrix
SetupModelViewMatrix
をprotected関数、さらにvirtual関数とします。



ビルドし、エラー、警告がないことを確認します。

マウス操作イベントハンドラの追加、編集

以下のマウス操作メッセージハンドラをトラックOpenGLビュークラスに追加します。
(メッセージハンドラの追加は、「クラスビュー」と「プロパティビュー」を使用します。
 まず、「クラスビュー」で、メッセージハンドラを追加するクラスを選択します。
 次に、「プロパティビュー」のツールバーの「メッセージ」を選択します。追加するメッセージ「WM_XXX」の右側のドロップダウンリストを用いてメッセージハンドラを追加します)

ウィンドウメッセージ名 メッセージハンドラ名
WM_LBUTTONDOWN OnLButtonDown
WM_LBUTTONUP OnLButtonUp
WM_MBUTTONDOWN OnMButtonDown
WM_MBUTTONUP OnMButtonUp
WM_MOUSEMOVE OnMouseMove
WM_MOUSEWHEEL OnMouseWheel

それぞれのメッセージハンドラにメンバ関数の呼び出しを追加します。



ビルドし、エラー、警告がないことを確認します。

実行

マウス左ボタンドラックで描画空間が回転すること
マウス中ボタンドラッグで描画空間が平行移動すること
マウスホイールで描画空間が拡大縮小すること
を確認します。

実行結果

ダウンロード

ソースファイルダウンロード (ModelViewerOpenGLMFC2015_02_track.zip)

関連ページ

前項目:01.ベースOpenGLビュークラスを作る

次項目:03.ピックOpenGLビュークラスを作る