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

40

Upload: kohe-tokoi

Post on 15-Nov-2014

1.229 views

Category:

Education


2 download

DESCRIPTION

四元数,線形補間,曲線補間

TRANSCRIPT

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

¿ØоÓ͸ǽÄW~�c4-�0G (2)�

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

,�H�-�©��¦�¤�

2

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

,�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

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

,�H©rH&�©��©¹ÑØÃ�

i

j

k

ij

4

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

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

,�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

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

,�H©Ue�

• +

• �=

• ÌÕÐ

• &���

q̂+ r̂ = qv,qw( )+ rv, rw( ) = qv + rv,qw + rw( )

( ) ( )wvwv qq ,,ˆ ** qqq −==

( ) 2222** ˆˆˆˆˆ wzyx qqqqn +++=== qqqqq

( )1,ˆ 0i =

7

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

���

• ÌÕÐ

• °²Û��ª�

( ) 2*

1

ˆˆˆqqqn

=−

( )( )

1ˆˆˆ

ˆˆˆ*

* =⇔=qqq

qqqn

n

8

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

,�H©�:¦R��

• �=©�:

• ÌÕЩ�:�

• a©R� • m<@

• l(©R��

( )( )( ) ***

***

**

ˆˆˆˆ

ˆˆˆˆ

ˆˆ

qrrq

rqrq

qq

=

+=+

=

( ) ( )( ) ( ) ( )rqrq

qqˆˆˆˆ

ˆˆ *

nnnnn

=

=

( )( ) rqrprqp

rpqprqpˆˆˆˆˆˆˆˆˆˆˆˆˆˆ

tstststs

+=+

+=+

( ) ( )rqprqp ˆˆˆˆˆˆ =

9

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

&�,�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

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

&�,�H©5H¦EH�

• 5H

• EH�

( ) ( ) qqe uq u φφ == logˆlog

( ) tte qtt

qt q φφφφ φ cossincossinˆ +==+= uuq u

11

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

&�,�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̂⇤

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

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

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

�¦-�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

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

}��

• ϽÉÕ�(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

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

&�,�H¨°³0G©(B�

•  q -��¤�±K¨�r -��³

• �¡�£¤&�,�H©a�����¯-�¶t��

( )( ) ( ) ( ) ( )***

**

ˆˆˆˆˆˆˆˆˆˆ

ˆˆˆˆˆ

qrpqrrqpqr

rqpqr

==

r̂q̂

(B¨°²|6�ia�¤¯Pw$�´«�-��¥�³�¦ª�¡´³ ÙPw$�³¨ªÌÕÐ¥!³ → ϽÉÕ©Pw$¦)�§©¥f&Ú�

16

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

&�,�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̂)

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

&�,�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

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

]�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

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

]�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

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

�³Ï½ÉÕ¶�©Ï½ÉÕ¨�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

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

�³Ï½ÉÕ¶�©Ï½ÉÕ¨�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

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

�·ËÑØÂÒ×�J�¶C��

23

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

�·ËÑØÂÒ×�

•  �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

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

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

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

m<u��

P t( ) = P0 1− t( )+P1t

P0

P1

P(t)

t

26

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

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

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

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

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

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

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

Catmull-Rom Spline�• Cubic Hermite Spline ¨��¤�

m0 =P1 −P−12

m1 =P2 −P02

30

P0

P1P(t)

t m0 m1

P-1P2

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

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

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

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

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

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

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

,�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

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

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

( )t,ˆ,ˆˆ rqs

35

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

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

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

2��©,�H©u��

( )itii −= + ,ˆ,ˆˆ 1qqq Slerp[ ]1ˆ,ˆ +ii qq%�� ¨��¤�

37

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

,�H©ÄÎÓ¹×u��

( ) ( )

( )( ) ( ) ( )( )tttt

t

iiii

iiii

iiiiii

="#$

%&' +−=

++

++

+−

−−

12,,ˆ,ˆ,,ˆ,ˆ,ˆ,ˆ,ˆ,ˆ4

ˆˆlogˆˆlogexpˆˆ

11

11

11

11

aaqqaaqq

qqqqqa

slerpslerpslerpsquad

iq̂

1ˆ −iq

1ˆ +iq

38

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

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

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

lM�

�©°�§\��t^�´´«Û1�ÛPy¥�Ü�

40