10.光源の効果の利用



光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。
09.で作成したモデルビューワに光源の効果を付加します。

プロジェクトを開く

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

ライトOpenGLViewクラスを新規作成する

「メニュー/プロジェクト/クラスの追加」を選択します。

カテゴリ:MFC
テンプレート:MFC クラス


クラス名:COpenGLLightView
基本クラス:CView

「完了」ボタンを押します。

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

ライトOpenGLViewクラスの親クラスの変更

OpenGLLightView.h に
#include "OpenGLTrackView.h"
を追加します。



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

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

ライトOpenGLViewクラスのOnDraw関数の削除

ベースOpenGLビュークラスのOnDraw関数が呼ばれるように、ライトOpenGLビュークラスのOnDraw関数を削除します。
プロパティウィンドウで、オーバーライドモードで、OnDrawを探し、「<削除> OnDraw」を実行します。

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

ピックOpenGLビュークラスの親クラスの変更

OpenGLPickView.h の
#include "OpenGLTrackView.h"

#include "OpenGLLightView.h"
に書き換えます。



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

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

光源設定データ構造の作成

OpenGLLightView.h に
以下のような光源設定データ構造を追加します。



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

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

OpenGLLightView.h のライトOpenGLビュークラス定義の最初にメンバ変数、メンバ関数の宣言を追加します。

メンバ変数の初期化

OpenGLLightView.cpp のライトOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。

メンバ関数の定義の追加

OpenGLLightView.cpp にメンバ関数の定義を追加します。
光源が、「モデル座標系の移動の影響は受けるが、モデル回転変換の影響は受けない」ように、SetupLight関数の呼び出しをモデル座標系の移動と、モデル回転変換の間に配置します。



OpenGLTrackView.h のトラックOpenGLビュークラスのメンバ変数
m_f3RenderingCenter
m_objectXform
をprotected変数とします。



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

面に対して光源の効果を有効にする

面に対して光源の効果が有効になるように
CModelViewerView::RenderObjects関数
の実装を変更します。
(逆に言うと、面以外の線や点に対しては、光源の効果が有効にならないように実装します。)

面の描画処理の、
glNewList関数呼び出しと、glColor3f関数呼び出しの間に、
::glEnable(GL_LIGHTING);
を追加し
glEndList関数呼び出し直前に、
glDisable( GL_LIGHTING );
を追加します。

面に対して法線ベクトル設定処理の追加

面が光源の効果を正しく受けるためには、面の法線ベクトルを設定する必要があります。

面の描画処理の、::glEnable(GL_LIGHTING);呼び出しと、glColor3f関数呼び出しの間に、
::glEnable( GL_NORMALIZE );
::glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, 1 );

を追加し、
面の描画処理の、glVertex関数呼び出しの前に、
面の法線ベクトルを求める処理と、
glNormal関数呼び出し
を追加します。

面の色設定が反映されるようにする

面の描画処理の、glLightModel関数呼び出しと、glColor3f関数呼び出しの間に、
glEnable( GL_COLOR_MATERIAL );
を追加します。

RenderObjectsの編集

を反映させ、ModelViewerView.cpp のRenderObjects関数 の内容を以下のようにします。



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

実行

モデルの面の明るさに差があり、立体感があります。
面の色としてglColorで与えた色が反映されています。

ModelData01.stlファイルの読み込み

ダウンロード

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

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