ゲームグラフィックス特論 第3回

64
ゲームグラフィックス特論 3回 変換 (1)

Upload: -

Post on 25-Jun-2015

2.242 views

Category:

Education


0 download

DESCRIPTION

同次座標,座標変換,モデル変換,ビュー変換,投影変換,透視深度

TRANSCRIPT

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

ゲームグラフィックス特論 第3回 変換 (1)

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

変換行列 同次座標による座標変換

2

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

内積

3

v1 =

0

BB@

x1

y1

z1

w1

1

CCA , v2 =

0

BB@

x2

y2

z2

w2

1

CCA

v1 · v2 =�x1 y1 z1 w1

0

BB@

x2

y2

z2

w2

1

CCA

= x1x2 + y1y2 + z1z2 + w1w2

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

アフィン変換

• 線形変換と平行移動の組み合わせ

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

4

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

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

アフィン変換の行列表現

5

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

アフィン変換の同次座標による表現

6

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

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

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

v =

0

BB@

x

y

z

w

1

CCA

=�x y z w

�T

同次座標

7

0

BB@

x

y

z

w

1

CCA⇣x

w

,

y

w

,

z

w

(x, y, z)

(x, y, z)

0

BB@

x

y

z

1

1

CCA

0

BB@

x

y

z

0

1

CCA

の位置

の方向

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

同次座標の性質

• 同次座標にスカラーをかけても実座標は変わらない

8

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

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

同次座標の性質

• 同次座標の差は「通分」してから求める

9

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

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

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

変換

10

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

v0 = Mv

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

Page 11: ゲームグラフィックス特論 第3回

平行移動

( )0,8,7T

x

y

7

8

x

y

11

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

Page 12: ゲームグラフィックス特論 第3回

位置と方向の平行移動

位置 方向

移動する 変化なし

12

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

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

Page 13: ゲームグラフィックス特論 第3回

0

BB@

a 0 0 00 a 0 00 0 a 00 0 0 1

1

CCA

0

BB@

x

y

z

1

1

CCA =

0

BB@

ax

ay

az

1

1

CCA

0

BB@

1 0 0 00 1 0 00 0 1 00 0 0 1/a

1

CCA

0

BB@

x

y

z

1/a

1

CCA =

0

BB@

x

y

z

1

1

CCA

拡大縮小

x

y

13

S(s) = S(sx

, sy

, sz

) =

0

BB@

sx

0 0 00 s

y

0 00 0 s

z

00 0 0 1

1

CCA

(ax, ay, az)

Page 14: ゲームグラフィックス特論 第3回

任意の点を中心にした拡大縮小

x

y

x

y

p

T(-p) T(p)

M = T(-p) S (s) T(p)

S(s)

p

x

y

14

Page 15: ゲームグラフィックス特論 第3回

せん断

( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000010001 s

sxyH

( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000010001 s

sxzH ( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000100001

ssyzH

x

y

1 s

1

( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000010001

ssyxH

( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000100001

sszxH ( )

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

100001000100001

sszyH

y: せん断変形の基準となる座標軸

x: 変更される座標軸

Hxz(t) Hyz(s)

15

Page 16: ゲームグラフィックス特論 第3回

座標軸中心の回転

16

Rx

(✓) =

0

BB@

1 0 0 0

0 cos ✓ � sin ✓ 0

0 sin ✓ cos ✓ 0

0 0 0 1

1

CCA

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

Page 17: ゲームグラフィックス特論 第3回

任意軸周りの回転

(l,m,n)

θ

17

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 18: ゲームグラフィックス特論 第3回

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

p

x

y

x

y

x

y

p

T(-p)

θ

Rz(θ) T(p)

M = T(-p) Rz(θ) T(p)

18

Page 19: ゲームグラフィックス特論 第3回

オイラー変換

19

heading

pitch roll

z x

y h: heading (yaw) p: pitch r: roll (bank)

E(h, p, r) = Ry

(h)Rx

(p)Rz

(r)

Page 20: ゲームグラフィックス特論 第3回

オイラー変換

20

E(h, p, r)

=

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

Page 21: ゲームグラフィックス特論 第3回

ジンバルロック

• これは (r - h) の単一の角度に依存する1軸中心の回転

• したがって自由度が一つ減る

21

=

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

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

p ! ⇡/2

Page 22: ゲームグラフィックス特論 第3回

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

22

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)

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

m8 = sinh cos pm10 = cosh cos p

�! h = atan2(m10,m8)

もし m1 = m5 = 0 ) cos p = 0 ! p = ±⇡/2

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

�! h = 0

r = �atan2(m0,m4)

Page 23: ゲームグラフィックス特論 第3回

直交座標系の変換

•  (i, j, k), (i’, j’, k’): 直交座標系

•  p: 点の位置

23

i

j

k

p

p = xi+ yj+ zk = x

0i0 + y

0j0 + z

0k0

0

@x

0

y

0

z

0

1

A = MT

0

@x

y

z

1

A=

0

@i · i0 j · i0 k · i0i · j0 j · j0 k · j0i · k0 j · k0 k · k0

1

A

0

@x

y

z

1

A

0

@x

y

z

1

A = M

0

@x

0

y

0

z

0

1

A =�i j k

�T �i0 j0 k0 �

0

@x

0

y

0

z

0

1

A

=

0

@i · i0 i · j0 i · k0

j · i0 j · j0 j · k0

k · i0 k · j0 k · k0

1

A

0

@x

0

y

0

z

0

1

A

Page 24: ゲームグラフィックス特論 第3回

直交座標系の変換

x

z

y

r

s

t M

M

M

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

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

0

@1 0 00 1 00 0 1

1

A = M

0

@rx

sx

tx

ry

sy

ty

rz

sz

tz

1

A

Page 25: ゲームグラフィックス特論 第3回

あるベクトルを別のベクトルに一致させる回転 (1)

v u

n

n = u× vu× v

( )( )( ) ⎟

⎟⎠

⎞⎜⎜⎝

××

××

×

×=

=

vuuvuu

vuvuu

lnuMu

p n

n

p

p

l = u×nu×n

=u× u× v( )u× u× v( )

m =v×nv×n

=v× u× v( )v× u× v( )

( )( )( ) ⎟

⎟⎠

⎞⎜⎜⎝

××

××

×

×=

=

vuvvuv

vuvuv

mnvMv

Tuvuv MMMMM == −1

u

v

25

Page 26: ゲームグラフィックス特論 第3回

特定方向への拡大縮小

拡大縮小する軸の方向

(x y z) 軸方向の拡大縮小率

M = FS s( )FT

(x y z) 軸の空間から (r s t) 軸の空間への回転

(r s t) 軸の空間 → (x y z) 軸の空間への回転 (x y z) 軸方向の拡大縮小 (x y z) 軸の空間 → (x y z) 軸の空間への回転

FT F S(s)

26

S(s)

F =

✓r s t 00 0 0 1

�r s t

Page 27: ゲームグラフィックス特論 第3回

変換の連結

• 行列の演算は非可換 •  連結した変換の結果は行列の順序に依存する

R(θ)

R(θ)

S(s)

S(s)

27

Page 28: ゲームグラフィックス特論 第3回

M = T t( )R θ( ) =

r00 r10 r20 txr01 r11 r21 tyr02 r12 r22 tz0 0 0 1

!

"

####

$

%

&&&&

剛体変換

• 立体の移動と回転

• 一般的に立体の形状に影響を与えない(=剛体)

R = r0, r1, r2,( ) =r,0T

r,1T

r,2T

!

"

####

$

%

&&&&

⎟⎟⎠

⎞⎜⎜⎝

⎛=⇒

1T0tR

M

28

Page 29: ゲームグラフィックス特論 第3回

法線ベクトルの変換 面との直交性の維持

29

Page 30: ゲームグラフィックス特論 第3回

変換と法線ベクトル

• ベクトルも変換行列によって変換できる

• 面の頂点に適用した座標変換の行列をそのままその面の法線ベクトルに適用しても正しく変換できない場合がある

M: x 軸方向に 0.5 倍スケーリングする行列

間違い 正解

x

y

N MN

x

y

GN

x

y

30

Page 31: ゲームグラフィックス特論 第3回

法線ベクトルの正しい変換

• M: 形状の変換に用いる行列

• G: この形状の法線ベクトルの変換に用いる行列

MG =

( )Madj :Mの随伴行列

( )( )TMG adj=

31

Page 32: ゲームグラフィックス特論 第3回

随伴行列 (adjoint)

M =

m00 m10 m20

m01 m11 m21

m02 m12 m22

!

"

####

$

%

&&&&

d00M =

m11 m21

m12 m22

d10M =

m01 m21

m02 m22

adj M( ) =d00M −d01

M d02M

−d10M d11

M −d12M

d20M −d21

M d22M

"

#

$$$$

%

&

''''

余因子

ちなみに ( )MM

M adj11 =−したがって ( )T1−= MG でも可

32

Page 33: ゲームグラフィックス特論 第3回

逆行列 逆変換を行う

33

Page 34: ゲームグラフィックス特論 第3回

逆行列の計算

• クラメールの公式 •  3×3までの行列なら簡単

• ガウスの消去法など

•  数値計算的手法

• 一般に計算コストが高い

•  できるだけ「楽に」逆行列を求めたい

( )MM

M adj11 =−

34

Page 35: ゲームグラフィックス特論 第3回

逆行列の求め方

• 平行移動

• 拡大縮小

• 回転

• せん断

35

T�1(t) = T(�t) =

0

BB@

1 0 0 �tx

0 1 0 �ty

0 0 1 �tz

0 0 0 1

1

CCA

S�1(s) = S

✓1

sx

,1

sy

,1

sz

◆=

0

BB@

1s

x

0 0 00 1

s

y

0 0

0 0 1s

z

00 0 0 1

1

CCA

R�1(✓) = R(�✓) = RT (✓)

H�1ij (s) = Hij(�s)

Page 36: ゲームグラフィックス特論 第3回

逆行列の求め方

• 剛体変換

36

M = T t( )R θ( )⇒M−1 =R−1 θ( )T−1 t( ) =R −θ( )T −t( ) =RT θ( )T −t( )

R =r00 r10 r20r01 r11 r21r02 r12 r22

!

"

####

$

%

&&&&= r0, r1, r2,( ) =

r,0T

r,1T

r,2T

!

"

####

$

%

&&&&

M = R t0T 1

!

"##

$

%&&⇒M−1 =

r,00

r,10

r,20

−RT t1

!

"

##

$

%

&&

Page 37: ゲームグラフィックス特論 第3回

逆行列の求め方

• オイラー変換

37

E−1 h, p, r( ) = ET h, p, r( )

= Ry h( )Rx p( )Rz r( )( )T

=RzT r( )Rx

T p( )RyT h( )

E h, p, r( ) =Ry h( )Rx p( )Rz r( )

Page 38: ゲームグラフィックス特論 第3回

OpenGL の変換行列 GLSL における座標変換

38

Page 39: ゲームグラフィックス特論 第3回

OpenGL の変換行列の要素の順序

この講義での行列表記

M =

m0 m4 m8 m12m1 m5 m9 m13m2 m6 m10 m14m3 m7 m11 m15

!

"

#####

$

%

&&&&&

C/C++ 言語の配列の格納順序

GLfloat m[] = { ! m[ 0], m[ 1], m[ 2], m[ 3], ! m[ 4], m[ 5], m[ 6], m[ 7], ! m[ 8], m[ 9], m[10], m[11], ! m[12], m[13], m[14], m[15], !};

39

Page 40: ゲームグラフィックス特論 第3回

課題

• y 軸中心に r ラジアン回転したあと,y 方向に d 平行移動する変換行列を右の配列変数 m に設定しなさい.関数 sin() / cos() は使って構わない.

• この配列変数は OpenGL で使用するものとする.

GLfloat m[16]; !!m[0] = … ; !m[1] = … ; !… !m[15] = … ; !

40

Page 41: ゲームグラフィックス特論 第3回

行列をシェーダプログラムで使う

•  uniform 変数 •  描画単位 (glDrawArrays(), glDrawElements() 等) で不変な値をもつ

•  変換行列,光源位置,視点位置,材質情報等 •  各シェーダステージから共通して参照される

•  CPU 側のプログラムで値を設定する •  シェーダプログラムからは読み出しのみ

#version 150 core !in vec4 pv; !uniform mat4 mc; !void main(void) !{ ! gl_Position = mc * pv; !}

バーテックスシェーダ uniform uniform 変数の宣言

mat4 実数 (float) 4×4 要素の行列データ型

mc mat4 型のユーザ定義 uniform 変数

41

Page 42: ゲームグラフィックス特論 第3回

uniform 変数に行列を設定する

• シェーダプログラムの作成(loadShader() を使う場合) •  GLuint program = createProgram( … );

• この後に uniform 変数 mc のインデックスを求める •  GLint mcLoc = glGetUniformLocation(program, "mc");

•  uniform 変数はシェーダのハードウェアの「レジスタ」に割り当てられる •  glGetUniformLocation() は uniform 変数に割り当てられたレジスタの「イン

デックス」を求める

• 描画時に使用するシェーダプログラムの選択 •  glUseProgram(program);

• その後に uniform 変数に値を設定する •  glUniformMatrix4fv(mcLoc, count, transpose, mc);

•  count: 設定する配列変数の数(行列の数が1個なら1), transpose: m を転置するなら GL_TRUE, しないなら GL_FALSE

42

Page 43: ゲームグラフィックス特論 第3回

投影変換 直交投影と透視投影

43

Page 44: ゲームグラフィックス特論 第3回

標準ビューボリューム

x

y

z

O1

1

1

<1<1

<1

• -1≦ x ≦1, -1≦ y ≦1, -1≦ z ≦1 の立方体の空間

• この空間からはみ出たものはクリッピングされる

• この空間のxy平面への直交投影像がビューポートに表示される

• この空間の座標系はクリッピング座標系

44

Page 45: ゲームグラフィックス特論 第3回

直交投影

xz

yleft

right

top

bottom

-near

-far

xz

y

x

z

y

x

z

y

45

Page 46: ゲームグラフィックス特論 第3回

中心に平行移動

O x

y

left right

top

bottom

1 0 0 −right + left

2

0 1 0 −top+ bottom

2

0 0 1 far + near2

0 0 0 1

"

#

$$$$$$$$

%

&

''''''''

46

Page 47: ゲームグラフィックス特論 第3回

スケーリングして大きさを正規化

x

y

Oleft right

top

bottom

1

-1

-1 1

top-bottom

right-left

2

2

2right − left

0 0 0

0 2top− bottom

0 0

0 0 −2far − near

0

0 0 0 1

"

#

$$$$$$$$$

%

&

'''''''''

47

Page 48: ゲームグラフィックス特論 第3回

直交投影変換行列

!!!!!!!!

"

#

$$$$$$$$

%

&

+−

−−

+−

+−

=

!!!!!!!

"

#

$$$$$$$

%

&

+

+−

+−

!!!!!!!!

"

#

$$$$$$$$

%

&

−−

=

1000

200

020

002

10002

1002

0102

001

1000

0200

0020

0002

nearfarnearfar

nearfar

bottomtopbottomtop

bottomtop

leftrightleftright

leftright

nearfar

bottomtop

leftright

nearfar

bottomtop

leftright

oM

48

Page 49: ゲームグラフィックス特論 第3回

透視投影

xz

yleft

right

top

bottom

-near

-far

!"#$%#&'(

!")*+(

xz

yxz

y

x

z

y

49

Page 50: ゲームグラフィックス特論 第3回

せん断

1 0 right + left2near

0

0 1 top+ bottom2near

0

0 0 1 00 0 0 1

!

"

########

$

%

&&&&&&&&

50

Oz

<near

<far

left right x

right+left2

1right+left

2 near

(view frustum)

Page 51: ゲームグラフィックス特論 第3回

透視変換

O<near

<farz z

y

ynearz y<

!"#$%&!'()*+),-

!".$+.%(-

!"/01-

x* = − nearz

x

y* = − naerz

y

z* = − far + near2

−far near

z

51

Page 52: ゲームグラフィックス特論 第3回

透視変換

!x!y!z!w

"

#

$$$$

%

&

''''

=

near 0 0 00 near 0 0

0 0 far + near2

far near

0 0 −1 0

"

#

$$$$$$

%

&

''''''

xyz1

"

#

$$$$

%

&

''''

!x = near x!y = near y

!z = far + near2

z+ far near

!w = −z

x* = − nearz

x

y* = − naerz

y

z* = − far + near2

−far near

z

52

求め方は 後述

Page 53: ゲームグラフィックス特論 第3回

透視深度

<near

<farz <near <far

near

far

O z O

<1

1

53

Page 54: ゲームグラフィックス特論 第3回

視錐台による透視投影変換行列

M p =

2right − left

0 0 0

0 2top− bottom

0 0

0 0 −2far − near

0

0 0 0 1

"

#

$$$$$$$$$

%

&

'''''''''

near 0 0 00 near 0 0

0 0 far + near2

far near

0 0 −1 0

"

#

$$$$$$

%

&

''''''

1 0 right + left2near

0

0 1 top+ bottom2near

0

0 0 1 00 0 0 1

"

#

$$$$$$$$

%

&

''''''''

=

2nearright − left

0 right + leftright − left

0

0 2neartop− bottom

top+ bottomtop− bottom

0

0 0 −far + nearfar − near

−2 far nearfar − near

0 0 −1 0

"

#

$$$$$$$$$

%

&

'''''''''

54

Page 55: ゲームグラフィックス特論 第3回

画角をもとにした透視投影変換行列

f = 1

tan fovy2

!

"#

$

%&= cot fovy

2!

"#

$

%&

M p =

faspect

0 0 0

0 f 0 0

0 0 −far + nearfar − near

−2 far nearfar − near

0 0 −1 0

!

"

########

$

%

&&&&&&&&

fovy

x

y

z

-far-near

55

Page 56: ゲームグラフィックス特論 第3回

視野変換 視点の位置や視線の方向を変更する

56

Page 57: ゲームグラフィックス特論 第3回

視野変換

視野変換前

O x

y

z

視野変換後

O x

y

z

<z

57

Page 58: ゲームグラフィックス特論 第3回

視点の移動

O x

y

z

u = (ux, uy, uz)

t = (tx, ty, tz)

e = (ex, ey, ez)

O x

y

z

u

t < e

Tv =

1 0 0 −ex0 1 0 −ey0 0 1 −ez0 0 0 1

"

#

$$$$$

%

&

'''''

58

Page 59: ゲームグラフィックス特論 第3回

視線の回転

O x

y

z

u

t < e

O x

y

z

(0, 0, 1)

(1, 0, 0)

(0, 1, 0)

Rv =

!x T 0!y T 0!z T 0

0 0 0 1

"

#

$$$$$

%

&

'''''

59

Page 60: ゲームグラフィックス特論 第3回

回転の変換行列

Rv =

!x T 0!y T 0!z T 0

0 0 0 1

"

#

$$$$$

%

&

'''''

=

!xx !xy !xz 0!yx !yy !yz 0!zx !zy !zz 0

0 0 0 1

"

#

$$$$$

%

&

'''''

!z T = !zx !zy !zz( ) =ex ( tx ey ( ty ez ( tz( )

ex ( tx( )2 + ey ( ty( )2+ ez ( tz( )2

!x T = !xx !xy !xz( ) =uy !zz (uz !zy uz !zx (ux !zz ux !zy (uy !zx( )

uy !zz (uz !zy( )2+ uz !zx (ux !zz( )2 + ux !zy (uy !zx( )

2

!y T = !yx !yy !yz( ) = !zy !xz ( !zz !xy !zz !xx ( !zx !xz !zx !xy ( !zy !xx( )

60

Page 61: ゲームグラフィックス特論 第3回

視野変換行列

Mv =RvTv =

!xx !xy !xz 0!yx !yy !yz 0!zx !zy !zz 0

0 0 0 1

"

#

$$$$$

%

&

'''''

1 0 0 (ex0 1 0 (ey0 0 1 (ez0 0 0 1

"

#

$$$$

%

&

''''

=

!xx !xy !xz (ex !xx ( ey !xy ( ez !xz!yx !yy !yz (ex !yx ( ey !yy ( ez !yz!zx !zy !zz (ex !zx ( ey !zy ( ez !zz0 0 0 1

"

#

$$$$$

%

&

'''''

61

Page 62: ゲームグラフィックス特論 第3回

各変換行列の使い方

Mm : モデリング変換行列(パーツごとの拡大・縮小,回転,平行移動等)

Mv M p: 視野変換行列 : 投影変換行列

Pl Nl: ローカル座標系の座標値 : ローカル座標系の法線ベクトル

Mc =M pMvMm Pc =McPl

Pw =MmPl

G = adj Mm( )( )T Nw =GNl(要正規化)

62

Page 63: ゲームグラフィックス特論 第3回

宿題

• 次の変換行列を求めて引数の配列変数 m に格納する関数を作成してください. •  透視投影変換行列を求める関数 perspective() •  視野変換行列を求める関数 lookat() •  関数の仕様はひな形プログラムを参照のこと

•  https://github.com/tokoik/ggsample03

• 透視投影変換行列と視野変換行列の積を,シェーダプログラムの uniform 変数 mc に格納してください.

• バーテックスシェーダにおいて,頂点座標に uniform 変数 mc をかけてください.

• main.cpp と simple.vert をメールに添付してください. •  送り先 [email protected]

第2回の宿題の図形を視野変換と透視投影変換を行って描いてください

63

Page 64: ゲームグラフィックス特論 第3回

結果

このような画像が表示されれば,多分,正解です.

64