10.光源の効果の利用
光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。
09.で作成したモデルビューワに光源の効果を付加します。
プロジェクトを開く
09.で作成したモデルビューワプロジェクトを開きます。
ライトOpenGLRendererクラスを新規作成する
「メニュー/プロジェクト/クラスの追加」でクラス名「COpenGLRendererLight」のクラスを作成します。
テンプレート:C++ クラス
で追加ボタンを押します。
クラス名:COpenGLRendererLight
基本クラス:COpenGLRendererTrack
で完了ボタンを押します。
ビルドし、エラー、警告がないことを確認します。
ピックOpenGLレンダラクラスの親クラスの変更
OpenGLRendererPick.hの
#include "openglrenderertrack.h"
を
#include "openglrendererlight.h"
に書き換えます。
COpenGLRendererPickクラスの親クラス指定の
public COpenGLRendererTrack
を
public COpenGLRendererLight
に書き換えます。
ビルドし、エラー、警告がないことを確認します。
光源設定データ構造の作成
OpenGLRendererLight.hに
以下のような光源設定データ構造を作成します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数、メンバ関数の宣言の追加
OpenGLRendererLight.h のライトOpenGLレンダラクラス定義にメンバ変数、メンバ関数の宣言を追加します。
ビルドし、エラーが4件(「外部シンボルが未解決」3件、「外部参照が未解決」1件)あり、警告がないことを確認します。
メンバ変数の初期化
OpenGLRendererLight.cpp のライトOpenGLレンダラクラスのコンストラクタにメンバ変数の初期化を追加します。
ビルドし、エラーが4件(「外部シンボルが未解決」3件、「外部参照が未解決」1件)あり、警告がないことを確認します。
メンバ関数の定義の追加
OpenGLRendererLight.cpp の末尾にメンバ関数の定義を追加します。
光源が、「モデル座標系の移動の影響は受けるが、モデル回転変換の影響は受けない」ように、SetupLight関数の呼び出しをモデル座標系の移動と、モデル回転変換の間に配置します。
OpenGLRendererTrack.h のトラックOpenGLレンダラクラスのメンバ変数
m_f3RenderingCenter
m_objectXform
をprotected変数とします。
ビルドし、エラー、警告がないことを確認します。
面に対して光源の効果を有効にする
面に対して光源の効果が有効になるように
CModelViewerRenderer::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の編集
- 面に対して光源の効果を有効にする
- 面に対して法線ベクトル設定処理の追加
- 面の色設定が反映されるようにする
を反映させ、ModelViewerRenderer.cpp のRenderObjects関数を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
モデルの面の明るさに差があり、立体感があります。
面の色としてglColorで与えた色が反映されています。
ModelData01.stlファイルの読み込み
ダウンロード
実行形式ファイルダウンロード (ModelViewerOpenGLWinAPI2008_10_exe.lzh)
ソースファイルダウンロード (ModelViewerOpenGLWinAPI2008_10_src.lzh)