コンピューターグラフィックスS 第7回 座標変換 システム創成情報工学科 尾下 真樹 連絡 • 来週休講 今回の内容 • 座標変換 – コンピュータグラフィックスで最も重要な基礎技 術のひとつ 座標変換(復習) 各ポリゴンごとに処理 各頂点ごとに処理 x y z x y z 座標変換 描画 ラスタライズ 頂点座標 スクリーン座標 (法線・色・テクスチャ座標) y y z y x z x z x 教科書 基礎知識 図2-21 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 座標変換 • 座標変換 – ワールド座標で表された頂点座標を、スクリーン へ座標系での頂点座標に変換する y z y x y z z x ワールド座標系 カメラ座標系 x スクリーン座標系 座標変換(続き) • 2種類の座標変換の組み合わせにより実現 – ワールド座標からカメラ座標系へのアフィン変換 – カメラ座標系からスクリーン座標系への透視変換 • 行列計算によってこれらの変換を実現する y z y x y z z x ワールド座標系 カメラ座標系 x スクリーン座標系 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 ワールド座標系 • 3次元空間の座標系 – 物体や光源やカメラなどを配置する座標系 – 原点や軸方向は適当にとって構わない • カメラと描画対象の相対位置・向きのみが重要 – 単位も統一さえされていれば自由に設定して構 わない(メートル、センチ、etc) y z x ワールド座標系 右手座標系と左手座標系 • 右手座標系と左手座標系 – 親指をX軸、人差し指をY軸、中指をZ軸とすると • 右手の指で表されるのが右手系 (OpenGLなど) • 左手の指で表されるのが左手系 (DirectXなど) y y x z x 右手座標系 z 左手座標系 右手座標系と左手座標系(続き) • 右手座標系と左手座標系の違い – 基本的にはほとんど同じ – 外積の定義が異なる • 外積の計算式は、右手座標系で定義されたもの • 左手座標系で外積を計算するときには、符号を反転 する必要がある – 剛体の運動計算や電磁気などの物理計算では重要になる (この講義では扱わない) – 異なる座標系で定義されたモデルデータを利用 する時には、変換が必要 • 左右反転、面の方向を反転 カメラ座標系 • カメラを中心とする座標系 – X軸・Y軸がスクリーンのX軸・Y軸に相当 – 奥行きがZ軸に相当 y y x z z カメラ座標系 x スクリーン座標系 • スクリーン上の座標 – 射影変換(透視変換)を適用した後の座標 • 奥にあるものほど中央に描画されるように座標計算 – スクリーン座標も奥行き値(Z座標)も持つことに 注意 → Zバッファ法で使用 y y x z カメラ座標系 z y x スクリーン座標系 z x 右手座標系と左手座標系 • カメラ座標系・スクリーン座標系も、軸の取り 方によって、座標系は異なる – 手前がZ軸の正方向(OpenGL) – 奥がZ軸の正方向(DirectX) • こちらも基本的にはどちらでも構わない y y z x x z 手前がZ軸の正方向 奥がZ軸の正方向 モデル座標系 • 物体のローカル座標 – ポリゴンモデルの頂点はモデル内部の原点を 基準とするモデル座標系で定義される – 正面方向をZ軸にとる場合が多い – ワールド座標系にモデルを配置 y y y z x x z z モデル座標系 x ワールド座標系 座標変換の流れ • モデル座標系からスクリーン座標系に変換 y y z モデル座標系 ワールド座標系 x z x y y x スクリーン 座標系 カメラ座標系 z x z 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 アフィン変換 • アフィン変換(同次座標系変換) – 4×4行列の演算によって、3次元空間における 回転・平行移動・拡大縮小などの処理を計算 – 同次座標系 • (x, y, z, w)の4次元座標値によって扱う • 3次元座標値は(x/w, y/w, z/w)で計算(通常は w = 1) R00 S x R10 R20 0 R01 R11S y R21 0 R02 R12 R22 S z 0 Tx x x Ty y y Tz z z 1 w w ' 回転変換 • 回転変換 – 原点を中心とする回転を表す R00 R10 R 20 0 R01 R11 R21 0 R02 R12 R22 0 0 x R00 x R01 y R02 z x 0 y R10 x R11 y R12 z y 0 z R20 x R21 y R22 z z 1 1 1 1 回転変換の例 • Y軸を中心として 90度回転 (-5,6,3) (-3,6,3) (3,6,3) y (3,6,5) (3,2,3) (-5,2,3) (-3,2,3) x (3,2,5) z cos 0 sin 0 0 sin 1 0 0 cos 0 0 0 x 0 0 y 0 0 z 1 1 1 0 0 1 0 0 1 0 0 0 0 x z x 0 y y y 0 z x z 1 1 1 1 回転変換の行列 • 回転変換の行列の導出方法 – 各軸を中心として右ねじの方向の回転(軸の元 から見て反時計回り方向の回転)を通常使用 – yz平面、xz平面、 xy平面での回転を考えれば、 2次元平面での回転変換と同様に求められる • 2次元平面での回転行列は、高校の数学の内容 0 1 0 cos 0 sin 0 0 0 sin cos 0 0 0 0 1 X軸を中心とする回転変換 cos 0 sin 0 0 sin 1 0 0 cos 0 0 0 0 0 1 Y軸を中心とする回転変換 cos sin 0 0 sin cos 0 0 0 0 1 0 0 0 0 1 Z軸を中心とする回転変換 回転変換の行列(続き) • 回転変換の行列の導出方法の例 – 例えば、y軸周りの回転行列は、xz平面での回 転を考えれば、導出できる Z 変換前のX軸・Z軸方向の 単位ベクトルの写像 Z’ Y軸を中心とする回転変換 cos 0 sin 0 0 sin 1 0 0 cos 0 0 X’ 0 0 0 1 θ Y -sinθ X cosθ cos 0 sin 0 0 sin 1 0 0 cos 0 0 0 1 cos 0 0 0 0 0 sin 1 1 1 cos 0 sin 0 0 sin 1 0 0 cos 0 0 0 0 sin 0 0 0 0 1 cos 1 1 1 平行移動 • 平行移動 – (Tx,Ty,Tz)の平行移動 • 4×4行列を用いることで、平行移動を適用することが できる 1 0 0 0 0 1 0 0 0 Tx x x Tx x 0 Ty y y Ty y 1 Tz z z Tz z 0 1 1 1 1 平行移動の例 • (8,-2,0)平行移動 (-5,6,3) (-5,2,3) (-3,6,3) (3,4,3) y x (-3,2,3) (3,0,3) z 1 0 0 0 (5,4,3) 0 1 0 0 0 8 x x 8 x 0 2 y y 2 y 1 0 z z z 0 1 1 1 1 (5,0,3) 拡大縮小 • 拡大縮小 – (Sx,Sy,Sz)倍のスケーリング Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 S x x x 0 S y y y 0 Sz z z 1 1 1 拡大縮小の例 • (2, 0.5, 1)倍に拡大縮小 (-5,6,3) (-5,2,3) (-3,6,3) y (-10,3,3) (-6,3,3) x (-3,2,3) (-10,1,3) (-6,1,3) z 2 0 0 0 x 2 x x 0 0.5 0 0 y 0.5 y y 0 0 1 0 z z z 1 1 1 0 0 0 1 行列演算の適用 • 1つの行列演算で各種の変換を適用可能 • 行列を次々にかけていくことで、変換を適用 することができる – 回転・移動の組み合わせの例 回転 y 平行移動 y y x x z x z cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 z 1 0 0 0 0 1 0 0 0 0 1 0 5 0 0 1 行列演算の適用 • 回転・移動の組み合わせの例 回転 y 平行移動 y y x z x x z 平行移動 1 0 0 0 0 0 0 cos 90 1 0 0 0 0 1 5 sin 90 0 0 1 0 z 回転 0 sin 90 1 0 0 cos 90 0 0 0 x x 0 y y z 0 z 1 1 1 先に適用する方が右側になることに注意! 行列計算の適用順序 • 行列演算では可換則は成り立たないことに 注意! AB BA • 行列の適用順序によって結果が異なる – 例: • 回転 → 平行移動 • 平行移動 → 回転 行列演算の適用 • 移動→回転の順番で適用したときの例 平行移動 y x z 回転 y x z y x z 平行移動は回転変換適用 前の座標系の向きで適用 されることに注意! y 回転 cos 90 0 sin 90 0 1 0 sin 90 0 cos 90 0 0 0 x z 平行移動 0 1 0 0 0 x x 0 0 1 0 0 y y z 0 0 0 1 5 z 0 0 0 1 1 1 1 行列演算の適用 • 移動→回転の順番で適用したときの例 平行移動 y x y x z x z 回転 cos 90 0 sin 90 0 回転 y 平行移動 0 sin 90 1 0 0 cos 90 0 z 0 01 00 00 10 0 0 0 x cos 90 1 0 0 y 0 0 1 5 z sin 90 0 0 1 0 1 0 sin 90 1 0 0 cos 90 0 0 5 x x 0 y y 0 z z 1 1 1 この場合は並行移動成分にも回転がかかる 行列演算の適用 • 回転→移動の順番で適用(さきほどの例) 回転 y x z 平行移動 y y x x z 平行移動 回転 0 sin 90 1 0 0 0 cos 90 0 1 0 0 0 1 0 0 0 1 5 sin 90 0 cos 90 0 0 0 0 0 0 1 z 0 x cos 90 0 y 0 0 z sin 90 1 1 0 0 sin 90 1 0 0 cos 90 0 0 0 x x 0 y y 5 z z 1 1 1 こちらの順番の方が普通に使う場合が多い アフィン変換の考え方 • アフィン変換の考え方 – ひとつの座標系内での回転・平行移動・拡大縮 小処理と考えることもできるし、 – ある座標系から別の座標系への座標系の変換 と考えることもできる • 逆行列を計算すれば、反対方向の変換も求 まる y y y A x x z A 1 z z x アフィン変換のメリット • 行列演算だけでさまざまな処理を行える – アフィン変換を使わずとも、回転・平行移動・拡 大縮小など各処理に応じて計算することは可能 • それぞれの処理だけをみればこの方が高速 – 各種処理を同じ方法で扱えることに意味がある • 複数の変換処理をまとめてひとつの行列に できる – 最初に一度全行列を計算してしまえば、後は各 頂点につき1回の行列演算だけで処理できる アフィン変換の表記方法 • 2通りの書き方がある – どちらの書き方で考えても良い – 使用するライブラリによって行列データの渡し方 が異なるので注意 R00 R10 R 20 0 R01 R11 R21 0 R02 R12 R22 0 Tx x x Ty y y Tz z z 1 1 1 左から行列を掛けていく表記(OpenGL) x y z 1 t R00 R01 R 02 T x R10 R11 R12 Ty R20 R21 R22 Tz 0 x 0 y 0 z 1 1 右から行列を掛けていく表記(DirectX) 2次元空間でのアフィン変換 • 2次元空間(平面)でも、同様にアフィン変換 は定義される – 3次元空間でのアフィン変換・・・4×4行列 – 2次元空間でのアフィン変換・・・3×3行列 • 2次元空間のアフィン変換については、参考 書を参照(講義では扱わない) 座標変換の例 • 下記のシーンにおける、モデル座標系からカ メラ座標系への変換行列を計算せよ – 物体の位置が (-10,0,4) にあり、ワールド座標 系と同じ向き – カメラの位置が (8,2,3) にあり、ワールド座標系 のY軸を中心として 90度回転している y y x z y (8,2,3) x (-10,0,4) x z z 座標変換の例 • 座標変換の考え方 – モデル座標系→ワールド座標系 への変換行列 – ワールド座標系→カメラ座標系 への変換行列 の2つの変換を求めて、順に適用することで、 モデル座標系→カメラ座標系 への変換を実現 • カメラやモデルの位置・向きは、ワールド座標系で表 されているため、全体を一度に求めることは難しい x x y y ? ? z z 1 1 ワールド → カメラ モデル → ワールド 座標変換の例 • モデル座標系 → ワールド座標系 1 0 0 0 0 1 0 0 0 10 0 0 1 4 0 1 平行移動のみ モデル座標系の原点 (0,0,0) は ワールド座標系の (-10,0,4) に 平行移動される y y x z y (8,2,3) x (-10,0,4) x z z 座標変換の例 • ワールド座標系 → カメラ座標系 cos 90 0 sin 90 0 1 0 0 8 0 1 0 0 0 1 0 2 sin 90 0 cos 90 0 0 0 1 3 0 0 0 1 0 0 0 1 カメラの座標系から見てワールド座標系は、 カメラの位置が(8,2,3)なので、 ワールド座標系のY軸を中心に -90 度回転 ワールド→カメラは(-8,-2,-3) 位置はワールド座標系で表されているので、先に平行移動を適用 y y x (8,2,3) x (-10,0,4) z x y z z 座標変換の例 • モデル座標系 → カメラ座標系 cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 01 00 0 0 0 1 ワールド → カメラ モデル → ワールド y y x z x y (8,2,3) x (-10,0,4) 0 0 10 x x 1 0 0 y y 0 1 4 z z 0 0 1 1 1 0 0 8 1 1 0 2 0 0 1 3 0 0 0 1 0 z z 座標変換の順序に注意 • 回転と平行移動を適用する順序に注意! カメラ 座標での 平行移動 ワールド →カメラ の回転 モデル→ ワールド の回転 ワールド 座標での 平行移動 y y x z y (8,2,3) x (-10,0,4) x モデル 座標での 平行移動 z z x x y y z z 1 1 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 透視変換 • スクリーン座標を計算 • 透視座標変換(射影変換) – 奥にあるものほど中央に描画されるように計算 y x 教科書 基礎知識 図2-28 z 透視変換 • 透視変換行列 left right top y 1 z 0 2n r l 0 0 0 0 2n t b 0 0 r l r l t b t b f n f n 1 x x 0 y y z z 2 fn w w' f n 0 x bottom 0 x / w ' y / w' z / w ' W’=-Z となり、Zで割ることになる (Z値が大きくなるほど中央になる) クリッピング • 視野内にないポリゴンは描画しない • 背面除去も適用 – カメラから後ろ向きのポリゴンは描画しない • 背面除去・クリッピング の両方を適用 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 座標変換の流れのまとめ • モデル座標系からスクリーン座標系に変換 y y z モデル座標系 ワールド座標系 x z x y y x スクリーン 座標系 カメラ座標系 z x z 変換行列による座標変換の実現 • アフィン変換+透視変換 – 最終的なスクリーン座標は x / w' y / w ' z / w ' モデル座標系での 頂点座標 2n r l 0 0 0 0 2n t b 0 0 r l r l t b t b f n f n 1 R00 S x 0 R10 R 2 fn 20 0 f n 0 透視変換 (カメラ→スクリーン) 0 R01 R11S y R21 R02 R12 R22 S z 0 0 アフィン変換 (モデル→カメラ) Tx x x Ty y y z Tz z 1 1 w ' カメラ座標系での 頂点座標 座標変換の設定 • 自分のプログラムから OpenGLやDirectXに、 2つの変換行列を設定する必要がある – ワールド座標からカメラ座標系へのアフィン変換 • カメラの位置・向きや、物体の位置向きに応じて、適切 なアフィン変換行列を設定する必要がある • さまざまな状況で、適切な変換行列を設定できるよう に、十分に理解しておく必要がある – カメラ座標系からスクリーン座標系への透視変換 • 透視変換行列は、通常、固定なので、最初に一度だ け設定する • 視野角やスクリーンサイズなどを適切に設定 座標変換 • 座標変換の概要 • 座標系 • アフィン変換 • 透視変換 • 座標変換のまとめ • 演習問題 演習問題1 • 下記のシーンにおける、モデル座標系からカ メラ座標系への変換行列を求めよ – ワールド座標系に対して、モデルが(12,0,2) の位 置にあり、Y軸を中心に -90度 回転している – ワールド座標系に対して、カメラが (-8,4,1) の位 置にあり、Y軸を中心に -90度 回転している y y (-8,4,1) x z x y z (12,0,2) z x 解答 • モデル座標系→ワールド座標系への変換 1 0 0 0 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 x x 0 y y z 0 z 1 1 1 ② ワールド座標系で ① 座標系の向きを回転 平行移動 (モデル座標系→ワールド座標系) y y x z (12,0,2) z x 解答 • ワールド座標系→カメラ座標系への変換 回転角度や 平行移動の 符号が逆になる ことに注意! cos 90 0 sin 90 0 0 sin 90 1 01 00 00 0 1 0 0 cos 90 0 0 8 x x 1 0 4 y y 0 1 1 z z 0 0 1 1 1 0 0 ② 座標系の向きを回転 ① ワールド座標系で (ワールド座標系→カメラ座標系) 平行移動 順番が逆になることに注意! y (-8,4,1) x z x 回転前の座標系(ワールド座標系)で 移動を行う必要があるため y z 解答 • モデル座標系→カメラ座標系への変換 cos 90 0 sin 90 0 0 sin 90 1 01 00 00 0 1 0 0 cos 90 0 0 8 1 1 0 4 0 0 1 1 0 0 0 1 0 0 0 ワールド座標系→カメラ座標系 y 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 1 0 0 cos 90 0 0 モデル座標系→ワールド座標系 y (-8,4,1) y x (12,0,2) z x 0 sin 90 z z x 0 0 0 1 解答(検算) • 検算 – 行列を実際に計算してみる cos 90 0 sin 90 0 1 0 0 0 0 1 0 0 0 sin 90 1 0 0 cos 90 0 0 0 1 0 4 1 20 0 1 01 00 00 0 1 8 1 1 0 4 0 0 1 1 0 0 0 1 0 0 0 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 この場合、モデル座標系とカメラ座標系の向きが同じなので、 結果的に単なる平行移動になっていることに注目 y y (-8,4,1) (12,0,2) z x z x 解答(検算) • 検算 テストの時は必ず検算をすること! – 適当な座標を実際に変換してみて、カメラ座標 系で見て適切な値になっているかを判定 (x,y,z) = (0,0,0) を入れると (x’,y’,z’) = (1,-4,-20) (x,y,z) = (1,0,2) を入れると (x’,y’,z’) = (2,-4,-18) 1 0 0 0 0 1 0 0 0 1 x x 0 4 y y z 1 20 z 0 1 1 1 y モデル座標系 (0,0,0) y (-8,4,1) (12,0,2) z x モデル座標系 (1,0,2) z x 解答(誤答1) • 変換行列の順序の間違い(間違いが多い例) cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 y 01 00 00 0 1 8 cos 90 1 0 4 0 0 1 1 sin 90 0 0 1 0 0 0 1 0 0 cos 90 0 0 01 00 00 0 1 0 0 12 1 0 0 0 1 2 0 0 1 平行移動の後に、ワールド座標系の 原点を中心に回転を適用 y (-8,4,1) 0 sin 90 x z y x z z x ワールド座標系の x 軸方向ではなく、 ワールド座標系内でのローカル座標 系の x 軸方向に平行移動している (-2,0,12) 解答(誤答2) • 平行移動をかける順番の違い cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 y y (-8,4,1) 01 00 00 0 1 8 cos 90 1 0 4 0 0 1 1 sin 90 0 0 1 0 0 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 0 1 0 0 12 1 0 0 0 1 2 0 0 1 回転後の座標系の軸方向の 回転前の座標系の軸方向の 平行移動になる 平行移動になる (この場合はワールド座標系) (この場合はモデル座標系) x z y x z z x (-2,0,12) モデル・カメラの位置は、全てワー ルド座標系で指定されているので、 どちらの平行移動もワールド座標 系で行う必要がある 平行移動の適用位置(復習) • 平行移動を適用する順番により、結果は変 る カメラ 座標での 平行移動 0 0 10 ワールド →カメラ の回転 モデル→ ワールド の回転 ワールド 座標での 平行移動 y y (-8,4,1) モデル 座標での 平行移動 y x (12,0,2) z x z z x x x y y z z 1 1 解答(誤答3) • 符号の間違い(間違いが多い例) cos 90 0 sin 90 0 cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 0 cos 90 0 0 0 sin 90 1 0 符号の間違い 01 00 00 0 1 8 1 1 0 4 0 0 1 1 0 0 0 1 0 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 01 00 00 0 1 8 1 1 0 4 0 0 1 1 0 0 0 1 0 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 0 0 0 0 0 sin 90 1 0 0 cos 90 0 0 0 sin 90 1 0 0 cos 90 0 0 0 0 1 0 ワールド座標系→カメラ座標系 モデル座標系→ワールド座標系 位置・向きは全てワールド座標系で記述されているので、符号が変わる 0 0 0 1 解答(別解) • 別解 1 0 0 0 0 0 1 0 0 1 0 0 8 cos 90 4 0 1 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 ワールド座標系→カメラ座標系 1 0 0 0 0 0 12 cos 90 1 0 0 0 0 1 2 sin 90 0 0 1 0 y (-8,4,1) 1 0 0 cos 90 0 0 0 0 0 1 逆行列の計算に余分に時間がかり、 実用的ではないので、逆行列を使わな い方法で書けることが必要 y x (12,0,2) z x 0 sin 90 モデル座標系→ワールド座標系 カメラ座標系→ワールド座標系の逆行列 (右側と同じ形になっているところに注目) y 1 z z x 演習問題2 • 下記のシーンにおける、モデル座標系からカメラ座 標系への変換行列を求めよ – 物体の位置が(10,0,3)にあり、Y軸を中心として -90度 回転している – カメラの位置が(-8,10,1)にあり、Y軸を中心として -90度、 Z軸を中心として-45度 回転している y z (-8,10,1) x y y x z (10,0,3) z x 解答 • 解答 X軸周りの回転 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 Y軸周りの回転 0 cos 90 0 0 0 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 0 1 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 ワールド座標系→カメラ座標系 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 モデル座標系→ワールド座標系 解答 • モデル座標系→ワールド座標系 1 0 0 0 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 z 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 y (-8,10,1) x y y x z (10,0,3) z x 解答 • ワールド座標系→カメラ座標系 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 z 0 cos 90 0 0 0 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 0 1 8 1 0 10 0 1 1 0 0 1 0 0 最初にY軸を中心とした回転 行列をかける必要がある y (-8,10,1) x Z軸ではなく、X軸を中心とした 回転行列をかける必要がある y y x z (10,0,3) z x 解答 • 2つの回転行列の適用 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 0 cos 90 0 0 0 sin 90 1 0 Y軸を中心とした回転 y 0 sin 90 1 0 0 cos 90 0 0 z y z x z 01 00 00 0 1 8 1 0 10 0 1 1 0 0 1 0 0 X軸を中心とした回転 y x z y x y x z y x x z 解答 • 注意点 – 2番目の回転では、ワールド座標系でみると Z軸を中心に回転しているが、カメラ座標系では X軸を中心に回転している Y軸を中心とした回転 y X軸を中心とした回転 y x z y z x z z y x y x z y x x z 解答 • 図から分かるように、回転についてはカメラ座 標系のX軸を中心に -45度 回転するのと同じ 0 1 0 cos 45 0 sin 45 0 0 z 0 sin 45 cos 45 0 0 0 0 1 y (-8,10,1) x y y x z (10,0,3) z x 解答 • 最初と2回目の回転は打ち消しあう点に注目 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 0 cos 90 0 0 0 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 0 1 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 ワールド座標系→カメラ座標系 z (-8,10,1) y 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 モデル座標系→ワールド座標系 回転同士は打ち消し合うが、左側の回転 変換行列は平行移動変換にも影響を与え るので、きちんと計算する必要がある y x (10,0,3) z x 検算 • 前の問題と同様の検算を行う – (各自でやっておくこと) 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 0 cos 90 0 0 0 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 10 z 0 0 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 10 cos 90 0 0 3 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 0 2 1 0 0 0.7 0.7 5.6 0 0.7 0.7 19.6 0 0 0 1 y (-8,10,1) x y y x z (10,0,3) z x 解答(誤答) • 間違いの多い例 0 1 0 cos 45 0 sin 45 0 0 cos 45 sin 45 0 0 cos 90 0 sin 90 0 0 sin 45 cos 45 0 sin 45 cos 45 0 0 0 sin 90 1 0 0 0 cos 90 0 0 0 1 0 sin 90 0 1 0 0 0 cos 90 0 0 cos 90 0 0 0 sin 90 1 0 0 cos 45 0 sin 45 0 0 1 0 0 sin 90 1 0 1 8 1 0 0 10 cos 90 0 sin 90 1 0 10 0 1 0 0 0 1 0 Z軸ではなく、X軸を中心とした 0 1 1 0 0 1 3 sin 90 0 cos 90 回転行列をかける必要がある 0 0 1 0 0 0 1 0 0 0 0 01 0 00 1 00 0 10 8 1 0 0 10 cos 90 0 sin 90 1 0 10 0 1 0 0 0 1 0 最初にY軸を中心とした回転 0 1 1 0 0 1 3 sin 90 0 cos 90 行列をかける必要がある 0 0 1 0 0 0 1 0 0 0 0 0 cos 90 0 0 sin 45 cos 45 0 0 01 00 00 10 0 0 sin 90 0 sin 90 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 cos 90 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 01 00 00 0 1 0 0 1 0 0 cos 90 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 解答(誤答1) cos 45 sin 45 0 0 sin 45 cos 45 0 0 0 0 cos 90 0 0 0 1 0 sin 90 0 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 10 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 ワールド座標系のZ軸を中心として回転するつもりが、 カメラ座標系のZ軸を中心とした回転が適用されてしまう Y軸を中心とした回転 y Z軸を中心とした回転 y x z y z x z y z y x x z y x x z 解答(誤答2) cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 0 0 1 0 0 cos 45 0 0 sin 45 1 0 0 0 sin 45 cos 45 0 0 1 0 0 0 0 10 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 ワールド座標系のY軸を中心として回転するつもりが、 カメラ座標系のY軸を中心とした回転が適用されてしまう X軸を中心とした回転 Y軸を中心とした回転 y y x z y z y x x z z y x y x z x z 解答(誤答3) cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 0 cos 45 0 sin 45 0 0 1 0 sin 45 cos 45 0 0 0 01 0 00 1 00 0 10 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 2回目の回転は、ワールド座標系ではなくローカル座標系のY軸を中心とした回 転になるが、この場合、1回目の回転でちょうど傾きの方向が90度ずれている ので(カメラがX軸ではなくZ軸を中心に回転しているので)、結果はたまたま合う Z軸を中心とした回転 y Y軸を中心とした回転 y x y z x y x z z z y x z y x x z 解答(誤答3) • 解答 X軸周りの回転 0 1 0 cos 45 0 sin 45 0 0 0 sin 45 cos 45 0 今回はどちらも同じ結果になる (こちらの方が意味的には正しい) Y軸周りの回転 0 cos 90 0 0 0 sin 90 1 0 0 sin 90 1 0 0 cos 90 0 0 01 00 00 10 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 ワールド座標系→カメラ座標系 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 モデル座標系→ワールド座標系 • 誤答(たまたま同じ計算結果になるが間違い) Y軸周りの回転 cos 90 0 sin 90 0 0 sin 90 1 0 0 cos 90 0 0 Z軸周りの回転 0 cos 45 0 sin 45 0 0 1 0 sin 45 cos 45 0 0 0 01 0 00 1 00 0 10 8 1 1 0 10 0 0 1 1 0 0 0 1 0 0 0 ワールド座標系→カメラ座標系 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 モデル座標系→ワールド座標系 別解 1 0 0 0 0 0 8 cos 90 1 0 10 0 0 1 1 sin 90 0 0 1 0 0 sin 90 1 0 0 cos 90 0 0 0 0 0 1 0 0 cos 45 sin 45 0 0 sin 45 cos 45 1 0 0 0 0 0 0 1 ワールド座標系→カメラ座標系 カメラ座標系→ワールド座標系の逆行列 (右側と同じ形になっているところに注目) z 1 1 0 0 0 0 0 10 cos 90 1 0 0 0 0 1 3 sin 90 0 0 1 0 0 0 cos 90 0 0 逆行列を使わない方法で 考えられる必要がある y y y x z 1 0 0 0 1 モデル座標系→ワールド座標系 (-8,10,1) x 0 sin 90 (10,0,3) z x 次回予告 • プログラミング演習 – OpenGL&GLUT入門
© Copyright 2024 ExpyDoc