モデルビューワを作る(OpenGL+MFC) (Visual C++ 6.0版)

OpenGLとMFCのDoc/Viewアーキテクチャーを用いて再利用可能なOpenGLビュークラスを作成し、作成したOpenGLビュークラスを用いてモデルビューワを作成する方法を解説します。
使用開発環境は Visual C++ 6.0 です。
(使用開発環境が Visual C++ 2005 の モデル ビューワ を作る(OpenGL+MFC) (Visual C++ 2005版) もあります。)

1.ベースOpenGLビュークラスを作る
OpenGLの初期化処理と終了処理を行い、OpenGLを用いた描画処理の骨格を担う、ベースOpenGLビュークラスを作成します。

2.トラックOpenGLビュークラスを作る
トラッキング(マウス操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLビュークラスを、ベースOpenGLビュークラスの派生クラスとして作成します。

3.ピックOpenGLビュークラスを作る
ピッキング(要素選択)に関する処理を担うピックOpenGLビュークラスを、トラックOpenGLビュークラスの派生クラスとして作成します。

4.モデルビューワを作る
1.~3.で作成したクラスを用いてモデルビューワを作成します。

5.モデルデータ構造を作る
4.で作成したモデルビューワは、表示するモデルデータを描画関数内で定義していました。
モデルデータ構造を作成し、4.で作成したモデルビューワを、モデルデータ構造データを描画するようにします。

6.モデルデータファイル読み込みを作る
5.で作成したモデルビューワは、表示するモデルデータをアプリケーション内で定義していました。
モデルデータファイル読み込み処理を作成し、5.で作成したモデルビューワを、ファイルからモデルデータを読み込んで描画するようにします。(アスキー形式STLファイル読み込み処理を作成します。)

7.描画速度の計測
6.で作成したモデルビューワに、描画速度をステータスバーに表示する機能を付加します。

8.描画の高速化(通常描画とピック描画の処理の分離)
5.で作成したモデルビューワの描画処理は、通常描画とピック描画を同一の処理で行っていました。
通常描画とピック描画とで処理を分けることにより通常描画の高速化を行います。

9.描画の高速化(ディスプレイリストの利用)
8.で作成したモデルビューワの通常描画処理は、再描画のたびに、すべての描画要素に対してOpenGLの処理を呼び出していました。
ディスプレイリストを使用した描画高速化を行います。
(ディスプレイリストを使用すると、一連のOpenGLのコマンドの呼び出しをひとまとめにしてメモリ上に蓄えます。再描画の際にはメモリ上に蓄えた一連のOpenGLのコマンドの呼び出しをひとまとめで処理します。一連のOpenGLのコマンドの呼び出しを順次処理する場合に比べて、短時間で処理が行われます。)

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

11.マテリアルの効果の利用
マテリアルの効果を利用すると、描画されるモデルに質感を与えることができます。
10.で作成したモデルビューワにマテリアルの効果を付加します。

12.「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応する
11.で作成したモデルビューワは、モデルファイルの面はすべて同一のマテリアル設定としていました。
マテリアル設定が同一である面の集まりに対してグループというデータ構造を用意し、モデルはグループの集まりであるとするデータ構造を用意することで、「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応します。
ついでに、頂点法線ベクトルデータ、面法線ベクトルデータも保持するようにモデルデータ構造を変更します。

13.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する
「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応します。
12.のファイル読み込み処理は、アスキー形式STLファイル読み込み処理でしたが、新たに、OBJファイル読み込み処理を追加し、読み込むファイルの拡張子により、アスキー形式STLファイル読み込み処理とOBJファイル読み込み処理のどちらかが呼び出されるように変更します。
※STLファイルは、「面はすべて同一のマテリアル設定」であるモデルしか表現できませんが、OBJファイルは、「面はすべて同一のマテリアル設定」でないモデルも表現できます。また、OBJファイルは、頂点ごとに異なる法線ベクトルデータを持ったモデルも表現できます。

14.頂点法線ベクトルデータを使用した描画
13.で作成したモデルビューワは、光源の効果の利用に際して面法線ベクトルデータを使用した描画を行っています。面法線ベクトルデータを使用した描画の場合、面の折れ目が目立ちます。
頂点法線ベクトルデータを使用した描画を行うと、面の折れを目を立たなくすることができます。

15.Hira3D読み込みプラグインを利用したモデルファイルの読み込みに対応する
Hira3D読み込みプラグインを利用したモデルファイルの読み込みに対応します。
Hira3D読み込みプラグインを利用したモデルファイルの読み込みに対応すると、読み込みプラグインが存在するモデルファイルフォーマットに関しては、自分でファイル読み込み処理を作る必要がなくなります。
(2006/01/15現在 Hira3DViewerには、「.3ds」「.dxf」「.gts」「.obj」「.stl」読み込みプラグインが添付されています。)

16.モデルファイル読み込みの進捗表示
15.で作成したモデルビューワは、ファイルサイズの大きなモデルファイルを読み込んだ際など、ファイル読み込み開始からファイル読み込み完了まで時間を要する場合に、ソフトウェアが固まったかのような状態になります。
モデルファイル読み込みの進捗表示ダイアログを表示し、ファイル読み込み開始からファイル読み込み完了まで時間を要する場合でも、ソフトウェアが固まったかのような状態にならないようにします。

(続きの章のネタがないわけではないので続きの章ができる可能性は否定できませんが、ひとまず、「モデルビューワを作る」は16章で完結とします。[2006/01/15])

参考書籍

書籍名 コメント
OpenGL Programming for WIndows 95 and Windows NT (日本語版) MFCのDOC/VIEWアーキテクチャー上にOpenGL描画処理を実装する方法を丁寧に説明しています。絶版?
「1.ベースOpenGLビュークラスを作る」は、本書籍のプログラムが元になっています。
MFCによるWindows95プログラミング MFCプログラマー必読書です。MFCを使用してプログラミングをするならばこれを読まなくてははじまりません。WindowsプログラミングのイベントドリブンがどうMFCで隠蔽され、プログラマーは何をすべきかを正しく学ぶことができます。始めから終わりまで通して読むべき教科書本です。
OpenGLプログラミングガイド 第2版 OpenGLを使用してプログラミングをするならばこれがなくてははじまりません。必要な時に必要な箇所を参照する辞書本です。