09.光源の効果の利用
光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。
08.で作成したモデルビューワに光源の効果を付加します。
プロジェクトを開く
08.で作成したモデルビューワプロジェクトを開きます。
ライトDirect3DRendererクラスを新規作成する
「メニュー/プロジェクト/クラスの追加」でクラス名「CDirect3DRendererLight」のクラスを作成します。
テンプレート:C++ クラス
で追加ボタンを押します。
クラス名:CDirect3DRendererLight
基本クラス:CDirect3DRendererPick
で完了ボタンを押します。
ビルドし、エラー、警告がないことを確認します。
モデルビューワレンダラクラスの親クラスの変更
ModelViewerRenderer.hの
#include "direct3drendererpick.h"
を
#include "direct3drendererlight.h"
に書き換えます。
CModelViewerRendererクラスの親クラス指定の
public CDirect3DRendererPick
を
public CDirect3DRendererLight
に書き換えます。
ビルドし、エラー、警告がないことを確認します。
光源設定データ構造の作成
Direct3DRendererLight.h に
M_PIの定義
と、
光源設定データ構造の定義
を追加します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数、メンバ関数の宣言の追加
Direct3DRendererLight.h のライトDirect3Dレンダラクラス定義にメンバ変数、メンバ関数の宣言を追加します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数の初期化
Direct3DRendererLight.cpp のライトDirect3Dレンダラクラスのコンストラクタにメンバ変数の初期化を追加します。
メンバ関数の定義の追加
Direct3DRendererLight.cpp の末尾にメンバ関数の定義を追加します。
Direct3DRendererBase.h のベースDirect3Dレンダラクラスのメンバ関数
SetupLight
をprotected関数、さらにvirtual関数とします。
ビルドし、エラー、警告がないことを確認します。
頂点データ構造に法線ベクトルデータの追加
面が光源の効果を正しく受けるためには、頂点法線ベクトルを設定する必要があります。
CVertexクラスに法線ベクトルデータを追加します。
ModelDataStructure.h の D3DFVF_CUSTOMVERTEXの定義およびCVertexクラス定義を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
モデルデータファイル読み込み処理に頂点法線ベクトル設定処理の追加
面が光源の効果を正しく受けるためには、頂点法線ベクトルを設定する必要があります。
モデルデータ読み込み処理に頂点法線ベクトル設定処理を追加します。
LoadStlFile.cppに
#include <math.h>
を追加し、
LoadStlFile関数に
"endfacet"時に頂点法線ベクトル設定をする処理
を追加します。
ビルドし、エラー、警告がないことを確認します。
RenderSceneの編集
描画処理を光源の効果を使用した処理に変更します。
面が光源の効果を正しく受けるためには、面のマテリアルの設定を、Emissiveではなく、Ambient,Diffuse,Specularによって定義する必要があります。
ModelViewerRenderer.cpp のRenderScene関数の
mtrlFace.Emissive = D3DXCOLOR( 0.5, 0.5, 0.0, 1.0 );
をコメントアウトし、
mtrlFace.Ambient = D3DXCOLOR( 0.5, 0.5, 0.0, 1.0 );
mtrlFace.Diffuse = D3DXCOLOR( 0.5, 0.5, 0.0, 1.0 );
mtrlFace.Specular = D3DXCOLOR( 0.5, 0.5, 0.0, 1.0 );
を追加します。
ビルドし、エラー、警告がないことを確認します。
実行
モデルの面の明るさに差があり、立体感があります。
ModelData01.stlファイルの読み込み
ダウンロード
実行形式ファイルダウンロード (ModelViewerDirect3DWinAPI2008_09_exe.lzh)
ソースファイルダウンロード (ModelViewerDirect3DWinAPI2008_09_src.lzh)