350 likes | 521 Views
Animációk. 4. előadás. Félév menete. ANIMÁCIÓ. modellezés. Virtuális világ modell. képszintézis. v il ág = s ík. Metafórák: 2D rajzolás. Animáció = időfüggés. Nézeti transzformáció (kamera pozíció, orientáció, látószög, vágósík). T 1 (t). T V (t). T 2 (t). Transzformációk
E N D
Animációk 4. előadás Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2014
ANIMÁCIÓ modellezés Virtuális világ modell képszintézis világ = sík • Metafórák: • 2D rajzolás
Animáció = időfüggés Nézeti transzformáció (kamera pozíció, orientáció, látószög, vágósík) T1(t) TV(t) T2(t) • Transzformációk • mozgás • alak • szín • megjelenítési attribútumok, stb • kameranézet
Valós idejű animáció Legalább 15 ciklus másodpercenként Óra inicializálás (tstart) do t = Óra leolvasás Nézeti transzformáció: TV = TV(t) for each object o: modellezési transzf TM, o = TM, o(t) endfor Képszintézis while (t < tend)
Folyamatás mozgatás - OpenGL • Követelmények: • animáció folyamatosan fusson (azaz a felhasználó-nak ne kelljen minden lépésnél „léptetni”) • a rendszer reagáljon a felhasználói beavatkozásra (pl leállítás, lövés…) • nem jó egyszerű végtelen ciklus-hurok! • Megoldás: • olyan ciklus, amely felváltva hajt végre egy-egy lépést a rendszer eseménykezelő hurkából és a program szimulációs hurkából
GLUT • Üresjárati eseménykezelő függvény: • glutIdleFunc(myIdleFunc) • Idő lekérdezés: • glutGet(GLUT_ELAPSED_TIME) • Minta program: long oldTime; void IdleFunc(void) { long newTime=glutGet(GLUT_ELAPSED_TIME); myStepFunction(newTime-oldTime); oldTime=newTime; }
Képszintézis és megjelenítés • Animációs hurok: képek előállítása és megjelenítése ciklikusan ismételve • Inkrementális képszintézis eljárások villogáshoz vezethetnek (képet fokozatosan építjük fel) • Megoldás: két külön rasztertár • Egyikben készül a kép, míg a másikat jelenítjük meg • Új képkocka megjelenítése: a két rasztertár gyors kicserélése Rasztertár 1. monitor Rasztertár 2.
Dupla buffer animációhoz (GLUT) Inicializálás: glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glClear(GL_COLOR_BUFFER_BIT); rajzol… glutSwapBuffers( ); Rasztertár 1. monitor Rasztertár 2.
Valószerű mozgás • Fizikai 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 dt2 F/m = r = rL d2 dt2 TM(t) 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 • Mozgás = a transzformációs elemek időbeli változtatása • Tetszőleges pozíció+orientáció megadható az alábbi mátrixszal: • De az orientáció (A mátrix) szabadsági foka csak 3! • szabályos orientáció: sorvektorok egymásra merőleges egységvektorok TM(t)= a11a12 a13 0 a21a22 a23 0 a31a32 a33 0 pxpypz 1
TM(t): Mozgástervezés • TM(t) mátrixelemek nem függetlenek! • Tervezés független paraméterek terében pozíció: px, py, pz orientáció: , , p(t)=[px, py, pz, , , ](t) TM(t)= 1 cos sin -sincos 1 1 1 1 px, py, pz, 1 cos sin -sincos 1 1 cos -sin 1 sin cos 1
Orientáció tervezés – gondok… • Változó orientáció-animálás a , , csavaró-billentő-forduló szögek független interpolációjával • PRO: minden pillanatban érvényes orientációt kapunk • KONTRA: képzeletbeli tengelyek körül forgatunk, ezért a mozgás nem lesz valósszerű • a paraméterek egyenletes változtatása egyenetlen mozgást eredményez, a képzeletbeli tengelyek láthatóvá válnak • megoldás: interpoláció kvaterniókkal • (érdeklődőknek részletek: Szirmay-Kalos László et. al. „Háromdimenziós grafika, animáció és játékfejlesztés” 312 oldal – lásd könyvtárban)
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 • pl: origóból (vx , vy) kezdősebességgel kilőtt lövedék mozgása x(t)=vx t , y(t) =vyt - g t2/2 • kulcsokból interpolációval: keyframeanimation • görbével indirekt módon: pathanimation • mechanikai modellből az erők alapján: physicalanim. • mérésekből: motioncaptureanimation
4D Stúdió - MTA SZTAKI http://vision.sztaki.hu/4Dstudio/ Forrás: Geometriai Modellezés és Számítógépes Látás laboratórium
vi+1 vi Interpoláció: 3-d rendű spline r(t) = ai (t-ti )3 + bi (t-ti ) 2 + ci (t-ti )1 + di ha ti ≤t<ti+1 r(ti) = ri, r(ti+1) = ri+1 r’(ti) = vi r’(ti+1) = vi+1 ri+1 r1 rn r0 ri t1 t0 ti ti+1 tn • C2 folytonosság követelményéből: spline • Ismeretlen vi -k meghatározása: • ri’’(ti+1)= ri+1’’(ti+1) + sebesség a kezdő és végpontban • bonyolult lineáris egyenletrendszer megoldását igényli • Tervezési paraméterek alapján: Kohanek-Bartels, Catmull-Rom • Feladjuk a C2 folytonosság követelményét a görbeszegmensek • kapcsolódási pontjaiban • Legalább szép sima legyen a pálya…
vi Catmull-Rom „spline” r(t) = ai (t-ti )3 + bi (t-ti ) 2 + ci (t-ti )1 + di ha ti ≤t<ti+1 Sebességek előírása: r’(ti) = vi r’(ti+1) = vi+1 vi+1+vi 2(ri+1 -ri) ai= – (ti+1 -ti )2 (ti+1 -ti )3 ri+1 ri-1 3(ri+1 –ri) vi+1 + 2vi – bi= rn (ti+1 -ti )2 (ti+1 -ti ) r0 ri ci= vi t0 ti-1 ti ti+1 tn di= ri ri+1 -ri ri -ri-1 1 2 vi = + ti+1 -ti ti -ti-1
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 vektorFrenet keretek: zm = r’(t) zm = r’(t) xm = zm up xm = zmr’’(t) =r’(t) r’’(t) ym = zmxmym = zmx A függőleges, amerre az erő hat
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 ÜtközésDetektál F(r,v,t) erő Középpont helyzete: r+v·t m 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’ -n(v·n) v v’ = [v - n(v·n)]-[n(v·n)·bounce]
Folytonos-Diszkrét ütközés detektáláspontra és féltérre n ·(r(t) - r0) > 0 r(ti) Sugár indul: r+v·t v n ·(r(t) - r0) = 0 r(ti+1) metszés: t* Ha t* < dt Collision n ·(r(t) - r0) < 0
Ferde hajítás Mozgás+ gravitáció: v(t+t)=v(t)+g∙t r(t+t)=r(t)+v(t)∙t v=g∙t 2 F0 7 1 3 v(0)=v0 Fg=mg 8 6 4 Fg=mg … 5 Rugalmas ütközés: lásd előbb
Vízszintes rugón mozgó labda F(t)=-l(t)∙D a(t)=F(t)/m v(t+t)=v(t)+a(t)∙t r(t+t)=r(t)+v(t)∙t D: rugóállandó l(t): megnyúlás t-ben Labda Rugó center l(t)
Golyók ütközése • Lendület megmaradás: • m1v1+m2v2=m1u1+m2u2 • Mechanikai energia megmaradás • 1/2 m1v12+ 1/2 m2v22= 1/2 m1u12+ 1/2 m2u22 v1 u1 v2 u2 Megoldás: (m1-m2)v1+2m2v2 (m2-m1)v2+2m1v1 u1= u2= m1+m2 m1+m2
Ferde ütközés v1┴= u1┴ v2┴= u2┴ m1v1II+m2v2II=m1u1II+m2u2II ½ m1v21II+ ½ m2v22II= ½ m1u21II+ ½ m2u22II v2 v1 v2 v2┴ v2II
Ütközés detektálás háromszög-háromszög gyorsítás: befoglalók O(n2)
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 cossin 0 -sin cos 0 00 1 1 0 0 0 1 0 0l1 1 0 0 0 1 0 pxpy1
Robot példa Robot T0 T1, T2, T3 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 glPushMatrix(); glTranslatef(xv, yv, zv); glRotatef(angle, 1, 0, 0); glScalef(1, 4, 1); // 1x4x1 cube DrawCube( ); glPopMatrix(); … Másik kéz, lábak, fej, törzs glPopMatrix(); } Robot Arm1 Arm2 Head Torso
up forward „Inverz kinematika” T0 = előrehaladás (forward, up) ??? T2 = forgatás (ang) 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));