ゲームグラフィックス特論 第3回
description
Transcript of ゲームグラフィックス特論 第3回
ゲームグラフィックス特論 第3回 変換 (1)
変換行列 同次座標による座標変換
2
内積
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
アフィン変換
• 線形変換と平行移動の組み合わせ
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
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
アフィン変換の同次座標による表現
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
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
の位置
の方向
同次座標の性質
• 同次座標にスカラーをかけても実座標は変わらない
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
⌘
同次座標の性質
• 同次座標の差は「通分」してから求める
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
変換
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
平行移動
( )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
位置と方向の平行移動
位置 方向
移動する 変化なし
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
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)
任意の点を中心にした拡大縮小
x
y
x
y
p
T(-p) T(p)
M = T(-p) S (s) T(p)
S(s)
p
x
y
14
せん断
( )
⎟⎟⎟⎟⎟
⎠
⎞
⎜⎜⎜⎜⎜
⎝
⎛
=
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
座標軸中心の回転
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
任意軸周りの回転
(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
任意の点を中心にした回転
p
x
y
x
y
x
y
p
T(-p)
θ
Rz(θ) T(p)
M = T(-p) Rz(θ) T(p)
18
オイラー変換
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)
オイラー変換
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
ジンバルロック
• これは (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
回転変換行列からオイラー角を算出
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)
直交座標系の変換
• (i, j, k), (i’, j’, k’): 直交座標系
• p: 点の位置
23
k´
i´
j´
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
直交座標系の変換
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
あるベクトルを別のベクトルに一致させる回転 (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
特定方向への拡大縮小
拡大縮小する軸の方向
(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
�
変換の連結
• 行列の演算は非可換 • 連結した変換の結果は行列の順序に依存する
R(θ)
R(θ)
S(s)
S(s)
27
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
法線ベクトルの変換 面との直交性の維持
29
変換と法線ベクトル
• ベクトルも変換行列によって変換できる
• 面の頂点に適用した座標変換の行列をそのままその面の法線ベクトルに適用しても正しく変換できない場合がある
M: x 軸方向に 0.5 倍スケーリングする行列
間違い 正解
x
y
N MN
x
y
GN
x
y
30
法線ベクトルの正しい変換
• M: 形状の変換に用いる行列
• G: この形状の法線ベクトルの変換に用いる行列
MG =
( )Madj :Mの随伴行列
( )( )TMG adj=
31
随伴行列 (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
逆行列 逆変換を行う
33
逆行列の計算
• クラメールの公式 • 3×3までの行列なら簡単
• ガウスの消去法など
• 数値計算的手法
• 一般に計算コストが高い
• できるだけ「楽に」逆行列を求めたい
( )MM
M adj11 =−
34
逆行列の求め方
• 平行移動
• 拡大縮小
• 回転
• せん断
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)
逆行列の求め方
• 剛体変換
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
!
"
##
$
%
&&
逆行列の求め方
• オイラー変換
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( )
OpenGL の変換行列 GLSL における座標変換
38
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
課題
• y 軸中心に r ラジアン回転したあと,y 方向に d 平行移動する変換行列を右の配列変数 m に設定しなさい.関数 sin() / cos() は使って構わない.
• この配列変数は OpenGL で使用するものとする.
GLfloat m[16]; !!m[0] = … ; !m[1] = … ; !… !m[15] = … ; !
40
行列をシェーダプログラムで使う
• 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
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
投影変換 直交投影と透視投影
43
標準ビューボリューム
x
y
z
O1
1
1
<1<1
<1
• -1≦ x ≦1, -1≦ y ≦1, -1≦ z ≦1 の立方体の空間
• この空間からはみ出たものはクリッピングされる
• この空間のxy平面への直交投影像がビューポートに表示される
• この空間の座標系はクリッピング座標系
44
直交投影
xz
yleft
right
top
bottom
-near
-far
xz
y
x
z
y
x
z
y
45
中心に平行移動
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
スケーリングして大きさを正規化
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
直交投影変換行列
!!!!!!!!
"
#
$$$$$$$$
%
&
−
+−
−
−−
+−
−
−
+−
−
=
!!!!!!!
"
#
$$$$$$$
%
&
+
+−
+−
!!!!!!!!
"
#
$$$$$$$$
%
&
−
−−
−
=
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
透視投影
xz
yleft
right
top
bottom
-near
-far
!"#$%#&'(
!")*+(
xz
yxz
y
x
z
y
49
せん断
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)
透視変換
O<near
<farz z
y
ynearz y<
!"#$%&!'()*+),-
!".$+.%(-
!"/01-
x* = − nearz
x
y* = − naerz
y
z* = − far + near2
−far near
z
51
透視変換
!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
求め方は 後述
透視深度
<near
<farz <near <far
near
far
O z O
<1
1
53
視錐台による透視投影変換行列
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
画角をもとにした透視投影変換行列
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
視野変換 視点の位置や視線の方向を変更する
56
視野変換
視野変換前
O x
y
z
視野変換後
O x
y
z
<z
57
視点の移動
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
視線の回転
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
回転の変換行列
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
視野変換行列
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
各変換行列の使い方
Mm : モデリング変換行列(パーツごとの拡大・縮小,回転,平行移動等)
Mv M p: 視野変換行列 : 投影変換行列
Pl Nl: ローカル座標系の座標値 : ローカル座標系の法線ベクトル
Mc =M pMvMm Pc =McPl
Pw =MmPl
G = adj Mm( )( )T Nw =GNl(要正規化)
62
宿題
• 次の変換行列を求めて引数の配列変数 m に格納する関数を作成してください. • 透視投影変換行列を求める関数 perspective() • 視野変換行列を求める関数 lookat() • 関数の仕様はひな形プログラムを参照のこと
• https://github.com/tokoik/ggsample03
• 透視投影変換行列と視野変換行列の積を,シェーダプログラムの uniform 変数 mc に格納してください.
• バーテックスシェーダにおいて,頂点座標に uniform 変数 mc をかけてください.
• main.cpp と simple.vert をメールに添付してください. • 送り先 [email protected]
第2回の宿題の図形を視野変換と透視投影変換を行って描いてください
63
結果
このような画像が表示されれば,多分,正解です.
64