10
73 6章 座標変換 6.1 同次座標と変換行列 6.1.1 アフィン変換 アフィン変換とは、線形変換に平行移動を組み合わせたものです。たとえば、一次元のアフィ ン変換は次のように表すことができます。これは x a 倍して、b だけ平行移動します。 (1) 同様に、二次元、三次元の場合は、それぞれ次のようになります。 (2) (3) 行列を使うと、(3) 式を次のように書くことができます。 (4) 6.1.2 同次座標の導入 アフィン変換は (4) 式に示すように、線形変換の結果を平行移動したものとして表すことがで きます。しかし、積と和の組み合わせでは、複数のアフィン変換の合成変換を表すことが面倒に x 0 = ax + b x 0 = a xx x + a yx y + b x y 0 = a xy x + a yy y + b y x 0 = a xx x + a yx y + a zx z + b x y 0 = a xy x + a yy y + a zy z + b y z 0 = a xz x + a yz y + a zz z + b z 0 @ x 0 y 0 z 0 1 A = 0 @ a xx a yx a zx a xy a yy a zy a xz a yz a zz 1 A 0 @ x y z 1 A + 0 @ b x b y b z 1 A

ゲームグラフィックス特論 第3回 講義ノート

  • Upload
    -

  • View
    564

  • Download
    1

Embed Size (px)

DESCRIPTION

座標変換に関して。まだ書きかけです。

Citation preview

Page 1: ゲームグラフィックス特論 第3回 講義ノート

73

第6章 座標変換

6.1 同次座標と変換行列

6.1.1 アフィン変換

アフィン変換とは、線形変換に平行移動を組み合わせたものです。たとえば、一次元のアフィ

ン変換は次のように表すことができます。これは x を a 倍して、b だけ平行移動します。

(1)

同様に、二次元、三次元の場合は、それぞれ次のようになります。

(2)

(3)

行列を使うと、(3) 式を次のように書くことができます。

(4)

6.1.2 同次座標の導入

アフィン変換は (4) 式に示すように、線形変換の結果を平行移動したものとして表すことがで

きます。しかし、積と和の組み合わせでは、複数のアフィン変換の合成変換を表すことが面倒に

x

0 = ax+ b

x

0 = a

xx

x+ a

yx

y + b

x

y

0 = a

xy

x+ a

yy

y + b

y

x

0 = a

xx

x+ a

yx

y + a

zx

z + b

x

y

0 = a

xy

x+ a

yy

y + a

zy

z + b

y

z

0 = a

xz

x+ a

yz

y + a

zz

z + b

z

0

@x

0

y

0

z

0

1

A =

0

@a

xx

a

yx

a

zx

a

xy

a

yy

a

zy

a

xz

a

yz

a

zz

1

A

0

@x

y

z

1

A+

0

@b

x

b

y

b

z

1

A

Page 2: ゲームグラフィックス特論 第3回 講義ノート

74

なります。そこで、x, y, z にもう一つ数を追加して、次のように表すことを考えてみます。

(5)

この x’, y’, z’ も (3) 式と同じものになります。このように表せば、変換の合成を行列の積のみ

で表すことができます。

同次座標 (斉次座標) は、(5) 式のように、表現しようとする空間の次元より一つ多い数の組で

座標 (点の位置) を表すものです。二次元なら三つの数、三次元なら四つの数で座標を表します。

通常の三次元の座標 (以降は実座標と呼ぶことにします) を (x*, y*, z*) と表すとき、それと、そ

の同次座標 (x, y, z, w) との間には、同次座標の定義により次の関係があります。

(6)

したがって、実座標が (x, y, z) であれば、その同次座標は (x, y, z, 1) となります。また、同次

座標の四つ目の要素 w が 0に近づけば、その実座標は (x, y, z) 方向の無限遠に向かって移動し

ます。CG では、同次座標 (x, y, z, 0) は (x, y, z) の方向を表すものとして用いられます。

⇒ (x, y, z) の位置 (7)

⇒ (x, y, z) の方向 (8)

同次座標にスカラー値を掛けても、実座標は変わりません。

⇒ (9)

CG では、ある点から別の点に向かう方向単位ベクトルを求めなければならないことがよくあ

ります。いま、二点 P0, P1 の位置をそれぞれ同次座標 P0 = (x0, y0, z0, w0), P1 = (x1, y1, z1, w1) で表

すとき、P0 から P1 に向かうベクトルは、それぞれの実座標を求めて差を求めます。

(10)

これだと w0 か w1 のどちらかが 0 の時に計算できないので、この両辺に w0w1 を掛けます。

0

BB@

x

0

y

0

z

0

1

1

CCA =

0

BB@

a

xx

a

yx

a

zx

b

x

a

xy

a

yy

a

zy

b

y

a

xz

a

yz

a

zz

b

z

0 0 0 1

1

CCA

0

BB@

x

y

z

1

1

CCA

x

⇤ =x

w

y

⇤ =y

w

z

⇤ =z

w

0

BB@

x

y

z

1

1

CCA

0

BB@

x

y

z

0

1

CCA

a

0

BB@

x

y

z

w

1

CCA =

0

BB@

ax

ay

az

aw

1

CCA⇣ax

aw

,

ay

aw

,

az

aw

⌘=

⇣x

w

,

y

w

,

z

w

P1

w1� P0

w0=

0

BB@

x1/w1

y1/w1

z1/w1

1

1

CCA�

0

BB@

x0/w0

y0/w0

z0/w0

1

1

CCA =

0

BB@

x1/w1 � x0/w0

y1/w1 � y0/w0

z1/w1 � z0/w0

0

1

CCA

Page 3: ゲームグラフィックス特論 第3回 講義ノート

75

(11)

(11) 式は引き算により四つ目の要素が 0 になっているため、実座標ではなく方向のみを表し

ます。しかし、この計算は P0 と P1 のどちらか一方の四つ目の要素が 0、すなわち無限遠にあ

る場合も場合分けすること無く計算できます。また、この計算はこの時点まで割り算を必要とし

ません。陰影計算などで (11) 式の結果を方向として使う場合は、これを正規化します。また、

実座標を得るには、これを w0w1 で割ります。

6.1.3 座標変換

同次座標で表された点の位置 v に対する座標変換は、変換行列を M、変換後の点の位置を v’

として、次式により行います。

(12)

(13)

(14)

(15)

(16)

平行移動

点の位置を現在の位置から (tx, ty, tz) 離れたところに平行移動する変換行列 T(tx, ty, tz) は、次の

ようになります。

(17)

実座標 (x, y, z) に対するこの変換行列による変換は、次のようになります。

(18)

w0P1 � w1P0 =

0

BB@

w0x1

w0y1

w0z1

w0w1

1

CCA�

0

BB@

w1x0

w1y0

w1z0

w1w0

1

CCA =

0

BB@

w0x1 � w1x0

w0y1 � w1y0

w0z1 � w1z0

0

1

CCA

v0 = Mv

v0 =

0

BB@

x

0

y

0

z

0

w

0

1

CCA

v =

0

BB@

x

y

z

w

1

CCA

M =

0

BB@

m0 m4 m8 m12

m1 m5 m9 m13

m2 m6 m10 m14

m3 m7 m11 m15

1

CCA

0

BB@

x

0

y

0

z

0

w

0

1

CCA =

0

BB@

m0 m4 m8 m12

m1 m5 m9 m13

m2 m6 m10 m14

m3 m7 m11 m15

1

CCA

0

BB@

x

y

z

w

1

CCA

T(t) = T(tx

, ty

, tz

) =

0

BB@

1 0 0 tx

0 1 0 ty

0 0 1 tz

0 0 0 1

1

CCA

0

BB@

1 0 0 t

x

0 1 0 t

y

0 0 1 t

z

0 0 0 1

1

CCA

0

BB@

x

y

z

1

1

CCA =

0

BB@

x+ t

x

y + t

y

z + t

z

1

1

CCA

Page 4: ゲームグラフィックス特論 第3回 講義ノート

76

T(7, 8, 0) という変換は、図 39のような平行移動になります。

図 39 平行移動

同次座標の四つ目の要素が 0の時は、この変換の影響を受けません。

(19)

拡大縮小

せん断

座標軸中心の回転

次の変換は、点の位置を、原点を中心に回転します。

【X 軸中心の回転】

(20)

図 40 X軸中心の回転

T(7, 8, 0)

x x

y y

7

8

0

BB@

1 0 0 t

x

0 1 0 t

y

0 0 1 t

z

0 0 0 1

1

CCA

0

BB@

x

y

z

0

1

CCA =

0

BB@

x

y

z

0

1

CCA

Rx

(✓) =

0

BB@

1 0 0 0

0 cos ✓ � sin ✓ 0

0 sin ✓ cos ✓ 0

0 0 0 1

1

CCA

θ!

Page 5: ゲームグラフィックス特論 第3回 講義ノート

77

【Y 軸中心の回転】

(21)

図 41 Y軸中心の回転

【Z 軸中心の回転】

(22)

図 42 Z軸中心の回転

【任意の軸を中心とした回転】

方向余弦 (l, m, n) を軸としてθ回転する変換は、次式により求めることができます。

(23)

Ry(✓) =

0

BB@

cos ✓ 0 sin ✓ 0

0 1 0 0

� sin ✓ 0 cos ✓ 0

0 0 0 1

1

CCA

θ!

Rz(✓) =

0

BB@

cos ✓ � sin ✓ 0 0

sin ✓ cos ✓ 0 0

0 0 1 0

0 0 0 1

1

CCA

θ!

R(l,m, n, ✓)

=

0

BB@

l2 + (1� l2) cos ✓ lm(1� cos ✓)� n sin ✓ ln(1� cos ✓) +m sin ✓ 0

lm(1� cos ✓) + n sin ✓ m2+ (1�m2

) cos ✓ mn(1� cos ✓)� l sin ✓ 0

ln(1� cos ✓)�m sin ✓ mn(1� cos ✓) + l sin ✓ n2+ (1� n2

) cos ✓ 0

0 0 0 1

1

CCA

Page 6: ゲームグラフィックス特論 第3回 講義ノート

78

図 43 任意軸回りの回転

任意の点を中心にした回転

前節で示した回転の変換は、いずれも原点を通る軸を中心としたものでした。任意の点を点を

通る軸を中心に回転するには、一旦その点を原点に移す平行移動を行い、回転した後に、元野市

に戻すという処理を行います。これは平行移動と回転の合成変換になります。

図 44 任意の点を中心とする回転

6.2 オイラー変換

6.2.1 オイラー角とオイラー変換

原点を中心とした任意の回転は、X, Y, Z の三つの軸中心の回転を合成して表すことができま

す。この回転を表す各軸中心の回転角の組をオイラー角と呼び、それによって表される回転の変

換をオイラー変換と呼びます。

合成変換は変換行列の積で表されますが、行列の積には交換法則が成り立たちません。したが

ってオイラー変換の結果は、各軸中心の回転を合成する順序によって変化します。ここでは、Z 軸

(l,m,n)

θ!

p

x

y

x

y

x

y

p

T(�p)

θ"

Rz(θ) T(p)

M = T(p) Rz(✓) T(�p)

Page 7: ゲームグラフィックス特論 第3回 講義ノート

79

中心の回転 (roll, bank) → X 軸中心の回転 (pitch) → Y 軸中心の回転 (heading, yaw) の順に変

換するものとします。また、それぞれの角度を r, p, h で表します。

l r: roll, bank (Z 軸中心の回転角)

l p: pitch (X 軸中心の回転角)

l h: heading, yaw (Y 軸中心の回転角)

図 45 オイラー角

このとき、オイラー変換 E(h, p, r) は次式で表されます。

(24)

6.2.2 ジンバルロック

オイラー角のうち、p = π/ 2 の場合を考えます。このとき、sin p = 1, cos p = 0 となりますか

ら、(24) 式は次のようになります。

(25)

これは、加法定理により、次のように書き換えられます。

z x

y

roll

pitch

heading

=

0

BB@

cosh 0 sinh 0

0 1 0 0

� sinh 0 cosh 0

0 0 0 1

1

CCA

0

BB@

1 0 0 0

0 cos p � sin p 0

0 sin p cos p 0

0 0 0 1

1

CCA

0

BB@

cos r � sin r 0 0

sin r cos r 0 0

0 0 1 0

0 0 0 1

1

CCA

=

0

BB@

sinh sin p sin r + cosh cos r sinh sin p cos r � cosh sin r sinh cos p 0

cos p sin r cos p cos r � sin p 0

cosh sin p sin r � sinh cos r cosh sin p cos r + sinh sin r cosh cos p 0

0 0 0 1

1

CCA

E(h, p, r) = Ry

(h)Rx

(p)Rz

(r)

E(h,⇡/2, r) =

0

BB@

sinh sin r + cosh cos r sinh cos r � cosh sin r 0 0

0 0 �1 0

cosh sin r � sinh cos r cosh cos r + sinh sin r 0 0

0 0 0 1

1

CCA

Page 8: ゲームグラフィックス特論 第3回 講義ノート

80

(26)

この回転は (r − h) という単一の角度で決定される、一つの軸による回転です。このため、r と

h のどちらを変化させても同じ回転になり、自由度が一つ減ってしまいます。p = π/ 2 の回転に

よって r の回転軸 (Z 軸) が h の回転軸と一致します。この現象をジンバルロックと呼びます。

6.2.3 回転変換行列からオイラー角の算出

ある回転変換行列 M がオイラー変換 E(h, p, r) にもとづくものであったとします。

(27)

m1 と m5 の関係から、r を求めることができます。

(28)

同様に、m8 と m10 の関係から、h を求めることができます。

(29)

p は m9 から求めることができます。

(30)

ただし、m1 = m5 = 0 のときは cos p = 0 なので、p = ±π/ 2 となります。これはジンバルロッ

クが発生している状態であり、(28) 式や (29) 式で r や h を求めることができません。その場

合は、例えば h = 0 とし、m0 と m14 の関係から、h を求めることができます。

(31)

6.3 直交座標系の変換

互いに直交する三つの単位ベクトル i’, j’, k’ を軸とする座標系上の点の位置 p の、この座標

系と原点を共有する、別の直交する三つの単位ベクトル i, j, k を軸とする座標系における位置を

求めます。それぞれの座標系における p の座標値を (x’, y’, z’), (x, y, z) とすると、p は次のよう

に表すことができます。

(32)

この式は、行列を用いて次のように書くことができます。

E(h,⇡/2, r) =

0

BB@

cos(h� r) sin(h� r) 0 0

0 0 �1 0

� sin(h� r) cos(h� r) 0 0

0 0 0 1

1

CCA

M =

0

BB@

m0 m4 m8 m12

m1 m5 m9 m13

m2 m6 m10 m14

m3 m7 m11 m15

1

CCA = E(h, p, r)

m1 = cos p sin rm5 = cos p cos r

�! r = atan2(m5,m1)

m8 = sinh cos pm10 = cosh cos p

�! h = atan2(m10,m8)

m9 = � sin p ! p = asin(�m9)

m0 = cos(h⌥ r)m4 = sin(h⌥ r)

�! h = 0, r = �atan2(m0,m4)

p = xi+ yj+ zk = x

0i0 + y

0j0 + z

0k0

Page 9: ゲームグラフィックス特論 第3回 講義ノート

81

(33)

したがって (x, y, z) は、次式で求めることができます。

(34)

ここで行列 (i j k), (i’ j’ k’) は直交行列ですから、これらの逆行列は転置行列と等しくなります。

(35)

この変換行列 M は、(x, y, z) を軸とする空間を、(x’, y’, z’) が軸となるように回転します。

(36)

いま、互いに直交する三つの単位ベクトルの組を r, s, t とします。

(37)

また、X軸、Y軸、Z軸のそれぞれの軸方向の単位ベクトルを x, y, z とします。x, y, z は次の

ように表されます。

(38)

r, s, t を x, y, z に一致させる回転の変換行列を M とします。

(39)

これを行列で表すと、次のようになります。

(40)

�i j k

�0

@x

y

z

1

A =�i0 j0 k0 �

0

@x

0

y

0

z

0

1

A

0

@x

y

z

1

A =�i j k

��1 �i0 j0 k0 �

0

@x

0

y

0

z

0

1

A

0

@x

y

z

1

A =�i j k

�T �i0 j0 k0 �

0

@x

0

y

0

z

0

1

A

M =�i j k

�T �i0 j0 k0 �

=

0

@i · i0 i · j0 i · k0

j · i0 j · j0 j · k0

k · i0 k · j0 k · k0

1

A

r =

0

@rx

ry

rz

1

A , s =

0

@sx

sy

sz

1

A , t =

0

@tx

ty

tz

1

A

x =

0

@100

1

A , y =

0

@010

1

A , z =

0

@001

1

A

8<

:

x = Mr

y = Ms

z = Mt

�x y z

�= M

�r s t

Page 10: ゲームグラフィックス特論 第3回 講義ノート

82

図 46 座標軸の回転

この左辺は単位行列になります。

(41)

したがって M は次のようにして求めることができます。

(42)

6.4 ビュー変換

6.5 投影変換

6.5.1 クリッピング座標系

6.5.2 直交投影

6.5.3 透視投影

6.5.4 透視深度

x

z

y

r

s

t M

M

M

0

@1 0 00 1 00 0 1

1

A = M

0

@rx

sx

tx

ry

sy

ty

rz

sz

tz

1

A

M =

0

@rx

sx

tx

ry

sy

ty

rz

sz

tz

1

A�1

=

0

@rx

sx

tx

ry

sy

ty

rz

sz

tz

1

AT

=

0

@rx

ry

rz

sx

sy

sz

tx

ty

tz

1

A =

0

@rT

sT

tT

1

A