Animáció Szirmay-Kalos László
Animáció = időfüggés T1(t) TV(t) T2(t) Transzformációk alak szín megjelenítési attribútumok, stb
Valós idejű animáció Óra inicializálás (tstart) do t = Óra leolvasás Legalább 15 ciklus másodpercenként Óra inicializálás (tstart) do t = Óra leolvasás for each object o: modellezési transzf TM, o = TM, o(t) Nézeti transzformáció: TV = TV(t) Képszintézis while (t < tend)
Valószerű mozgás Fizikai törvények: Fiziológiai törvények Newton törvény ütközés detektálás és válasz: impulzus megmaradás Fiziológiai törvények csontváz nem szakad szét meghatározott szabadságfokú ízületek bőr rugalmasan követi a csontokat Energiafelhasználás minimuma
Newton törvény m d2 F/m = r dt2 = rL d2 TM(t) dt2 r(t) = rL TM(t) Az erő rugalmas mechanizmuson keresztül hat, azaz folytonosan változik TM(t) C2 folytonos
TM(t): Mozgástervezés Követelmény: ált. C2 , néha (C1,C0) folytonosság Mátrixelemek nem függetlenek Tervezés független paraméterek terében pozíció: px, py, pz orientáció: , , skálázás: sx, sy, sz p(t) TM(t)= sx sy sz 1 cos sin -sin cos 1 cos -sin 1 sin cos 1 px, py, pz, 1 1 cos sin -sin cos
Mozgástervezés a paramétertérben p(t) elemei ált. C2 , néha (C1,C0) folytonosak p(t) elemeinek a definíciója: görbével direkt módon (spline) képlettel: script animation kulcsokból interpolációval: keyframe animation görbével indirekt módon: path animation mechanikai modellből az erők alapján: physical animation mérésekből: motion capture animation
Keyframe animáció 5.key 4.key 2.key 1. key 3.key
Keyframe animáció görbéi
Görbék megváltoztatása
Interpoláció: 3-d rendű spline ri(t) = ai t3 + bi t2 + cit 1 + di ri(ti) = ri, ri(ti+1) = ri+1 ri’(ti) = vi ri’(ti+1) = vi+1 vi vi+1 Ismeretlen vi -k meghatározása: C2 folytonosság követelményéből: spline ri’’(ti+1)= ri+1’’(ti+1) + sebesség a kezdő és végpontban Tervezési paraméterek alapján: Kohanek-Bartels, Catmull-Rom ri+1 r1 rn r0 ri t0 t1 ti ti+1 tn
Kohanek-Bartels (Catmull-Rom) „spline” = -1 ri+1 = 0 Catmull-Rom = 1 ri-1 rn vi r0 ri (1-) tension paraméter t0 ti-1 ti ti+1 tn ri+1 - ri ri - ri-1 1 2 vi = + =0.9 =0.1 ti+1 - ti ti - ti-1 =0.5 (1-)
Keyframe animáció
Pálya (path) animáció t = spline paraméter vagy az ívhossz lokális modellezési transzf: y = fix z = görbe der. x = vektor t = spline paraméter vagy az ívhossz
Pálya animáció: Transzformáció ym r(t) görbe: xm xm0(t) 0 ym0(t) 0 zm0(t) 0 r(t) 1 TM = r(t) zm Explicit up vektor Frenet keretek: zm = r’(t) zm = r’(t) xm = z up xm = r’(t) r’’(t) ym = z x ym = z x A függőleges, amerre az erő hat
Ívhossz szerinti mozgás ds ívhossz dz = dz/du ·du r(u) görbe: u s(u) = (dx/du)2 +(dy/du)2 +(dz/du)2 du s(u) Ívhossz szerinti mozgás Megtett út-idő függvény: s(u) = f(t), például a·t u = s-1(f(t)) r = r(u) u f(t) t
Pálya animáció
Fizikai animáció Erők (gravitáció, turbulencia stb.) Tömeg, tehetetlenségi nyomaték (F = ma) Ütközés detektálás (metszéspontszámítás) Ütközés válasz rugók, ha közel vannak impulzus megmaradás alapján
Egy kis mechanika dr/dt = v dv/dt = F(r,v,t)/m -n(v·n) ÜtközésDetektál F(r,v,t) erő m sugár: r+v·t v dr/dt = v dv/dt = F(r,v,t)/m metszés: t* Ha t* < dt Collision for( t = 0; t < T; t += dt) { F = Erők számítása a = F/m v += a ·dt if ( ÜtközésDetektál ) ÜtközésVálasz r += v ·dt } ÜtközésVálasz n = CollisionNormal v’ v -n(v·n) v’ = [v - n(v·n)]-[n(v·n)·bounce]
Folytonos-Diszkrét ütközés detektálás pontra és féltérre n ·(r - r0) > 0 r(ti) sugár: r+v·t v n ·(r - r0) = 0 metszés: t* Ha t* < dt Collision r(ti+1) n ·(r - r0) < 0
Ütközés detektálás háromszög-háromszög gyorsítás: befoglalók O(n2)
Real-time fizikai animáció Konyha Zoltán (autoszimulátor)
Karakter animáció rL rw rw = rL · Rkéz·Talkar·Rkönyök·Tfelkar·Rváll·Tgerinc·Tember homogén koordináta 4-es
2D csont l px,py x, y, 1 cos sin 0 1 0 0 0 1 0 0 l 1 -sin cos 0 1 0 0 0 1 0 0 l 1 cos sin 0 -sin cos 0 0 0 1 1 0 0 0 1 0 px py 1
Robot példa Robot T0 T1, T2, T3 T0 = robot előrehalad Head Torso Leg1 Leg2 Arm1 Arm2 T0 = robot előrehalad glTranslatef(xr, yr, zr); T1= kar elhelyése glTranslatef(xv, yv, zv); T2= forgatás glRotatef(angle, 1.0f, 0.0f, 0.0f); T3= skálázás glScalef(1.0f, 4.0f, 1.0f); T2 T1 T0 T3
Robot rajzolás + animáció void DrawRobot(float dt) { xr += vx*dt; yr += vy*dt; zr += vz*dt; glPushMatrix(); glTranslatef(xr, yr, zr); angle += av*dt; if (angle>30 || angle<-30) av*=-1; glColor3f(1, 0, 0); // red glRotatef(angle, 1, 0, 0); glScalef(1, 4, 1); // 1x4x1 cube DrawCube( ); glPopMatrix(); … Másik kéz, lábak, fej, törzs } Robot Arm1 Arm2 Head Torso
„Inverz kinematika” T0 = előrehaladás (forward, up) ??? T2 = forgatás (ang) forward up leg A láb (end effektor) földön legyen és ne csúszkáljon forward += leg * fabs(sin(angNew) - sin(angOld)); up = leg * (1 - cos(angNew));
Csontváz felépítése E = (x, y, z, , , ) end effektor Állapotvektor = egyes ízületek állapota S = (px, py, pz, , , )|i=1..n Strukturális összefüggés: E = F( S )
2 szabadságfokú rendszer 2 l1 l2 S = (1,2) E = (x, y) 1 Strukturális összefüggés: x(1,2) = l1 cos 1 + l2 cos(1 + 2) y(1,2) = l1 sin 1 + l2 sin(1 + 2)
Forward kinematika … S(t) interpolációval E(t) = F ( S(t) ) karakter állapot beállítás: S1, E1 karakter állapot beállítás: S2, E2 … karakter állapot beállítás: Sn, En S(t) interpolációval E(t) = F ( S(t) )
Forward kinematika eredmény
Inverz kinematikával … E(t) interpolációval S = F-1( E(t) ) karakter állapot beállítás: S1, E1 karakter állapot beállítás: S2, E2 … karakter állapot beállítás: Sn, En E(t) interpolációval S = F-1( E(t) )
Inverz kinematika eredmény
Inverz kinematika: S = F-1(E) Az F strukturális függvény általában nem invertálható analitikusan és az inverz nem egyértelmű: ITERATÍV MEGOLDÁS t0-ra E0 , S0 ismert ha Et , St ismert, számítsuk Et+dt = Et+dEt, St+dt = St+dS F S1 F Sn Et+dEt = F(St+dS ) = F(St)+ dS1 +…+ dSn F1 S1 F1 Sn dEt,1 dS1 ... Jacobi-mátrix m x n lineáris egyenletrendszer ... ... = ... ... Fm S1 Fm Sn dEt,m ... dSn
m x n-es egyenletrendszerek megoldása dEm = Jmxn ·dSn általában n > m Jnxm · dEm = Jnxm Jmxn ·dSn (Jnxm Jmxn)-1 Jnxm ·dEm = dSn T T T T J+ = Jnxm pseudo inverze: a lehetséges megoldásokból egyet választ, amely az állapotvektor változási sebességét minimalizálja
Inverz kinematika megoldás E = E0 , S = S0 for( t = t0; t < T; t += dt ) { S alapján a transzformációs mátrixok előállítása Képszintézis J(S) Jacobi mátrix számítása J+ = J pseudo-inverze E(t+dt) interpolációval (keyframe) dE = E(t+dt) - E(t) dS = J+ ·dE S += dS }
Példa: 2 szabadságfokú rendszer 2 x(1,2) = l1 cos 1 + l2 cos(1 + 2) y(1,2) = l1 sin 1 + l2 sin(1 + 2) l1 l2 1 E = (x, y) S = (1,2) J(1 , 2 ) Jacobi mátrix dx -l1 sin 1 - l2 sin(1 + 2) -l2 sin(1 + 2) d1 = dy l1 cos 1 + l2 cos(1 + 2) l2 cos(1 + 2) d2
Bőrözés
Merev és sima bőrőzés
Példa: sétáló mozgás
Teljes,ciklikus séta
Egyszerű karakteranimáció
Motion Capture animáció
Sztereo látás v1 X1, Y1 c2 P = vrp + X/XMAX u + Y/YMAX v c1 + (P1-c1) · t1 = [x, y, z] c2 + (P2-c2) · t2 = [x, y, z] 6 egyenlet, 5 ismeretlen (x, y, z, t1, t2) Hiba: kitérő egyenesek c1 P1 P2 u1 W = [x, y, z] vrp1 c, u, v, vrp meghatározása: kamera kalibráció
Motion capture eredmény Minden markerre: pozicióadatok x t y z M1 M2 M2 M3 x t y M3 cos=(M3-M2)0 ·(M2-M1)0 tengely: d=(M3-M2) x (M2-M1) M4 t z t
Valóságos és virtuális világok képi illesztése: kamera
Valóságos és virtuális világok képi illesztése Blaskó Gábor
Kamera kalibráció v c (X,Y) (x, y, z) f u (x, y, z) (X,Y) vrp Ismeretlenek: vrp, f, u, v 3 + 1+2+2 = 8
Kompozitálás Blaskó Gábor