12.「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応する
11.で作成したモデルビューワは、モデルファイルの面はすべて同一のマテリアル設定としていました。
マテリアル設定が同一である面の集まりに対してグループというデータ構造を用意し、モデルはグループの集まりであるとするデータ構造を用意することで、「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応します。
ついでに、頂点法線ベクトルデータ、面法線ベクトルデータも保持するようにモデルデータ構造を変更します。
解説
「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応するために、マテリアル設定が同一である面の集まりに対してグループというデータ構造を用意し、モデルはグループの集まりであるとします。
以下を行います。
- マテリアルクラスの作成
- グループクラスの作成
- モデルクラスの変更
- モデルファイル読み込み処理の変更
- モデル描画処理の変更
プロジェクトを開く
11.で作成したモデルビューワプロジェクトを開きます。
モデルに関するデータ構造の変更
マテリアルデータ構造の追加、グループデータ構造の追加、モデルデータ構造の変更等のモデルに関するデータ構造の変更を行ないます。
Model.h の内容を以下のようにします。
Model.cpp の内容を以下のようにします。
ファイル読み込み処理の変更
データ構造の変更にあわせて、ファイル読み込み処理を、変更後のデータ構造に対応したものへ変更します。
LoadStlFile.cpp のLoadStlFile関数の内容を以下のようにします。
描画処理の変更
データ構造の変更にあわせて、描画処理を、変更後のデータ構造に対応したものへ変更します。
ModelViewerRenderer.cpp のRenderModel関数の内容を以下のようにします。
要素選択関数の変更
ピックOpenGLレンダラクラスの要素選択関数を、モデルデータ構造の変更に対応したものへ変更します。
描画のモードに関する 列挙型の定義に、グループ番号ピック描画モードを追加します。
グループ番号ピック描画モードでモデルを描画し、描画後、ピック領域のピクセルの色を読み取り、グループ番号をピック領域の名前列の1番目にセットする処理を追加します。
OpenGLRendererPick.cpp の enum ERENDERMODE に、RM_PICK_GROUPID を追加します。
OpenGLRendererPick.cpp のCOpenGLRendererPick::DoPicking関数の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
実行し、動作を確認します。
(11.で作成したモデルビューワと動作上の変化はありません。)
sphere.stlファイルの読み込み
(「メニュー/表示/描画」で、点、線を非描画にしています。)
ダウンロード
ソースファイルダウンロード ( ModelViewerOpenGLWinAPI2015_12modelgroup.zip )
関連ページ
前項目:11.マテリアルの効果の利用
次項目:13.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する