TBSK03 Teknik för avancerade Datorspel Representation av rotation Eulervinklar Rotation kring axlarna (t.ex. Zyx) A' = Ryaw Rpitch Rroll A 1/17 Representation av rotation Eulervinklar Rotation kring axlarna (t.ex. Zyx) A' = Ryaw Rpitch Rroll A Intuitivt, fast svårt att göra 1/17 Representation av rotation Eulervinklar Rotation kring axlarna (t.ex. Zyx) A' = Ryaw Rpitch Rroll A Intuitivt, fast svårt att göra Interpolation av rotation nontrivialt, problem med nonlinearbeteende 1/17 Representation av rotation Eulervinklar Rotation kring axlarna (t.ex. Zyx) A' = Ryaw Rpitch Rroll A Intuitivt, fast svårt att göra Interpolation av rotation nontrivialt, problem med nonlinearbeteende Problem med gimbal lock kan förekomma 1/17 Representation av rotation Gimbal lock 2/17 Representation av rotation Gimbal lock 2/17 Representation av rotation Gimbal lock 2/17 Representation av rotation Andra möjligheter Orthonormal matris enkelt att kombinerar olika operationer (rotation, translation mm) Separat rotationsaxel och vinkel 3-komponent vektor (nästan som quaternion) längd=vinkel 3/17 Representation av rotation Andra möjligheter Orthonormal matris enkelt att kombinerar olika operationer (rotation, translation mm) Separat rotationsaxel och vinkel 3-komponent vektor (nästan som quaternion) längd=vinkel Men hur gör man interpolation? 3/17 Kvarternioner Upphittat av Sir William Rowan Hamilton Letade efter tredimensionella komplexa tal 4/17 Kvarternioner Upphittat av Sir William Rowan Hamilton Letade efter tredimensionella komplexa tal Bortglömt, men comeback på senare 1900-tal Används för rotationen inom (rymd)flyget, robotik mm 4/17 Kvarternioner 5/17 Definition: Kvaternion q = w + xi + yj + zk, med w,x,y,z reela tal Kvarternioner 5/17 Definition: Kvaternion q = w + xi + yj + zk, med w,x,y,z reela tal Alternativ: q = (w,n) med n tredimensionell vektor (w reel, n imaginär delen) Kvarternioner 5/17 Definition: Kvaternion q = w + xi + yj + zk, med w,x,y,z reela tal Alternativ: q = (w,n) med n tredimensionell vektor (w reel, n imaginär delen) Kan ochså betraktas som en rotation med vinkel v om en valfri axel n q=(cos(v/2),sin(v/2)n) q reprensenterat som rotation med vinkel v om axel n Rotation med kvarternioner Vektor r: Skapa Kvaternion p = (0,r) Kan nu roteras meddels: p' = q · p · q* 6/17 Rotation med kvarternioner Vektor r: Skapa Kvaternion p = (0,r) Kan nu roteras meddels: p' = q · p · q* Kan enkelt kombinera rotationer 6/17 Räkna med kvarternioner Flerdimensionell generalisering av komplexa tal i² = j² = k² = ijk = -1 7/17 Räkna med kvarternioner Flerdimensionell generalisering av komplexa tal i² = j² = k² = ijk = -1 Flesta operationer funker som vanligt, fast ingen kommunitativitet på multiplikation qp pq 7/17 Räkna med kvarternioner Multiplikation med imaginärdelen 1 i j k 1 1 i j k i i -1 -k j j j k -1 -i k k -j i -1 8/17 Räkna med kvarternioner Multiplikation av två kvanterjoner: (w1 + x1i + y1j + z1k)(w2 + x2i + y2j + z2k) = w1w2 − x1x2 − y1y2 − z1z2 + (w1x2 + x1w2 + y1z2 − z1y2)i + (w1y2 − x1z2 + y1w2 + z1x2)j + (w1z2 + x1y2 − y1x2 + z1w2)k 9/17 Räkna med kvarternioner Konjugat q*: q=(w,n), q*=(w,-n) = (w, - xi, - yj, - zk) 10/17 Räkna med kvarternioner Konjugat q*: q=(w,n), q*=(w,-n) = (w, - xi, - yj, - zk) Magnitude: |q|² = qq* = q*q = w² + |n|² = w² + x² + y² + z² 10/17 Räkna med kvarternioner Konjugat q*: q=(w,n), q*=(w,-n) = (w, - xi, - yj, - zk) Magnitude: |q|² = qq* = q*q = w² + |n|² = w² + x² + y² + z² Kvadratrot från magnitude = norm 10/17 Räkna med kvarternioner Konjugat q*: q=(w,n), q*=(w,-n) = (w, - xi, - yj, - zk) Magnitude: |q|² = qq* = q*q = w² + |n|² = w² + x² + y² + z² Kvadratrot från magnitude = norm Enhetskvaternjon: kvaternion med norm=1 Erhålles genom att dela kvaternion med norm 10/17 Räkna med kvarternioner Konjugat q*: q=(w,n), q*=(w,-n) = (w, - xi, - yj, - zk) Magnitude: |q|² = qq* = q*q = w² + |n|² = w² + x² + y² + z² Kvadratrot från magnitude = norm Enhetskvaternjon: kvaternion med norm=1 Erhålles genom att dela kvaternion med norm Inverse: 10/17 Räkna med kvarternioner Som matris: Kvaternioner kan konverteras till matris genom: alt.: 11/17 Räkna med kvarternioner 12/17 Men hur kommer vi från rotationsrepresentation till matris? Om T w= 0: = Räkna med kvarternioner Men hur kommer vi från rotationsrepresentation till matris? Om T w= 12/17 0: = Men: problem om T är nästan noll (t.ex. rotationer om 1800) Räkna med kvarternioner Möjlig lösning: w = sqrt( max( 0, 1 + a + e + m) ) / 2 x = sqrt( max( 0, 1 + a - e - m) ) / 2 y = sqrt( max( 0, 1 - a + e - m) ) / 2 z = sqrt( max( 0, 1 - a - e + m) ) / 2 13/17 Räkna med kvarternioner Möjlig lösning: w = sqrt( max( 0, 1 + a + e + m) ) / 2 x = sqrt( max( 0, 1 + a - e - m) ) / 2 y = sqrt( max( 0, 1 - a + e - m) ) / 2 z = sqrt( max( 0, 1 - a - e + m) ) / 2 Teckenkorrektur x = copysign( x, h - f ) y = copysign( y, c - g ) z = copysign( z, d - b ) med copysign(a, b) = a · sign(a) · sign(b) 13/17 Räkna med kvarternioner Exponentialfunktioner: Vi definerar för q = (cos(v/2), sin(v/2)n): qt = (cos(tv/2),sin(tv/2)n) 14/17 Räkna med kvarternioner Exponentialfunktioner: Vi definerar för q = (cos(v/2), sin(v/2)n): qt = (cos(tv/2),sin(tv/2)n) Dessutom för q= (w,tn): exp(q) = ew(cos(t), sin(t)n) <=> q = R exp((0,n)t), med |n| = 1, R=1 för enhetskvarternion 14/17 Räkna med kvarternioner Exponentialfunktioner: Vi definerar för q = (cos(v/2), sin(v/2)n): qt = (cos(tv/2),sin(tv/2)n) Dessutom för q= (w,tn): exp(q) = ew(cos(t), sin(t)n) <=> q = R exp((0,n)t), med |n| = 1, R=1 för enhetskvarternion log(q) = (log(R), nt) <=> qt = exp(t log(q)) 14/17 Interpolation m. kvarternioner: Slerp Spherical linear interpolation slerp(t, q1, q2) = (q2 q1-1)t q1 15/17 (med q1,q2 valfri kvarternioner, t interpolationssteg som är en reel tal mellan 0 t.o.m. 1) Interpolation m. kvarternioner: Slerp Spherical linear interpolation slerp(t, q1, q2) = (q2 q1-1)t q1 15/17 (med q1,q2 valfri kvarternioner, t interpolationssteg som är en reel tal mellan 0 t.o.m. 1) q = (q2q1-1)t q1 = q1(q1-1q2)t = q2(q2-1q1)1-t = (q1q2-1)1-t q2 Interpolation m. kvarternioner: Slerp Spherical linear interpolation slerp(t, q1, q2) = (q2 q1-1)t q1 15/17 (med q1,q2 valfri kvarternioner, t interpolationssteg som är en reel tal mellan 0 t.o.m. 1) q = (q2q1-1)t q1 = q1(q1-1q2)t = q2(q2-1q1)1-t = (q1q2-1)1-t q2 Interpolera med konstant hastighet Interpolation m. kvarternioner: Slerp Problem: Vid interpolation mellan flera kvaternioner med slerp blir det diskontinuitet i hastigheten när vi byter från ett kvaternionpar till nästa 16/17 Interpolation m. kvarternioner: Slerp Problem: Vid interpolation mellan flera kvaternioner med slerp blir det diskontinuitet i hastigheten när vi byter från ett kvaternionpar till nästa Samma problem om interpolation mellan punktpar 16/17 Interpolation m. kvarternioner: Squad Lösning (liknar Bézier el. Hermite splines): Definerar: squad(t,a,p,q,b) = slerp(2t(1-t), slerp(t,a,b), slerp(t,p,q)), med a,b,q,b kvarternioner, t interpolationssteg 17/17 Interpolation m. kvarternioner: Squad Lösning (liknar Bézier el. Hermite splines): Definerar: squad(t,a,p,q,b) = slerp(2t(1-t), slerp(t,a,b), slerp(t,p,q)), med a,b,q,b kvarternioner, t interpolationssteg för att få kontinuitet vid interpolation: qi = aiexp(-(log(ai+1ai-1) + log(ai-1ai-1))/4) och interpolera med squad(t, ai, qi, qi+1, ai+1) 17/17 Frågor? Länkar Wikipedia: http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation Bok om matematik inom datorgrafik: http://books.google.com/books? id=bfcLeqRUsm8C&lpg=PA86&ots=FpUpf6p_hw&dq=quat ernions%20in%20computer %20graphics&pg=PA88#v=onepage&q=quaternions%20in %20computer%20graphics&f=false Slerp paper: http://dl.acm.org/citation.cfm?doid=325334.325242