210 likes | 398 Views
カメラ座標に関する操作. 牧之内研究室4年 増尾 源哉 2002年7月19日. 参考文献: ・ DirectX SDK ヘルプ ・「3次元コンピュータグラフィックス」 昭晃堂 中前栄八労・西田友是 共著. Hawk's Eye Web ページ http://www.db.is.kyushu-u.ac.jp/hawks_publications/. カメラ座標. y. z. x. ワールド座標. y ’. x ’. z ’. カメラ座標とは?. カメラ座標とは、ワールド座標に対し、「視点」を置く位置を原点とした座標である。
E N D
カメラ座標に関する操作 牧之内研究室4年 増尾 源哉 2002年7月19日 参考文献: ・DirectX SDK ヘルプ ・「3次元コンピュータグラフィックス」 昭晃堂 中前栄八労・西田友是 共著 Hawk's Eye Web ページ http://www.db.is.kyushu-u.ac.jp/hawks_publications/
カメラ座標 y z x ワールド座標 y’ x’ z’ カメラ座標とは? • カメラ座標とは、ワールド座標に対し、「視点」を置く位置を原点とした座標である。 • また、そのとき、視線はz’軸の方向となる。そして、z’の方向を向いたときにカメラ座標での「上側」はy’軸の方向となり、「右側」はx’軸の方向となる。
注意点 • DirectXでは、左手系座標を利用しているので、ある軸に関する「回転」や「ベクトルの外積」は次のようになる。 A×B A B
DirectXでのカメラ座標の設定 • DirectXでカメラ座標を設定する際は、ビュー行列という4×4型の行列に値を設定すればよい。 • このビュー行列は、ワールド座標からカメラ座標に座標変換をする際に用いられる。 • ビュー行列に単位行列を与えると、カメラ座標はワールド座標と等しくなる。
カメラの操作 • カメラで必要な操作は次のようなものである。
y z x 1.視点切り替え • ワールド座標から右図のPにビュー座標を移す変換行列がMで与えられているとする。 • 現在のカメラ位置をC(c1, c2, c3)、移動する先のカメラ位置をC’(c1’, c2’, c3’)(どちらもワールド座標系での座標)とする。 (c1’-c1, c2’-c2, c3’-c3)だけ平行移動すればよい。この平行移動の行列は、 C(c1, c2, c3) C’(c1’, c2’, c3’) であり、ビュー行列として、 を設定すればよい。
2.ズーム(注視点に近づく、遠ざかる) • カメラ座標系では、カメラ位置Cは原点(0, 0, 0)、 注視点Pは(0, 0, s)(sは正)と表すことができる。 • このとき、カメラをPに近づいたり、遠ざかったりするには、z軸方向に平行移動をすればよい。よって、 平行移動 C C’ P で与えられる。よって、ビュー行列として、 を設定すればよい。 また、0<k<sのとき注視点に近づき、k<0のとき注視点から遠ざかる。
y C(c1, c2, c3) P(p1, p2, p3) z Q(q1, q2, q3) x 3.特定の注視点にカメラを向ける • 下の図のように、カメラの位置がC、注視点がPのとき、カメラを回転させて点Qを注視点とすることを考える。
y n C(c1, c2, c3) P(p1, p2, p3) θ z Q(q1, q2, q3) x • 三角形CPQの単位法線ベクトルをnとすると、 と表され、点PからQに注視点を移すには、このベクトルnを軸とし、nの周りにθ回転すればよい。 • よって、nのまわりの回転を表す行列を求めればよいことになる。
y C(c1, c2, c3) v = (v1, v2, v3) z P(p1, p2, p3) x ある平面に対する法線ベクトルを求める方法 • ワールド座標において、カメラの位置C(c1, c2, c3)(ワールド座標における座標)、 点P(p1, p2, p3)(ワールド座標における座標)、Pを始点とするベクトルv=(v1, v2, v3)の2点とベクトルが与えられたとする。これらが作る平面に対する法線を求めることを考える。 ワールド座標
ある平面に対する法線ベクトルを求める方法 y C(c1, c2, c3) n=(n1, n2, n3) v = (v1, v2, v3) z P(p1, p2, p3) x • 2点C, Pとベクトルvが作る平面に対する法線は、C, P, vが作る3角形の法線のことである。 • ここで、ベクトルCPを考えると、この三角形の法線は、ベクトルCPとベクトルvの外積であることから、法線ベクトルは、次のように与えらる。 ゆえに、
単位ベクトルnの周りの回転を表す行列 • n=(u, v, w)を単位ベクトルとする。座標をnの周りにθ回転させる変換行列は、 で与えられる。よって、ビュー行列に、 を設定すればよい。
単位ベクトルnの周りの回転を表す行列(補足)単位ベクトルnの周りの回転を表す行列(補足) • 前述の単位ベクトルがx軸方向、y軸方向、z軸方向であった場合の行列はそれぞれ以下のとおりである • 単位ベクトルがx軸方向 • 単位ベクトルがy軸方向 • 単位ベクトルがz軸方向
4.注視点を固定したカメラ位置の回転 • 注視点を固定し、現在の視点Cを始点とするベクトルvの方向にθ回転するための変換を考える。 y P(p1, p2, p3) C(c1, c2, c3) θ v=(v1, v2, v3) z C’(c1’, c2’, c3’) x
P(p1, p2, p3) |C P| |C P| θ y z C(c1, c2, c3) x C’(c1’, c2’, c3’) x軸、y軸方向へのカメラ位置の回転 • まず、簡単のため、vをカメラ座標系でのx軸方向、y軸方向として考える。(カメラ座標系でのz軸は視点の方向なので、z軸の方向に回転する、ということは考えなくてよい) • x軸方向にθ回転することを考える。 • まず回転後の座標C’に平行移動 • 向きをPに向ける(これは3で行った変換) Cを原点とするカメラ座標から見たC’の座標は、 となり、「1.平行移動」で説明した行列をM’とする。
P(p1, p2, p3) y θ z C’(c1’, c2’, c3’) x P(p1, p2, p3) • 平行移動後、C’を原点とする座標系を考え、y軸の周りに-θ回転すれば注視点はPを向く。 • この回転は「3.特定の注視点にカメラを向ける」での説明のうち、単位ベクトルnをy軸方向の単位ベクトル(0, 1, 0)とし、-θ回転するような行列を与えればよい。 この行列をM’’とする。 • 変換前の座標系Cにカメラを移す行列がMで与えられているとすると、 ビュー行列に を設定すればよい。 |C P| |C P| θ y z y z C(c1, c2, c3) x 平行移動 x C’(c1’, c2’, c3’) θ
同様に、y軸方向にθ回転する場合の行列も求めることが出来る。同様に、y軸方向にθ回転する場合の行列も求めることが出来る。 • Cを原点とするカメラ座標から見たC’の座標は、 となり、この平行移動の行列をM’とする。 • 次に、C’を原点とした座標系で回転では、単位ベクトルnをx軸方向の単位ベクトル(1, 0, 0)とし、その周りをθ回転を考えればよい。 この回転の行列をM’’とする。 • 変換前の座標系Cにカメラを移す行列がMで与えられているとすると、 ビュー行列に を設定すればよい
P(p1, p2, p3) P C’(c1’, c2’, c3’) |C P| C’ P |C P| θ |C P| C’ θ y θ z C v C x v v C(c1, c2, c3) 任意の方向へのカメラ位置の回転 • 任意のベクトルv(vはxy平面上のベクトル)の方向にθ回転することを考える。 • まず、x座標とベクトルvの向きが等しくなるようにz軸のまわりに座標系を回転させる。その角度は • 次に、x軸方向にθ回転させればよい x軸方向とvの方向を 等しくする x軸方向に回転
x軸をベクトルvの方向と等しくするためにz軸の周りに座標系を回転させるための行列は、「単位ベクトルnの周りの回転を表す行列(補足)」の中で説明した「単位ベクトルをz軸方向」とした場合の行列である。x軸をベクトルvの方向と等しくするためにz軸の周りに座標系を回転させるための行列は、「単位ベクトルnの周りの回転を表す行列(補足)」の中で説明した「単位ベクトルをz軸方向」とした場合の行列である。 (回転角は である。) この行列をM’とする。 • 次にx軸方向に回転させるための行列は、「x軸、y軸方向へのカメラ位置の回転」の中で説明した「x軸方向への回転」とした場合の行列である。 (回転角はθである。) この行列をM’’とする。 • 変換前の座標系Cにカメラを移す行列がMで与えられているとすると、 ビュー行列に を設定すればよい。