計算機序論2【課題C】幾何変換

計算機序論2(2007) 2007/11/12a
2007/10/16a: 〆切日および論述課題は授業進行に合わせて調整するため暫定
2007/10/22b: 公開(〆切日は未設定)
2007/10/29a: 誤植訂正:(-1/2,-1.732/2) ⇒ (-1/2,0,-1.732/2) 2007/10/22b: 〆切日設定

課題C

〆切日2007/11/19, 13:45(JST)
提出先WebCT
提出内容下記のC-1〜C-5の全課題(余裕のある者はC-11に挑戦してもよい)

-----------
課題C-1(必修)

目標:幾何変換(移動・回転)に該当するプログラムの空白部分を埋めて、実行できる形にせよ。

【課題用ファイル資料】のうち、 st_animator-geom.c, st_animator-drawcore.c について、 "[課題C-geom]"となっている部分が書き換えを必要とする部分である。

なお書き換え時に回転軸に対する正方向には注意を払うこと。

上記2ファイルを改良したあと、他のオブジェクトファイルと組み合わせて実行ファイルを生成する。
fl_animator-global.o
07animator-047-div-data.o (以前改良済み)
07animator-047-div-script.o (以前改良済み)
fl_animator-geomextra.o
st_animator-geom.o (今回の課題C-1で書き換え)
fl_animator-drawprimitive.o
fl_animator-drawextra.o
st_animator-drawcore.o (今回の課題C-1で書き換え)
fl_animator-callback.o (前回の課題B-23で書き換えに成功した人は改良済みの st_animator-callback.o でもよい)
fl_animator-initgl.o
fl_animator-main.o (前回の課題B-23で書き換えに成功した人は改良済みの st_animator-main.o でもよい)

[コンパイル例]
$ gcc -Wall -c st_animator-geom.c
$ gcc -Wall -c st_animator-drawcore.c
$ gcc -o 07animator-runC1 fl_animator-global.o 07animator-047-div-data.o 07animator-047-div-script.o fl_animator-geomextra.o st_animator-geom.o fl_animator-drawprimitive.o fl_animator-drawextra.o st_animator-drawcore.o fl_animator-callback.o fl_animator-initgl.o fl_animator-main.o -L/usr/X11R6/lib -lX11 -lXmu -lXi -lGL -lGLU -lglut -lm (課題B-23を行ってない場合)
$ gcc -o 07animator-runC1 fl_animator-global.o 07animator-047-div-data.o 07animator-047-div-script.o fl_animator-geomextra.o st_animator-geom.o fl_animator-drawprimitive.o fl_animator-drawextra.o st_animator-drawcore.o st_animator-callback.o fl_animator-initgl.o st_animator-main.o -L/usr/X11R6/lib -lX11 -lXmu -lXi -lGL -lGLU -lglut -lm (課題B-23を行っていた場合)

提出物:
提出先ファイル名注意点
C-1-1st_animator-geom.c C-1の変更を行ったもの
C-1-2st_animator-drawcore.c C-1の変更を行ったもの
C-1-307animator-runC1 生成した実行バイナリファイル

-----------
課題C-2(必修)

目標:行列演算による座標系変換を理解する。

<説明1>
物体に固有の物体座標系で 点A_obj (1,0,0)から点B_obj (2,0,0)へ向かう方向ベクトルV_objを考える。 この物体(の座標系)を世界座標系の原点にセットしたあと、 X軸に沿って4進め、 そのあと物体をその場で(物体座標系の)Y軸周りに45度回転させ、 さらにそこから(物体座標系の)X軸に沿って2進めたとする。

小問α
移動手順に合わせて3つの行列を用意し、物体座標系上の点P_objから 世界座標系上の表現P_worldを求める式を行列の積の形で示せ。導出過程も示すこと。
ただし、P_obj = (x,y,z,1)^tの斉次表現を用いること。

小問β
V_objは世界座標系でどのように表されるか?同様に導出過程と結果の式を示せ。

<説明2>
カメラを世界座標系中の点S_obj (3,0,3)に設定し、その方向ベクトルを(-1/2,0,-1.732/2)とする。

小問γ
世界座標系上の点P_worldをカメラ座標系での表現P_camに変換する式を求めよ。導出過程も示せ。
ただし、(0,0,-1)を(-1/2,0,-1.732/2)に回転する行列をR?(角度)の形で示せ(?は回転軸名)。

小問δ

説明1のように移動した物体を、説明2のように設置したカメラで撮影するという計算を行うためには、最終的に物体座標系の点P_objをカメラ座標系で表現しなくてはいけない。このときの座標をP_camとする。
P_objからP_camへの変換式を求めよ。導出過程も示せ。

提出物:
提出先ファイル名注意点
C-2-1report-c-2-1.pdf小問αから小問δまで全て回答すること。

-----------
課題C-3(必修)

目標:行列演算によるアニメーションを理解する。

スクリプトで指定するA/C行から得られる幾何変換は、あくまで「物体座標⇒世界座標」である。
一方描画(投影)の計算は「カメラ座標系」で説明される。
ではアニメーションの蓄積(継続)はどのように表現されるか。
行列式の積を用いて説明せよ。

提出物:
提出先ファイル名注意点
C-3-1report-c-3-1.pdfスクリプトでA行が来た場合、A行のあとにC行が来た場合、C行のあとにC行が来た場合のそれぞれについて説明すること。

-----------
課題C-4(必修)

目標:描画部分のプログラム構成を把握する。

st_animator-geom.c, st_animator-drawprimitive.c, st_animator-drawcore.c の 各関数について説明をし、呼び出し関係を整理して図示せよ。

提出物:
提出先ファイル名注意点
C-4-1report-c-4-1.pdf図の作成については、(講義資料2007-IC2_Lec04k-printable.pdf)の7枚目中段右のスライドのように構成すること(複数枚に分けてよい)。

-----------
課題C-5(必修)

目標:行列演算の実際

ic2_multmatmat()の仕組みを説明しなさい。
特に、行列の要素の並びと、乗算時の要素がどのように参照されているかを説明すること。
また、本関数の利用において、ic2_multmatmat(b, a, b)のような呼び出しが可能である理由も説明しなさい。

提出物:
提出先ファイル名注意点
C-5-1report-c-5-1.pdfプログラムコードと合わせて説明すること。

===========
課題C-11(発展)

目標:幾何変換(lookat)に該当するプログラムの空白部分を埋めて、実行できる形にせよ。

【課題用ファイル資料】のうち、 st_animator-drawcore.c について、課題C-1に加えて、今回は "[課題C-ex-lookat]"となっている部分が書き換えを必要とする部分である。

st_animator-drawcore.c を改良したあと、他のオブジェクトファイルと組み合わせて実行ファイルを生成する。手順は課題C-1と同じであることに注意。

提出物:
提出先ファイル名注意点
C-11-1st_animator-drawcore.c C-11の変更を行ったもの
C-11-207animator-runC11 生成した実行バイナリファイル


kameda[at]iit.tsukuba.ac.jp