リンク
・OpenGL(ver.2.1)の各関数(小文字のglの2文字で始まる関数)の説明
・OpenGLのProgramming Guide Book (ver1.1, 通称赤本)
8.1 OpenGLにおける直交投影の明示的指定
これまでの(6節,7節までの)プログラムでは、結果的に投影方法として直交投影の形になっていました。
しかし、これは正式なOpenGLの投影(空間の撮像面への射影)ではありませんでした。
本節からは、OpenGLによる直交投影の指定を明示的にプログラム上で行うようにします。
glOrtho()関数を用いて、PROJECTION行列スタックトップに直交投影を実現する4x4の行列を設定します。
OpenGLによる投影指定の特徴として、クリッピング空間(撮影面に描画する空間の範囲)を指定することが挙げられます。
【定式化】
pcamp = Portho M Plocal
pcamp = Portho Pcamera
ここで Portho は直交投影を実現する4x4の行列。
pcamp は撮像面(camera plane)中の座標を表現する実質2次元の位置ベクトル。
ただし、斉次表現を用いているので、実際には3次元ベクトルで表現する。
ic2_showMATRIX()という関数で、その時点のMODELVIEW行列スタックトップと、PROJECTIOn行列スタックトップとの状態を表示できます。
ここで注意するべきなのは3行3列目の要素が-1になっていることです。
これによって、以後の説明では、3次元世界はすべて右手系になり、カメラ方向は(0,0,-1)になります。
OpenGLの直交投影に関しては、クリッピング近接面をz=-1, 遠方面z=1とし、左右と上下を-1.0から1.0までの範囲とすると、
glOrtho(-1, 1, -1, 1, -1, 1)
となります。
(厳密にはカメラの位置は(0,0,0)なので、クリッピング空間を-1.0〜1.0にするとカメラがその中に存在することになって、気分的にはすっきりしません。)
(とはいえ、クリッピング面のZ値に負の値を入れることはOpenGLライブラリ上では認められている行為です。)
右手系になることの余波として、カメラから見て遠いほうがZ値がマイナスの大きな値のほうに相当するようになることと、回転における回転方向の正負反転が挙げられます。
【余談】この投影の時点で強引に3次元世界を左手系に戻すことも可能です。
ただし、この場合は、望むPROJECTION行列を(OpenGLライブラリの関数によって用意させるのではなく)自分で計算する用意する必要があります。
右手系を左手系にする単純な実現方式として、どのような方法が考えられるでしょうか?
8.2 ウィンドウサイズ変更による影響の無効化
これまでは、OpenGLのウィンドウは正方形の形で表示されていました。
また、それをサイズ変更すると、自由に引き伸ばしたりすることができました。
これはこれで便利ですが,正確なCG描画を考える上では理解の妨げになりかねません。
そこで、ここから、ウィンドウサイズ変更を無効化できるようにプログラムを書き換えていきます。
glutReshapeFunc()を使ってウィンドウサイズ変更を検知します。
また、ここからは、callbackによる割り込み作業をしたあと、本体glutMainLoop()に戻ってからすぐに再描画をしてもらえるよう、glutPostDisplay()という関数を使って旗を立てておきます。
8.3 真ん中に来てほしい‥
先の108-2-Viewpoint.cは、glutReshapeFunc()で明示的に作業を指示するようにすることで、これまでglutライブラリが勝手にやってくれていたサイズ変更にともなう引き延ばし等をさせなくするだけでした。
openGLでの最終描画(2次元が像を作る作業)では、左下が原点になります。そのために、左下に張り付いた状態になってしまいました。
いまいちなので、これを中央に設定します。
ここでは、投影行列をレンダリング開始時に正しく設定するようにします。
これに伴って、今後はカメラのセットアップを毎フレーム行うようにします。
108-3-ViewpointCentering.c
108-2からの差分
9.1 モデルファイルのデータフォーマット
1行あたり(1ポリゴンあたり)のフォーマット
X0 Y0 Z0 X1 Y1 Z1 X2 Y2 Z2 R G B |
ここでまず用意するモデルとしては、いままでのTeapotが概ね+/- 1.0ぐらいの大きさだったので、それぐらいの大きさのものにしておきましょう。
こちらのモデルリストに皆さんのモデル(課題3A-1)を掲載しました。
9.2 指定ファイルのオープン
まずはファイルを読み込むプログラムを作らないと話になりません。
2.2節のプログラムをベースにします。
後で8節のプログラムに取り込むので、ファイルを読み込む部分は関数化しておく必要があります。
9.3 行毎の読み込み
モデルファイルは、1行ずつに構造が沸かれているので、読み込みも1行ずつ行います。
このために、fgets()関数を用います。
また、各行が有効なモデル行かどうかの確認もします。
9.4 モデルの読み込み
ic2PATCH構造体のlinked listにモデルデータを構築します。
ic2PATCH構造体のlinked listはfirstmodelptrで示されるアドレスから開始されます。
ic2PATCH構造体にはic2POINT構造体3つとic2COLOR構造体1つが含まれます。
いよいよ(やっと)モデルを読み込んで表示までをしてみましょう。
(本当はこの前にソース分割をしておきたかったのですが、ソース表示の都合等で単一ファイルのままです‥)
(あまり普通の人に推奨するコードの書き方ではありません‥)
10.1 ファイルの統合
108-3-ViewpointCentering.cと
109-4-ReadModel.cとをベースにします。
後者のほうから、関数部分を全て前者に移植します。
110-1-MergedSource.c
109-4からの差分
10.2 既定義物体のOn/Off
移植には成功しましたか?
でも何も変わりませんね?
もしかしたらもとから描いているTeapotが邪魔をしているのかもしれません。
この際なので、表示したり非表示にしたりできるようにしましょう。
110-2-MergedSource.c
110-1からの差分
10.3 モデルの読み込みと表示
考えてみれば、読み込んだ表示をするようなプログラミングをまだしてないので、Teapotを消したところで意味ないですね(気づいてた?)。
読み込んだ物体モデルをとにもかくにも表示させるようにしましょう。
10.4 法線ベクトルの付与
実は法線ベクトルを正しく与えないと、CGは正確に表示されません。
単純な図形ならともかく、大きくなるとこれは致命傷になります。
発展課題かな‥
モデルリスト
こちらに皆さんのモデル(課題3A-1)も掲載しました。
課題はいずれも2011/11/21,13:30 (JST)提出締切である。
残念ながら今年度受講生は例年に比べて課題提出の遅延者が多い。
・ 締切前提出のエントリも公式締切時刻後もトラブル対策の為に暫時開けておく。
・ TAの作業量軽減を図るため、moodle上に遅延提出用エントリを設ける。
・ この遅刻提出用エントリは遅延を許容するものではない(減点方法は例年通り実施)。
・ 締切前エントリ、遅刻提出用エントリに同時に出した場合は遅刻扱いで大幅減点になるので不用意に遅刻提出エントリに提出しないこと。
・ 遅刻提出用のエントリは、最後に提出した時間と内容のみが有効になる。時間が経てばそれだけ減点が大きくなるので、不用意に何度も提出しないこと。
・ 遅刻提出用のエントリもある程度経った時点で閉鎖する。以降は公式問い合わせメールアドレスに添付の形で送ること。
109-4-ReadModel.cを、2つの点について改良せよ。
[1] 130行目の「//他のエラートラップ」と書いてある部分のif文を書き直し、空行、#で始まる行以外でもパッチ情報が含まれているとはみなせない行をスキップできるようにプログラムを改良する。このとき、スキップする理由を標準出力に表示すること。
[2] 87行目のfirstpatchptrから始まるlinked listへ、新しい newpatch を追加するときに、現在の様にfirstpatchptrに一番近いところに挿入するのではなく、firstpatchptrから辿る順と読み込みの順が一致するようにプログラムを変更すること。
提出物
もとのプログラム109-4-ReadModel.cと4A-1[2]によるその改良の両方について、linked listへある1つのic2_PATCH構造体が追加されるアルゴリズムを、ソースプログラムの抜粋とデータ構造の概念図の両方を用いて説明せよ。
提出物
109-4-ReadModel.cのic2_PrintPATCHList()関数において、各パッチのデータ内容を表示するのに合わせて、各パッチの法線ベクトルを計算して表示するようにプログラムを改良せよ。
法線ベクトルは大きさ1.0になるよう正規化されていること。
法線ベクトルの表示は小数点以下第三位まで示すこと。
法線ベクトルが計算できない場合(パッチをなす三角形の面積が0の場合)にはエラーハンドリングしてプログラムが停止しないように注意すること。
法線プログラムの計算を外部関数化してあればなおよい。
本課題の解答に近いコードが5週目の講義に合わせて公開されるので、遅刻提出の場合は点数はほぼないことに注意。
提出物