14.頂点法線ベクトルデータを使用した描画
13.で作成したモデルビューワは、光源の効果の利用に際して面法線ベクトルデータを使用した描画を行っています。面法線ベクトルデータを使用した描画の場合、面の折れ目が目立ちます。
頂点法線ベクトルデータを使用した描画を行うと、面の折れを目を立たなくすることができます。
解説
以下を行います。
- Modelクラスに、メンバー変数(頂点法線配列)の追加
- IndexedTriangleクラスに、メンバー変数(頂点法線番号)の追加
- GroupクラスのVBO作成処理の変更(頂点法線配列への対応)
- OBJファイル読み込み処理の変更(頂点法線配列への対応)
プロジェクトを開く
13.で作成したモデルビューワプロジェクトを開きます。
Modelクラスに、メンバー変数(頂点法線配列)の追加
Modelクラスに、頂点法線配列(m_vVectorVertexNormal)を追加します。
Model.h の Model クラス宣言の内容を以下のようにします。
Model.cpp の Model クラスのClear関数と イコールオペレータ関数に、頂点法線配列(m_vVectorVertexNormal)に関する処理を追加します。
ビルドし、エラー、警告がないことを確認します。
IndexedTriangleクラスに、メンバー変数(頂点法線番号)の追加
IndexedTriangleクラスに、頂点法線番号(m_ui3IndexVertexNormal)を追加します
IndexedTriangleクラスの内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
GroupクラスのVBO作成処理の変更(頂点法線配列への対応)
GroupクラスのVBO作成処理の「面法線を計算し、頂点の法線として設定する処理」について、「頂点法線配列がある場合には、面法線を計算せず、頂点法線配列の値を設定する処理」に変更します。
Model.h の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
OBJファイル読み込み処理の変更(頂点法線配列への対応)
OBJファイルのファイルフォーマットは、頂点法線を扱うことができます。
13.で作成したOBJファイル読み込み処理は、頂点法線データを読み飛ばしていました。
頂点法線データを読み込むように変更します。
LoadObjFile.cpp の LoadObjFile 関数の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
実行し、couch.objファイルを読み込み、面の折れを目が立たない描画になっているのを確認します。
couch.objファイルの読み込み
(面の折れ目が目立たない描画になっています)
(「メニュー/表示/描画」で、点、線を非描画にしています。)
(画像をクリックすると大きい画像が表示されます)
参考)13.で作成したモデルビューワで、couch.objの読み込み
(面の折れ目が目立つ描画になっています)
(「メニュー/表示/描画」で、点、線を非描画にしています。)
(画像をクリックすると大きい画像が表示されます)
ダウンロード
ソースファイルダウンロード ( ModelViewerOpenGLWinAPI2015_14_vertexnormalvector.zip )
関連ページ
前項目:13.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する