4.モデルビューワを作る



1.~3.で作成したクラスを用いてモデルビューワを作成します。
「3.ピックOpenGLビュークラスを作る」 で作成したプログラムに対して、以下の機能を追加したものを作成します。
描画要素(点、線、面)のON/OFF
マウス操作(回転、平行移動、拡大縮小)のON/OFF
ピック要素(点、線、面)のON/OFF

実行形式ファイルダウンロード (ModelViewer_exe.lzh)

ソースファイルダウンロード (ModelViewer_src.lzh)

プロジェクトの作成

プロジェクトの種類:MFC AppWizard (exe)
プロジェクト名:ModelViewer
位置:適当なフォルダを指定
それ以外:デフォルト設定のまま
でプロジェクトを作成します(OKボタンを押します)。

作成するアプリケーションの種類:SDI
それ以外:デフォルト設定のまま
で次へボタンを押します。

設定を変更せず次へボタンを押します。

設定を変更せず次へボタンを押します。

印刷および印刷プレビュー:チェックを外します
それ以外:デフォルト設定のまま
で次へボタンを押します。

設定を変更せず次へボタンを押します。

設定を変更せず終了ボタンを押します。

OKボタンを押します。

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

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

「2.トラックOpenGLビュークラスを作る」で作成した
BaseOpenGLView.cpp
BaseOpenGLView.h
TrackOpenGLView.cpp
TrackOpenGLView.h
PickOpenGLView.cpp
PickOpenGLView.h
をModelViewerプロジェクトフォルダにコピーします。

プロジェクトに
BaseOpenGLView.cpp
BaseOpenGLView.h
TrackOpenGLView.cpp
TrackOpenGLView.h
PickOpenGLView.cpp
PickOpenGLView.h
を追加します。


PickOpenGLView.cppの
#include "PickOpenGL.h"
#include "PickOpenDoc.h"
をコメントアウトします。



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

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

モデルビューワのビュークラスの親クラスの変更

ModelViewerView.hに
#include "PickOpenGLView.h"
を追加します。



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

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

モデルビューワのビュークラスのOnDraw()の削除

ベースOpenGLビュークラスのOnDraw()が呼ばれるように、モデルビューワのOpenGLビュークラスのOnDraw()を削除します。
ClassViewにてCModelViewerViewのOnDraw(CDC *pDC)を右クリック、削除を選択します。

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

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

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

ModelViewerView.h のモデルビューワのビュークラス宣言の最後にメンバ変数、メンバ関数の宣言を追加します。



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

メンバ変数の初期化

モデルビューワのビュークラスのコンストラクタにメンバ変数の初期化を追加します。



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

メニューアイテムの追加

メニュー/表示 に以下のメニューアイテムを追加します。

メニュー名 メニューID
マウス操作
回転 ID_VIEW_SPIN
平行移動 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応答関数をモデルビューワのビュークラスに追加します。

メニューID COMMANDメッセージ
応答関数名
UPDATE_COMMAND_UP
応答関数名
ID_VIEW_SPIN OnViewSpin OnUpdateViewSpin
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メッセージ応答関数の追加画面例


追加した応答関数を編集します。

COMMANDメッセージ応答関数の編集結果



UPDATE_COMMAND_UPメッセージ応答関数の編集結果



ピックOpenGLビュークラスのメンバ変数
m_auiName_pick
をprotected変数とします。



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

DoTracking()のオーバーライド

モデルビューワのビュークラスにマウス操作のON/OFFに対応したトラッキング処理 DoTracking() をオーバーライドします。

ModelViewerView.h には宣言を追加済みです。
ModelViewerView.cppにDoTracking()の定義を追加します。



トラックOpenGLビュークラスのメンバ変数
m_eTrackingMode
をprotected変数とします。



トラックOpenGLビュークラスのメンバ関数
DoTracking
をprotected関数、さらにvirtual関数とします。



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

RenderObjects()のオーバーロード

モデルビューワのビュークラスに描画要素のON/OFF、ピック要素のON/OFFに対応した要素描画処理 RenderObjects() をオーバーライドします。

ModelViewerView.h には宣言を追加済みです。
ModelViewerView.cppにRenderObjects()の定義を追加します。



ピックOpenGLビュークラスのメンバ関数
RenderObjects
をprotected関数、さらにvirtual関数とします。



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

実行

メニューから
描画要素(点、線、面)のON/OFF
マウス操作(回転、平行移動、拡大縮小)のON/OFF
ピック要素(点、線、面)のON/OFF
を変更することが可能となっていること、
メニューの変更が画面、操作に反映されていることを確認します。

実行結果