ゲームグラフィックス特論 第4回
DESCRIPTION
四元数,線形補間,曲線補間TRANSCRIPT
¿ØоÓ͸ǽÄW~�c4-�0G (2)�
,�H�-�©��¦�¤�
2
,�HÙ½»ØÆ˼×Ú�
• vhH©r�¶�O�¨D;�¡¯©
• 2o�
q̂ = qx,qy,qz,qw( ), qv = qx,qy,qz( )⇒ q̂ = qv,qw( )
q̂ = qv,qw( ) = iqx + jqy + kqz + qw = qv + qwqv = iqx + jqy + kqz( ) = qx,qy,qz( )i2 = j2 = k2 = ijk = −1jk = −kj = i, ki = −ik = j, ij = − ji = k
qw: 3��qv: r��i, j, k: rH&��
3
,�H©rH&�©��©¹ÑØÃ�
i
j
k
ij
4
,�H©Ue�
• a�
q̂r̂ = iqx + jqy + kqz + qw( ) irx + jry + krz + rw( )= i qyrz − qzry + rwqx + qwrx( )+ j qzrx − qxrz + rwqy + qwry( )+k qxry − qyrx + rwqz + qwrz( )+qwrw − qxrx − qyry − qzrz= qv × rv + rwqv + qwrv,qwrw −qv ⋅ rv( )
5
,�H©a©Á×ÎÕÀØÊ�
/* !** p <- q * r !*/ !void qmul(float *p, const float *q, const float *r) !{ ! p[0] = q[1]*r[2] - q[2]*r[1] + r[3]*q[0] + q[3]*r[0]; ! p[1] = q[2]*r[0] - q[0]*r[2] + r[3]*q[1] + q[3]*r[1]; ! p[2] = q[0]*r[1] - q[1]*r[0] + r[3]*q[2] + q[3]*r[2]; ! p[3] = q[3]*r[3] - q[0]*r[0] - r[1]*q[1] - q[2]*r[2]; !} !
6
,�H©Ue�
• +
• �=
• ÌÕÐ
• &���
q̂+ r̂ = qv,qw( )+ rv, rw( ) = qv + rv,qw + rw( )
( ) ( )wvwv qq ,,ˆ ** qqq −==
( ) 2222** ˆˆˆˆˆ wzyx qqqqn +++=== qqqqq
( )1,ˆ 0i =
7
���
• ÌÕÐ
• °²Û��ª�
( ) 2*
1
ˆˆˆqqqn
=−
( )( )
1ˆˆˆ
ˆˆˆ*
* =⇔=qqq
qqqn
n
8
,�H©�:¦R��
• �=©�:
• ÌÕЩ�:�
• a©R� • m<@
• l(©R��
( )( )( ) ***
***
**
ˆˆˆˆ
ˆˆˆˆ
ˆˆ
qrrq
rqrq
=
+=+
=
( ) ( )( ) ( ) ( )rqrq
qqˆˆˆˆ
ˆˆ *
nnnnn
=
=
( )( ) rqrprqp
rpqprqpˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
tstststs
+=+
+=+
( ) ( )rqprqp ˆˆˆˆˆˆ =
9
&�,�H�
• ÌÕÐ�Ý©,�H
• ��¥
• �±¨�
( ) ( ) φφφφ cossincos,sinˆ1ˆ +==⇒= qqn uuqq
( )wv q,ˆ qq = ¦�³¦��
n q̂( ) = n sinφ uq, cosφ( )= sin2φ uq ⋅uq( )+ cos2φ = sin2φ + cos2φ =1
qu ª� ©Ï½ÉÕÙ&�ϽÉÕÚ�1 = q u
10
cos�+ i sin� = ei� ˆq = sin� uq + cos� = e�uq
&�,�H©5H¦EH�
• 5H
• EH�
( ) ( ) qqe uq u φφ == logˆlog
( ) tte qtt
qt q φφφφ φ cossincossinˆ +==+= uuq u
11
&�,�H¨°³0G�
• V¡ªÏ½ÉÕ
• ,�H¦�¤C�
• &�,�H
• -�©0G
• &�,�H¥ª�q-1 = q* §©¥
p = px, py, pz, pw( )
( )( )zyxv
wv
pppp,,
,ˆ=
=
ppp
( )φφ cos,sinˆ quq =
: p ¶�uq ¶�¨x8�2φ -��
*1 ˆˆ qq =− q̂��¥�
&�,�H�
ª�
q̂−¦�)�-�¶�±µ��
q̂ ª�
12
uq
φ"φ"
ˆ�p�
ˆ�p�́�
p̂0 = q̂p̂q̂�1
p̂0 = q̂p̂q̂⇤
9N��?©-��
13
ˆqx
(✓) =
✓sin
✓
2
, 0, 0, cos✓
2
◆
= i sin✓
2
+ cos
✓
2
ˆqy(✓) =
✓0, sin
✓
2
, 0, cos✓
2
◆
= j sin✓
2
+ cos
✓
2
ˆqz(✓) =
✓0, 0, sin
✓
2
, cos✓
2
◆
= k sin✓
2
+ cos
✓
2
�¦-�x�±&�,�H¶Q®³�/* !** q <- �(x, y, z) x8(a) !*/ !void qmake(float *q, float x, float y, float z, float a) !{ ! float l = x * x + y * y + z * z; !! if (l != 0.0f) { ! float s = sin(a *= 0.5f) / sqrt(l); !! q[0] = x * s; ! q[1] = y * s; ! q[2] = z * s; ! q[3] = cos(a); ! } !} !
14
}��
• ϽÉÕ�(ux, uy, uz) = (0, 1, 0) ¶�¨�π / 2 -��³-�¶t�,�H�q̂ ¶Q®§��Ü
• ϽÉÕ�p̂ = (1, 0, 0, 0,) ¶�q̂ ¨°£¤-��¡lM�r̂ = q̂p̂q̂* ¶Q®§��Ü�
¦�³Ü�
15
ˆq = iqx
+ jqy
+ kqz
+ qw
= sin ✓ (iux
+ iuy
+ iuz
) + cos ✓
cos
⇡4 = sin
⇡4 =
1p2
&�,�H¨°³0G©(B�
• q -��¤�±K¨�r -��³
• �¡�£¤&�,�H©a�����¯-�¶t��
( )( ) ( ) ( ) ( )***
**
ˆˆˆˆˆˆˆˆˆˆ
ˆˆˆˆˆ
qrpqrrqpqr
rqpqr
==
r̂q̂
(B¨°²|6�ia�¤¯Pw$�´«�-��¥�³�¦ª�¡´³ ÙPw$�³¨ªÌÕÐ¥!³ → ϽÉÕ©Pw$¦)�§©¥f&Ú�
16
&�,�H�±-�0Gs�¶e��
§©¥&�,�H¥ª�©°�¨&g$¥�³���¥�
17
Mq =
0
BB@
1� s(q2y
+ q2z
) s(qx
qy
� qw
qz
) s(qz
qx
+ qw
qy
) 0s(q
x
qy
+ qw
qz
) 1� s(q2z
+ q2x
) s(qy
qz
� qw
qx
) 0s(q
z
qx
� qw
qy
) s(qy
qz
+ qw
qx
) 1� s(q2x
+ q2y
) 00 0 0 1
1
CCA
Mq =
0
BB@
1� 2(q2y
+ q2z
) 2(qx
qy
� qw
qz
) 2(qz
qx
+ qw
qy
) 02(q
x
qy
+ qw
qz
) 1� 2(q2z
+ q2x
) 2(qy
qz
� qw
qx
) 02(q
z
qx
� qw
qy
) 2(qy
qz
+ qw
qx
) 1� 2(q2x
+ q2y
) 00 0 0 1
1
CCA
q̂ = (qx
, qy
, qz
, qw
)
s = 2/n(q̂)
&�,�H�±-�0Gs�¶>³�
/*!** -�0Gs��m <- &�,�H�q!*/!void qrot(! float *m, const float *q)!{! float xx = q[0] * q[0] * 2.0f;! float yy = q[1] * q[1] * 2.0f;! float zz = q[2] * q[2] * 2.0f;! float xy = q[0] * q[1] * 2.0f;! float yz = q[1] * q[2] * 2.0f;! float zx = q[2] * q[0] * 2.0f;! float xw = q[0] * q[3] * 2.0f;! float yw = q[1] * q[3] * 2.0f;! float zw = q[2] * q[3] * 2.0f;!!
m[ 0] = 1.0f - yy - zz;! m[ 1] = xy + zw;! m[ 2] = zx - yw;! m[ 4] = xy - zw;! m[ 5] = 1.0f - zz - xx;! m[ 6] = yz + xw;! m[ 8] = zx + yw;! m[ 9] = yz - xw;! m[10] = 1.0f - xx - yy;! m[ 3] = m[ 7] = m[11] =! m[12] = m[13] = m[14] = 0.0f;! m[15] = 1.0f;!}!
18
]�s��±,�H¬©0G�
( ) ( ) ( )( ) ( ) ( )( ) ( ) ( )
!!!!!
"
#
$$$$$
%
&
+−+−
−+−+
+−+−
=
!!!!!
"
#
$$$$$
%
&
=
1000021220221202221
22
22
22
33323130
23222120
13121110
03020100
yxxwzyywxz
xwzyxzzwyx
ywxzzwyxzy
qqqq
qqqq
qqqq
qqqq
q
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
mmmmmmmmmmmmmmmm
M
tr Mq( ) = miiq
i=0
3
∑ =m00q +m11
q +m22q +m33
q = 4− 4 qx2 + qy
2 + qz2( ) = 4qw2
19
]�s��±,�H¬©0G�
qw =12tr Mq( )
4qx2 = +m00
q −m11q −m22
q +m33q
4qy2 = −m00
q +m11q −m22
q +m33q
4qz2 = −m00
q −m11q +m22
q +m33q
�³�ª�
20
qx =m21
q −m12q
4qw
qy =m02
q −m20q
4qw
qz =m10
q −m01q
4qw
�³Ï½ÉÕ¶�©Ï½ÉÕ¨�q��³-�(2)
t
s u
p
s× t = sin2φ = 2sinφ cosφ2φ"
( )φφ cos,sinˆ uq =
q̂ = sinφsin2φ
s× t, cosφ"
#$
%
&'=
12cosφ
s× t, cosφ"
#$
%
&'
=1
2 1+ e( )s× t,
2 1+ e( )2
"
#
$$
%
&
''
u = s× ts× t
s ⋅ t = cos2φ = e
cosφ = 1+ e2
21
�³Ï½ÉÕ¶�©Ï½ÉÕ¨�q��³-�©s�t{�
R s, t( ) =
e+ hux2 huxuy −uz huzux +uy 0
huxuy +uz e+ huy2 huyuz −ux 0
huzux −uy huyuz +ux e+ huz2 0
0 0 0 1
"
#
$$$$$$
%
&
''''''
u = ux uy uz( ) = s× ts× t
e = cos2φ = s ⋅ t
h = 1− cos2φsin2 2φ
=1− eu ⋅u
q̂ = qv,qw( ) = 12 1+ e( )
s× t,2 1+ e( )2
"
#
$$
%
&
''
22
�·ËÑØÂÒ×�J�¶C��
23
�·ËÑØÂÒ×�
• �0G¨°³·ËÑØÂÒ× • <X©0<¶µ§�
• �0G�
t t( ) = P t( )(¼¹ÓØ0G¶��/()�
E h, p, r( ) =Ry h( )Rx p( )Rz r( )⇓
R t( ) =Ry h t( )( )Rx p t( )( )Rz r t( )( )
M = R t0T 1
!
"#
$
%&= I t
0T 1!"#
$%& R 00T 1
!
"#
$
%&
t: �n� R: -��
I: &�s��
24
Y.J�©'>�
• ÂÄÈЩJz�±J�¶>³ • ��¥ª�glfwSetTime(), glfwGetTime() ¶�[�³
const double cycle(5.0); !… !// k�J�©ÔÅÇÉ !glfwSetTime(0.0); !… !// º¸×ʺ���¤�³��²��F\�³�while (window.shouldClose() == GL_FALSE) !{ !��… !��// J�©zTÙ*LÞ_Ú!��float t((float)(fmod(glfwGetTime(), cycle) / cycle)); !��… !
25
m<u��
P t( ) = P0 1− t( )+P1t
P0
P1
P(t)
t
26
7s`#©0Gs�¶Q®³�
/* !** 7s`#0Gs�¶Q®³ !*/ !void translate(float *m, float x, float y, float z) !{ ! m[ 3] = x; m[ 7] = y; m[11] = z; ! m[ 0] = m[ 5] = m[10] = m[15] = 1.0f; ! m[ 1] = m[ 2] = m[ 4] = ! m[ 6] = m[ 8] = m[ 9] = ! m[12] = m[13] = m[14] = 0.0f; !} !
27
2V�¶]m`#�³0Gs�¶>³�/* !** 7s`#·ËÑØÂÒש0Gs�¶Q®³ !*/ !void linearMotion( ! float *m, const float *p0, const float *p1, float t) !{ ! float x = (p1[0] - p0[0]) * t + p0[0]; ! float y = (p1[1] - p0[1]) * t + p0[1]; ! float z = (p1[2] - p0[2]) * t + p0[2]; ! translate(m, x, y, z); !} !
28
Cubic Hermite Spline�
P t( ) = P0 2t3 −3t2 +1( )+m0 t3 − 2t2 + t( )
+P1 −2t3 +3t2( )+m1 t
3 − t2( )P0
P1P(t)
tm0
m1
29
Catmull-Rom Spline�• Cubic Hermite Spline ¨��¤�
m0 =P1 −P−12
m1 =P2 −P02
30
P0
P1P(t)
t m0 m1
P-1P2
Catmull-Rom Spline ©Á×ÎÕÀØÊ�/* !** Catmull-Rom Spline !*/�static float catmull_rom( ! float x0, float x1, float x2, float x3, float t) !{ ! float m0 = (x2 - x0) * 0.5f, m1 = (x3 - x1) * 0.5f; !! return (((2.0f * x1 - 2.0f * x2 + m0 + m1) * t ! - 3.0f * x1 + 3.0f * x2 - 2.0f * m0 - m1) * t ! + m0) * t + x1; !} !
31
Catmull-Rom Spline ¨°³u��/* !** Catmull-Rom Spline ¨°³V�©u�!*/�void interpolate( ! float *p, ! const float *p0, const float *p1, ! const float *p2, const float *p3, ! float t) !{ ! p[0] = catmull_rom(p0[0], p1[0], p2[0], p3[0], t); ! p[1] = catmull_rom(p0[1], p1[1], p2[1], p3[1], t); ! p[2] = catmull_rom(p0[2], p1[2], p2[2], p3[2], t); !} !
32
Kochanek-Bartels Spline�• Cubic Hermite Spline ¨��¤�
si =1− t( ) 1+ b( ) 1− c( )
2Pi −Pi−1( )+
1− t( ) 1− b( ) 1+ c( )2
Pi+1 −Pi( )
di =1− t( ) 1+ b( ) 1+ c( )
2Pi −Pi−1( )+
1− t( ) 1− b( ) 1− c( )2
Pi+1 −Pi( )
Pisi di+1Pi+1
Pi-1
m0 m1
si+1di
Pi+2
t: Tension b: Bias c: Continuity�
33
,�H©m<u��
q̂t = 1− t( ) q̂0 + tq̂n, t ∈ 0,1[ ]q̂t=0 = q̂0q̂t+Δt = 1− t +Δt( )( ) q̂0 + t +Δt( ) q̂n
= 1− t( ) q̂0 + tq̂n +Δt q̂n − q̂0( )= q̂t +Δq̂ qn� q0�qt�qt+�t�
Δq̂ = Δt q̂n − q̂0( )��¥�
34
Z�m<u��(Slerp) ( ) ( ) [ ]1,0,ˆˆˆ,ˆ,ˆˆ 1 ∈= − tt tqqrrqs
( )( ) rrqs
qrqsˆ,ˆ,ˆˆ1ˆ,ˆ,ˆˆ0
→⇒→
→⇒→
tttt
( ) ( ) ( )( ) ( )rqrqrqs ˆsinsinˆ
sin1sin,ˆ,ˆ,ˆ,ˆˆ
φφ
φφ tttt +
−==slerp
( )
( )21
ˆˆ1sin
ˆˆcos
ˆˆcos
rq
rq
rq
⋅−=
⋅=
+++=⋅=−
φ
φ
φ wwzzyyxx rqrqrqrq
q̂
r̂
( )t,ˆ,ˆˆ rqs
35
Z�m<u�©Á×ÎÕÀØÊ�
#include <cmath> !!/* !** p ← q ¦�r ¶ t ¥u��*/ !void slerp(float *p, !����������const float *q, !����������const float *r, !����������const float t) !{ !��float�qr #= q[0] * r[0] !
#+ q[1] * r[1] !#+ q[2] * r[2] !#+ q[3] * r[3]; !
float ss #= 1.0f - qr * qr; !!
if (ss == 0.0) { ! p[0] = q[0]; ! p[1] = q[1]; ! p[2] = q[2]; ! p[3] = q[3]; ! } !��else { !����float sp = sqrt(ss); !����float ph = acos(qr); !����float pt = ph * t; !����float t1 = sin(pt) / sp; ! ���float t0 = sin(ph - pt)�/ sp; ! !����p[0] = q[0] * t0 + r[0] * t1; !����p[1] = q[1] * t0 + r[1] * t1; !����p[2] = q[2] * t0 + r[2] * t1; !����p[3] = q[3] * t0 + r[3] * t1; ! } !} !!
36
2��©,�H©u��
( )itii −= + ,ˆ,ˆˆ 1qqq Slerp[ ]1ˆ,ˆ +ii qq%�� ¨��¤�
37
,�H©ÄÎÓ¹×u��
( ) ( )
( )( ) ( ) ( )( )tttt
t
iiii
iiii
iiiiii
−
="#$
%&' +−=
++
++
+−
−−
12,,ˆ,ˆ,,ˆ,ˆ,ˆ,ˆ,ˆ,ˆ4
ˆˆlogˆˆlogexpˆˆ
11
11
11
11
aaqqaaqq
qqqqqa
slerpslerpslerpsquad
iq̂
1ˆ −iq
1ˆ +iq
38
4��
• O©ÎÖ¾ÓЪm\©bI�¶7s`#�³·ËÑØÂÒ׶t^��Ü • https://github.com/tokoik/ggsample04
• �©�V¥bI�¶ (1, 0, 0) ¶�¨ 1 Ó÷×-��Û ��±jV¨��¤ (0, 0, 1) ¶�¨ 2 Ó÷×-��¡XA¨p³-�©·ËÑØÂÒ׶"�¤�¢��Ü • �¦-�x�±&�,�H¶Q®³�H¶ B�¤�¢��Ü
• &�,�H¶Z�m<u��³�H¶ B�¤�¢��Ü
• &�,�H�±-�0Gs�¶Q®³�H¶ B�¤�¢��Ü
• main.cpp ¶ÑØÕ¨S��¤�¢��Ü • �²��[email protected]�
Z�m<u�¶�£¤·ËÑØÂÒר-�©·ËÑØÂÒ׶"�¤�¢���
39
lM�
�©°�§\��t^�´´«Û1�ÛPy¥�Ü�
40