x軸、y軸方向の単位ベクトルをそれぞれ −→ ┌ ┐ −→ ┌ ┐ e1=│1│, e2=│0│ │0│ │1│ └ ┘ └ ┘ とします。この単位ベクトルを原点の回りにθだけ回転すると −→ ┌ ┐ −→ ┌ ┐ e1’=│cosθ│, e2’=│−sinθ│ │sinθ│ │ cosθ│ └ ┘ └ ┘ となります。2次元座標上の点P (x, y) は −→ −→ −→ OP=x・e1+y・e2 と表せますが、点 P を原点の回りにθだけ回転した点を P' とすると −→ −→ −→ OP’=x・e1’+y・e2’ ┌ ┐ ┌ ┐ =x│cosθ│+y│−sinθ│ │sinθ│ │ cosθ│ └ ┘ └ ┘ ┌ ┐ =│x・cosθ−y・sinθ│ │x・sinθ+y・cosθ│ └ ┘ ┌ ┐┌ ┐ =│cosθ −sinθ││x│ │sinθ cosθ││y│ └ ┘└ ┘ ┌ ┐ =│cosθ −sinθ│−→ │sinθ cosθ│OP └ ┘ となります。
3次元座標上の点を原点の回りに回転させるには、x,y,z各軸回りの 回転を組み合わせます。
世界座標系から視野座標系に変換するには以下の操作を行ないます。
┌ ┐ ┌ ┐┌ ┐ │x’│ │ 1 0 0 −ex││x│ │y’│=│ 0 1 0 −ey││y│ │z’│ │ 0 0 1 −ez││z│ │1 │ │ 0 0 0 1││1│ └ ┘ └ ┘└ ┘この平行移動によって視線ベクトルの始点は原点となります。
┌ ┐ ┌ ┐┌ ┐ │x1│ │ cosθ −sinθ 0││x’│ │y1│=│ sinθ cosθ 0││y’│ │z1│ │ 0 0 1││z’│ └ ┘ └ ┘└ ┘ cos θ = y / (x^2 + y^2)^{1/2} sin θ = x / (x^2 + y^2)^{1/2}
┌ ┐ ┌ ┐┌ ┐ │x2│=│ 1 0 0││x1│ │y2│ │ 0 cosψ sinψ││y1│ │z2│ │ 0 −sinψ cosψ││z1│ └ ┘ └ ┘└ ┘ cos ψ = -z / (x^2 + y^2 + z^2)^{1/2} sin ψ = (x^2 + y^2)^{1/2} / (x^2 + y^2 + z^2)^{1/2}
┌ ┐ ┌ ┐┌ ┐ │x3│=│ 1 0 0 ││x2│ │y3│ │ 0 1 0 ││y2│ │z3│ │ 0 0 −1 ││z2│ └ ┘ └ ┘└ ┘
┌ ┐ ┌ ┐┌ ┐ │x4│=D/z3│ 1 0 0 ││x3│ │y4│ │ 0 1 0 ││y3│ │z4│ │ 0 0 1 ││z3│ └ ┘ └ ┘└ ┘z座標に関しては
vec.h |
|
vec.c |
|
x24.c |
|
コンパイル方法 |
|
最近の家庭用ゲーム機では、世界座標系を視野座標系へ変換する計算を ハードウェアで実行しているので、高速な3次元表示が可能となっています。 また、レンダリング(3次元の面を塗って2次元の画像を作成する) もハードウェアで行うものもあり、それらの機械では非常に高速な 3次元表示が可能です。
クリッピング (clipping) とはスクリーンからはみだす部分を「切り取る」 ことです。
ワイヤフレームにおいては、視野座標系に変換したあとで、 視野角にしたがって、スクリーンの4辺と視点を含む平面に 関するクリッピングを行います。 場合によっては、視点からあまりに遠い物体やあまりに近い 物体を排除するために、前後に2つの平面をおいてクリッピング することもあります。
x24では、線分の端点が視点よりも後方にきたときに 表示がおかしくなっていました。 視点よりも後方の点は表示しないように変更することによって 改善できます。これもクリッピングで実現できます。 表示枠をウィンドウの2/3 に設定してクリッピングする例 を以下に示します。
clip.c |
|
diff -c x24.c x24a.c |
|
コンパイル方法
上記の例 vec.c ではいくつかの関数定義が省略されています。 省略された関数を記述し、x24 を動作させて下さい。
ただし、 void getmatrix(double m[NMAT][NMAT],Vector *v) の定義は、「視線ベクトル v を -z軸に一致させてから z軸を反転させる」4x4行列を求める関数です。
x24.c と vec.c, vec.h は http://nw.tsuda.ac.jp/admin1/c13.html からダウンロードできます。
x24a.c の内容を理解し、実際に動作させてみましょう。
x24a.c と clip.c は http://nw.tsuda.ac.jp/admin1/c13.html からダウンロードできます。
上記の Email アドレス宛に送ったメイルは http://nw.tsuda.ac.jp/cgi-bin/cgiwrap/p2r14/mailhead でヘッダ部が参照できますので、Emailを送ったあとで、 正しく提出されたかどうか必ず確認しておいて下さい。
オプション課題2ができた人は、Subject: Option 2 として課題1と 同じアドレス宛に送って下さい。
提出期限は来週木曜日の 8:50a.m. です。