コンピューターグラフィックスS

コンピューターグラフィックス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
01

00
00
 
10
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
01

00

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
01

00

00

  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
01

00

00

  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 

01

00

00

  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

01

00

00

  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
01

00

00

  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)

01

00

00

  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

01

00

00

  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

符号の間違い
01

00

00

  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1

00

00

  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

01

00

00

  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

01

00

00

  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

01

00

00

  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

01

00

00

  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
01

00

00


10
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 01

0 00

1 00

0 10
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

01

00

00


10

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

01

00

00

  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

01

00

00


10
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


10
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 01

0 00

1 00

0 10
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
01

00

00


10
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 01

0 00

1 00

0 10
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入門