04.モデルビューワを作る
01.~03.で作成したクラスを用いてモデルビューワを作成します。
「03.ピックOpenGLビュークラスを作る」 で作成したプログラムに対して、以下の機能を追加したものを作成します。
描画要素(点、線、面)のON/OFF
マウス操作(回転、平行移動、拡大縮小)のON/OFF
ピック要素(点、線、面)のON/OFF
解説
ワイヤーフレーム表示にしたり、サーフェース表示にしたりできるように、描画要素(点、線、面)のON/OFFの設定に応じて描画処理を行います。
ピックする要素として、点のみピックできるようにしたり、面のみピックできるようにしたりできるように、ピック要素(点、線、面)のON/OFFの設定に応じてピック処理を行います。
ローテートできないようにしたり、パンできないようにしたり、ズームできないようにしたりできるように、トラッキングモード(ローテート、パン、ズーム)のON/OFFの設定に応じて、トラック処理を行います。
プロジェクトの作成
「メニュー/新規作成/プロジェクト」を選択します。
プロジェクトの種類:MFC
テンプレート:MFC アプリケーション
プロジェクト名:ModelViewer
場所:適当なフォルダを指定
ソリューションのディレクトリの作成:チェックしない
でOKボタンを押します。
以降、「01.ベースOpenGLビュークラスを作る」におけるプロジェクト作成と同じ設定でプロジェクトを作成します。
ビルドし、エラー、警告がないことを確認します。
ベースOpenGLビュークラスファイル、トラックOpenGLビュークラスファイル、ピックOpenGLビュークラスファイルをプロジェクトに追加
「03.ピックOpenGLビュークラスを作る」で作成した
OpenGLBaseView.cpp
OpenGLBaseView.h
OpenGLExtFuncs.cpp
OpenGLExtFuncs.h
OpenGLTrackView.cpp
OpenGLTrackView.h
OpenGLPickView.cpp
OpenGLPickView.h
をModelViewerプロジェクトフォルダにコピーします。
プロジェクトに
OpenGLBaseView.cpp
OpenGLBaseView.h
OpenGLExtFuncs.cpp
OpenGLExtFuncs.h
OpenGLTrackView.cpp
OpenGLTrackView.h
OpenGLPickView.cpp
OpenGLPickView.h
を追加します。
OpenGLPickView.cppの
#include "OpenGLPick.h"
#include "PickOpenDoc.h"
をコメントアウトします。
OpenGLPickView.cppおよびOpenGLPickView.hの
「COpenGLPickDoc」を「CDocument」に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)
ビルドし、エラー、警告がないことを確認します。
モデルビューワのビュークラスの親クラスの変更
ModelViewerView.h に
#include "OpenGLPickView.h"
を追加します。
ModelViewerView.cpp および ModelViewerView.h の
「CView」を「COpenGLPickView」に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)
ビルドし、エラー、警告がないことを確認します。
モデルビューワのビュークラスのOnDraw関数の削除
ベースOpenGLビュークラスのOnDraw関数が呼ばれるように、モデルビューワビュークラスのOnDraw関数を削除します。
(オーバーライド関数の削除は、「クラスビュー」と「プロパティビュー」を使用します。
まず、「クラスビュー」で、メッセージハンドラを削除するクラスを選択します。
次に、「プロパティビュー」のツールバーの「オーバーライド」を選択します。削除するオーバーライド関数の右側のドロップダウンリストを用いてオーバーライド関数を削除します)
ビルドし、エラー、警告がないことを確認します。
実行し、OpenGLPickプログラムと同じ結果になることを確認します。
メンバ変数、メンバ関数の宣言の追加
ModelViewerView.h のモデルビューワのビュークラス定義の最初にメンバ変数、メンバ関数の宣言を追加します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数の初期化
ModelViewerView.cpp のモデルビューワのビュークラスのコンストラクタにメンバ変数の初期化を追加します。
ビルドし、エラー、警告がないことを確認します。
メニューアイテムの追加
メニュー/表示 に以下のメニューアイテムを追加します。
(メニューへのアイテムの追加、編集は、「リソースビュー」を使用します)
メニュー名 | メニューID | |
---|---|---|
マウス操作 | - | - |
- | 回転 | ID_VIEW_ROTATION |
- | 平行移動 | ID_VIEW_PAN |
- | 拡大縮小 | ID_VIEW_ZOOM |
描画 | - | - |
- | 点 | ID_VIEW_RENDERPOINT |
- | 線 | ID_VIEW_RENDERLINE |
- | 面 | ID_VIEW_RENDERFACE |
ピック | - | - |
- | 点 | ID_VIEW_PICKPOINT |
- | 線 | ID_VIEW_PICKLINE |
- | 面 | ID_VIEW_PICKFACE |
メニューアイテム追加画面例
ビルドし、エラー、警告がないことを確認します。
メニューアイテムの応答関数の追加、編集
追加したメニューアイテムのCOMMANDメッセージ応答関数およびUPDATE_COMMAND_UI応答関数をモデルビューワのビュークラスに追加します。
(COMMANDメッセージ応答関数およびUPDATE_COMMAND_UI応答関数の追加は、「クラスビュー」と「プロパティビュー」を使用します。
まず、「クラスビュー」で、メッセージハンドラを追加するクラスを選択します。
次に、「プロパティビュー」のツールバーの「イベント」を選択します。追加するメニューコマンドID「ID_XXX_XXX」の左側の「+」をクリックし、ツリーを展開します。「COMMAND」「UPDATE_COMMAND_UI」が現れます。右側のドロップダウンリストを用いて応答関数を追加します)
メニューコマンドID | COMMANDメッセージ 応答関数名 |
UPDATE_COMMAND_UP 応答関数名 |
---|---|---|
- | - | - |
ID_VIEW_ROTATION | OnViewRotation | OnUpdateViewRotation |
ID_VIEW_PAN | OnViewPan | OnUpdateViewPan |
ID_VIEW_ZOOM | OnViewZoom | OnUpdateViewZoom |
- | - | - |
ID_VIEW_RENDERPOINT | OnViewRenderpoint | OnUpdateViewRenderpoint |
ID_VIEW_RENDERLINE | OnViewRenderline | OnUpdateViewRenderline |
ID_VIEW_RENDERFACE | OnViewRenderface | OnUpdateViewRenderface |
- | - | - |
ID_VIEW_PICKPOINT | OnViewPickpoint | OnUpdateViewPickpoint |
ID_VIEW_PICKLINE | OnViewPickline | OnUpdateViewPickline |
ID_VIEW_PICKFACE | OnViewPickface | OnUpdateViewPickface |
追加した応答関数を編集します。
COMMANDメッセージ応答関数およびUPDATE_COMMAND_UPメッセージ応答関数の編集結果
ビルドし、エラー、警告がないことを確認します。
DoTracking関数のオーバーライド
モデルビューワのビュークラスにマウス操作のON/OFFに対応したトラッキング処理 DoTracking関数 をオーバーライドします。
ModelViewerView.cpp にDoTracking関数の定義を追加します。
OpenGLTrackView.h のトラックOpenGLビュークラスのメンバ変数
m_eTrackingMode
をprotected変数とします。
メンバ関数
DoTracking
をprotected関数、さらにvirtual関数とします。
ビルドし、エラー、警告がないことを確認します。
RenderModel関数のオーバーロード
モデルビューワのビュークラスに描画要素のON/OFFに対応した要素描画処理 RenderModel関数 をオーバーライドします。
ModelViewerView.cpp にRenderModel関数の定義を追加します。
OpenGLPickView.h のピックOpenGLビュークラスのメンバ変数
m_auiName_picked
をprotected変数とします。
メンバ関数
RenderModel
をprotected関数、さらにvirtual関数とします。
ビルドし、エラー、警告がないことを確認します。
IdentifyPickRegionPixels関数のオーバーロード
モデルビューワのビュークラスにピック要素のON/OFFに対応したピック要素特定処理 IdentifyPickRegionPixels関数 をオーバーライドします。
ModelViewerView.cpp にIdentifyPickRegionPixels関数の定義を追加します。
OpenGLPickView.h のピックOpenGLビュークラスのメンバ関数
IdentifyPickRegionPixels
をprotected関数、さらにvirtual関数とします。
ビルドし、エラー、警告がないことを確認します。
実行
メニューから
描画要素(点、線、面)のON/OFF
マウス操作(回転、平行移動、拡大縮小)のON/OFF
ピック要素(点、線、面)のON/OFF
を変更することが可能となっていること、
メニューの変更が画面、操作に反映されていることを確認します。
実行結果
ダウンロード
ソースファイルダウンロード (ModelViewerOpenGLMFC2015_04_app.zip)
関連ページ
前項目:03.ピックOpenGLビュークラスを作る
次項目:05.モデルデータ構造を作る