04.ピックDirect3Dレンダラクラスを作る



ピッキング(要素選択)に関する処理を担うピックDirect3Dレンダラクラスを、モデルDirect3Dレンダラクラスの派生クラスとして作成します。

プロジェクトを開く

03.で作成したモデルビューワプロジェクトを開きます。

トラックDirect3Dレンダラクラスの作成

「メニュー/プロジェクト/クラスの追加」でクラス名「CDirect3DRendererPick」のクラスを作成します。


テンプレート:C++ クラス
で追加ボタンを押します。


クラス名:CDirect3DRendererPick
基本クラス:CDirect3DRendererModel
で完了ボタンを押します。

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

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

Direct3DRendererPick.h のピックDirect3Dレンダラクラス定義の前に
名前列の大きさの定義
列挙型ERENDERMODEの定義
を追加します。
Direct3DRendererPick.h のピックDirect3Dレンダラクラス定義にメンバ変数、メンバ関数の宣言を追加します。



ビルドし、エラーが2件(「外部シンボルが未解決」1件、「外部参照が未解決」1件)あり、警告がないことを確認します。

メンバ変数の初期化

Direct3DRendererPick.cpp のピックDirect3Dレンダラクラスのコンストラクタにメンバ変数の初期化を追加します。



ビルドし、エラーが2件(「外部シンボルが未解決」1件、「外部参照が未解決」1件)あり、警告がないことを確認します。

RenderScene関数のオーバーライド

ベースDirect3Dレンダラクラスの描画処理はピック要素の描画を考慮していません。
ピックDirect3Dレンダラクラスにピック要素の描画を考慮した描画処理 RenderScene関数 をオーバーライドします。

Direct3DRendererPick.cpp の末尾にRenderScene関数の定義を追加します。



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

DoPicking関数の追加、編集

Direct3DRendererPick.cpp の末尾に要素選択操作に関するメンバ関数の定義を追加します。



ピック処理用のユーティリティ関数郡を用意します。

「メニュー/プロジェクト/新しい項目の追加」でファイル名「PickUtil.h」のファイルを作成します。
PickUtil.hの内容を以下のようにします。



「メニュー/プロジェクト/新しい項目の追加」でファイル名「PickUtil.cpp」のファイルを作成します。
PickUtil.cppの内容を以下のようにします。



Direct3DRenderPick.cpp のファイルヘッダー部に
#include "PickUtil.h"
を追加します。



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

レンダラオブジェクトのクラスの変更

ModelViewer.cpp の
#include "Direct3DRendererModel.h"

#include "Direct3DRendererPick.h"
に、
CDirect3DRendererModel d3drenderer;

CDirect3DRendererPick d3drenderer;
に変更します。



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

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

ModelViewer.cpp の WndProc関数に、以下のマウス操作ウィンドウメッセージ処理を追加します。

ウィンドウメッセージ名
WM_RBUTTONUP

ウィンドウズメッセージにレンダラメンバ関数の呼び出しを追加します。



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

実行

右クリックにより要素をピックできること
点をピックすると、ピックした点の色がピンク色になり点の大きさが少し大きくなること
線をピックすると、ピックした線の色が水色になり線の太さが少し太くなること
面をピックすると、ピックした面の色が黄色になること
を確認します。

実行結果

ダウンロード

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

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