3.ピックOpenGLビュークラスを作る
ピッキング(要素選択)に関する処理を担うピックOpenGLビュークラスを、トラックOpenGLビュークラスの派生クラスとして作成します。
実行形式ファイルダウンロード (PickOpenGL_exe.lzh)
ソースファイルダウンロード (PickOpenGL_src.lzh)
プロジェクトの作成
プロジェクトの種類:MFC AppWizard (exe)
プロジェクト名:PickOpenGL
位置:適当なフォルダを指定
それ以外:デフォルト設定のまま
でプロジェクトを作成します(OKボタンを押します)。
作成するアプリケーションの種類:SDI
それ以外:デフォルト設定のまま
で次へボタンを押します。
設定を変更せず次へボタンを押します。
設定を変更せず次へボタンを押します。
印刷および印刷プレビュー:チェックを外します
それ以外:デフォルト設定のまま
で次へボタンを押します。
設定を変更せず次へボタンを押します。
設定を変更せず終了ボタンを押します。
OKボタンを押します。
ビルドし、エラー、警告がないことを確認します。
ベースOpenGLビュークラスファイル、トラックOpenGLビュークラスファイルをプロジェクトに追加
「2.トラックOpenGLビュークラスを作る」で作成した
BaseOpenGLView.cpp
BaseOpenGLView.h
TrackOpenGLView.cpp
TrackOpenGLView.h
をPickOpenGLプロジェクトフォルダにコピーします。
プロジェクトに
BaseOpenGLView.cpp
BaseOpenGLView.h
TrackOpenGLView.cpp
TrackOpenGLView.h
を追加します。
TrackOpenGLView.cppの
#include "TrackOpenGL.h"
#include "TrackOpenDoc.h"
をコメントアウトします。
TrackOpenGLView.cppおよびTrackOpenGLView.hの
CTrackOpenGLDocをCDocumentに置換します。(「単語単位で探す」「大文字と小文字を区別する」にチェックを入れます。)
ビルドし、エラー、警告がないことを確認します。
ピックOpenGLビュークラスの親クラスの変更
PickOpenGLView.hに
#include "TrackOpenGLView.h"
を追加します。
PickOpenGLView.cppおよびPickOpenGLView.hの
CViewをCTrackOpenGLViewに置換します。(「単語単位で探す」「大文字と小文字を区別する」にチェックを入れます。)
ビルドし、エラー、警告がないことを確認します。
ピックOpenGLビュークラスのOnDraw()の削除
ベースOpenGLビュークラスのOnDraw()が呼ばれるように、ピックOpenGLビュークラスのOnDraw()を削除します。
ClassViewにてCPickOpenGLViewのOnDraw(CDC
*pDC)を右クリック、削除を選択します。
ビルドし、エラー、警告がないことを確認します。
実行し、TrackOpenGLプログラムと同じ結果になることを確認します。
メンバ変数、メンバ関数の宣言の追加
PickOpenGLView.h のピックOpenGLビュークラス宣言の前に
名前列の大きさの定義
列挙型ERENDERMODEの定義
を追加します。
PickOpenGLView.h のピックOpenGLビュークラス宣言の最後にメンバ変数、メンバ関数の宣言を追加します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数の初期化
ピックOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。
ビルドし、エラー、警告がないことを確認します。
RenderScene()のオーバーライド
ベースOpenGLビュークラスの描画処理は要素ピックを考慮していません。
ピックOpenGLビュークラスに要素ピックを考慮した描画処理
RenderScene() をオーバーライドします。
PickOpenGLView.h には宣言を追加済みです。
PickOpenGLView.cppにRenderScene()の定義を追加します。さらにRenderScene()で呼び出されるメンバ関数RenderObjects()の定義を追加します。
ベースOpenGLビュークラスのメンバ関数
RenderScene
をprotected関数、さらにvirtual関数とします。
ビルドし、エラー、警告がないことを確認します。
実行し、TrackOpenGLプログラムに対して、表示モデルが下図のモデルになっていることを確認します。
マウス操作イベントハンドラの追加、編集
以下のマウス操作メッセージハンドラをピックOpenGLビュークラスに追加します。
ウィンドウメッセージ名 | メッセージハンドラ名 |
---|---|
WM_RBUTTONUP | OnRButtonUp |
メッセージハンドラにメンバ関数の呼び出しを追加します。
ビルドし、エラーが2件(「外部シンボルが未解決」1件、「外部参照が未解決」1件)あり、警告がないことを確認します。
DoPicking()の追加、編集
要素選択操作に関するメンバ関数の定義を追加します。
トラックOpenGLビュークラスのメンバ関数
SetupViewingFrustum
をprotected関数とします。
ビルドし、エラー、警告がないことを確認します。
実行
右クリックにより要素をピックできること
点をピックすると、ピックした点の色がピンク色になり点の大きさが少し大きくなること
線をピックすると、ピックした線の色が水色になり線の太さが少し太くなること
面をピックすると、ピックした面の色が黄色になること
のを確認します。
実行結果