10. ファイルからの3DCGモデル読込

【プログラミング序論3(2014年度)】 目次, 講義ページ, 授業科目, www.kameda-lab.org 2015/02/12c

02.節でもファイルのオープン・クローズの簡単なテストを行いましたが、ここでは、3DCGのフォーマットを決定してその情報をファイルから読み込めるようにします。
ファイルからデータを読み込んでメモリ上に展開するまでのところは、09節までのプログラムとは直接関係しないので、本節のプログラムはここで初めから書き起こします。


10.01. ファイルのオープン・クローズ

3DCGモデルのファイル読込は、将来的にはライブラリにして09.節の本体プログラムに統合するという見通しにしておきます。
このためには、初めからファイルを分割してプログラミングするのがよいことになります。
10.01.節ではファイルの中にまで踏み込まないので、モデルファイルは存在さえしていれば内容は空でも構いません。

【プログラム10-01】

  1. 10-01-MainFunction.c
  2. 10-01-ReadModel.c
  3. ic2_DefaultModel.txt

演習

10-01-ex1: エラートラップ
本節のプログラムにおいて、エラートラップと呼べる行を示し、トラップするエラーと、その対策を示しなさい。複数ある場合は全て示すこと。

10-01-ex2: エラートラップの確認
10-01-ex1のエラートラップが実際に発生することを確認しなさい。

10-01-ex3: define文の実際
Cコンパイラにおいて、#define文で導入された文字列がどのようにメモリ上に展開されるか、eclipseを用いて確認してみなさい。


10.02. モデルデータのファイルからの読込

3DCGモデルファイルのデータフォーマット

3DCGモデルをテキストファイルで表現することを考えます。
1行で三角形パッチ1つを表現します。
X0 Y0 Z0 X1 Y1 Z1 X2 Y2 Z2 R G B

ファイル内の構文
[1] 要素の間は1つ以上のスペース
[2] 3頂点を0,1,2の順に(右ネジに)なぞったときに反時計回りに見える側を表とする(右ネジの先端側が表)
[3] RGBは0.0〜1.0の範囲
[4] 空行、スペースのみの行は無視
[5] 先頭が#で始まる行はコメント行として無視

なお、本授業では、単純化のため、三角形パッチ以外のCGプリミティブは使用しません。

構造体の利用

上記のデータ構造に合わせて、ic2PATCH構造体を用意します。
ic2PATCH構造体はic2POINT構造体とic2COLOR構造体から構成されます。
また、リンクトリストで複数のパッチを一括管理するために、ポインタを含んでいます。

ヘッダファイル (ic2-ModelHeaders.h)
ライブラリ的利用をするために、共通部分をヘッダファイル化します。

【プログラム10-02】

  1. ic2-ModelHeaders.h
  2. 10-02-MainFunction.c (10-01からの差分)
  3. 10-02-ReadModel.c (10-01からの差分)
  4. ic2_DefaultModel.txt (10-01と同じ)

演習

10-02-ex1: リンクトリスト(先頭挿入)
ic2_InsertPATCH()関数の(5)のプログラムソースについて、各変数とアドレスとの関係を図で示しながら、当該部分が新しいパッチをリストの先頭に挿入できることを説明しなさい。

10-02-ex2: リンクトリスト(末尾挿入)
ic2_InsertPATCH()関数の(5)のプログラムソースについて、新しいパッチがリンクトリストの最後尾に挿入されるように改造しなさい。

10-02-ex3: コスト比較
10-02-ex1 と 10-02-ex2 の2つのアルゴリズムは、計算コストとしてどちらが少ないか理由を挙げて説明しなさい。また、その計算コストの差は本節のプログラム記述において考慮すべき価値があるかどうかについても考察しなさい。

10-02-ex4: ソースコード確認
上記ファイル内の構文の制約[1] - [5]がプログラムソースでどのように実現されているか、それぞれ当該部分を示しながら説明しなさい。

10-02-ex5: エラートラップ
10-02-ReadModel.c 内で記述されている各関数について、エラートラップの内容とその対策がどのように行われているかについて、全て書き出しなさい。

10-02-ex6: エラー時の続行
モデルファイルが途中で壊れていても、途中までは読み込んで実行を続けるよう 10-02-ReadModel.c を改良しなさい。改良方法についてはソース内のコメントで解説すること。

10-02-ex7: 法線ベクトル
三角形ポリゴンごとに、単位法線ベクトルを求める式を書きなさい。式表現には上で導入したデータフォーマットに出てくる記号を用いること。
(ベクトルの外積を使って立式するのが一般的でしょう)


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