11. 3DCGモデルの表示

【計算機序論2・実習(2012年度)】 目次, 計算機序論2, 授業科目, www.kameda-lab.org 2012/11/19b

9節, 10節の内容をここで統合します。
やっとポリゴンが表示できるようになりますが、色はまだモデルのRGB値そのままです。

特に指定していませんが、どの節の場合でも、実行前に、プロジェクトディレクトリに ic2_DefaultObject.txt を配置しておくようにしてください。


11.01. プログラム同居

09-03, 10-02のソースファイル群はお互いに干渉しないように作られているので、main()関数が入っているファイル以外は同じプロジェクトに置いてもコンパイルに問題が発生しません。
全て過去のプログラムファイルそのままです。

【プログラム11-01】

  1. ic2-CommonHeaders.h
  2. ic2-ModelHeaders.h
  3. 07-03-EmbededObjects.c
  4. 07-04-Initialization.c
  5. 07-05-MainFunction.c
  6. 08-01-GLTools.c
  7. 09-02-Projection.c
  8. 09-03-Callback.c
  9. 09-03-Rendering.c
  10. 10-02-ReadModel.c

演習
11-01-ex1: 09-03-MainFunction.c と 10-02-MainFunction.c とを同じプロジェクトに置いてはいけない理由を説明しなさい。


11.02. プログラム統合

2つあるヘッダファイルを1つに統合します。
ヘッダファイルの統合に伴い、(連動して)1箇所だけ他のプログラムファイル内で変更点が発生します。

【プログラム11-02】

  1. ic2-CommonHeaders.h (11-01からの差分)
  2. 11-02-ReadModel.c (10-02からの差分)
  3. 07-03-EmbededObjects.c, 07-04-Initialization.c, 07-05-MainFunction.c, 08-01-GLTools.c, 09-02-Projection.c, 09-03-Callback.c, 09-03-Rendering.c

11.03. プログラム完全統合

あとは、main()を書き直して、モデルファイルの受付をできるようにします。
ここだけは、07-05-MainFunction.c と 10-02-MainFunction.c とをよく見比べながら書いていく必要があります。

【プログラム11-03】

  1. 11-03-MainFunction.c (07-05からの差分)
  2. 07-03-EmbededObjects.c, 07-04-Initialization.c, 08-01-GLTools.c, 09-02-Projection.c, 09-03-Callback.c, 09-03-Rendering.c, 11-02-ReadModel.c, ic2-CommonHeaders.h

11.04. ポリゴン表示

いよいよ読み込んだポリゴンリストを描画する関数 ic2_DrawModel() を用意します。
ic2_DrawModel() は 11-04-FileObjects.c の中で記述します。
ポリゴンは全て3角形パッチなので、描画にはGL_TRIANGLESという形式を利用します。
なお、モデルのパッチリストを保持している firstpatchptr はイベント駆動型プログラミングではイベントトリガ時に引き渡すいい方法がないので、大域変数化します。

【プログラム11-04】

  1. ic2-CommonHeaders.h (11-03からの差分)
  2. 11-04-FileObjects.c (新規)
  3. 11-04-MainFunction.c (11-03からの差分)
  4. 11-04-Rendering.c (09-03からの差分)
  5. 07-03-EmbededObjects.c, 07-04-Initialization.c, 08-01-GLTools.c, 09-02-Projection.c, 09-03-Callback.c, 11-02-ReadModel.c

演習
11-04-ex1: ヘッダファイルの外部宣言 (extern) において、変数の代入は可能かどうか、その理由と共に答えなさい。
11-04-ex2: GL_TRIANGLESの描画形式について説明しなさい。


11.05. ポリゴン表示・Depth付

描画できた!‥と思ったら、何か変ですね。
これは、前節のプログラムがポリゴンを「描いた順でどんどん上書きしてしまって」いるからです。
これをやめるためには、Depth bufferingという機能を利用する必要があります。
(Z-buffer法と呼ばれることもあります)
(はじめてDepth bufferを使ってリアルタイムポリゴンレンダリングハードウェアを見たときは物凄い衝撃でした‥あれから何十年経ったのやら。)

Depth bufferingの利用は3段階必要です。
- Depth bufferを使う予定であることを起動時に表明する
- フレームを新たに書き直すときに、Depth bufferも初期化する
- ポリゴンをレンダリングするとき(する前に)Depth bufferを使って前後判定を行うことを指示する
これにあわせて、プログラムも3箇所修正します。

【プログラム11-05】

  1. 11-05-Initialization.c (07-04からの差分)
  2. 11-05-Rendering.c (11-04からの差分)
  3. 07-03-EmbededObjects.c, 08-01-GLTools.c, 09-02-Projection.c, 09-03-Callback.c, 11-02-ReadModel.c, 11-04-FileObjects.c, 11-04-MainFunction.c, ic2-CommonHeaders.h

演習
11-05-ex1: ロゴマークと読み込んだ3DCGを同時に表示するようにプログラムを改造しなさい。
11-05-ex2: 09-03-ex3と同様に、移動と回転を伴って読み込んだ3DCGが周期運動するようにプログラムを改造しなさい。
11-05-ex3: ポリゴン数の多い3DCGファイルを用いて、ポリゴン数とシステム負荷との関係を調べてみなさい。


おまけ (3DCGフォーマット準拠)

人形データ 02


kameda[at]iit.tsukuba.ac.jp.