3D animaatio: liikekäyrät ja interpolointi Tommi Tykkälä
Läpivienti Keyframe-animaatio Lineaarisesta interpoloinnista TCB-splineihin Bezier-käyrät Rotaatioiden interpolointi Kameran animointi Skenegraafit Luurankomallit
Keyframe-animaatio Jokaisen asennon mallintaminen käsin on hyvin työlästä Keyframe-animaation perusideana on määritellä pelkästään animoitavan kappaleen ääriasennot Ääriasentojen väliset asennot on mahdollista interpoloida
Ääriasentojen määrittely Ääriasennot määriteltävä siten, että väliasennot on mahdollista laskea Paikka on helppo tapaus, määriteltävissä vektorina <x,y,z> Rotaatio on hankalampi, matriiseja ei voi interpoloida suoraan! Eulerin teoreema: Kaikki rotaatiot mahdollista esittää yhtenä kiertona jonkun akselin ympäri Esitysmuoto <kiertokulma, kiertoakseli> kirjoitettavissa kvaterniona q Kvaternioita voi interpoloida
Interpolointi Tarkoittaa väliarvojen laskemista päätepisteistä Lineaarinen interpolointi: L(t) = (1-t)*P1 + t*p2 t on aikaparametri joka määritellään välille [0,1]eR Lineaarinen interpolointi tuottaa kulmikasta liikettä! 3. asteen polynomeilla mahdollista tuottaa riittävän kaarevia liikekäyriä
3. asteen liikekäyrä Pitäisi määrätä kertoimet 3. asteen polynomille L(t) = at 3 + bt 2 + ct + d Tunnetaan päätepisteet P 1 ja P 2 : L(0) = P 1, L(1) = P 2. 4 tuntematonta, 2 rajoitetta ei mahdollista ratkaista vielä Määritellään käsin tangettivektorit T 1 ja T 2 päätepisteille 4 tuntematonta, 4 rajoitetta yksikäsitteinen ratkaisu olemassa
Kertoimien laskeminen L(t) = at 3 + bt 2 + ct + d (1) L(0) = d = P 1 (2) L(1) = a+b+c+d = P 2 (3) L (0) = c = T 1 (4) L (1) = 3a+2b+c = T 2 (5) => a = (T 2 T 1-2b)/3 (6 4&5) => a+b+t 1 +P 1 = P 2 (7 2&3&4) => b = P 2 -T 1 -P 1 -(T 2 -T 1-2b)/3 (8 6&7) => 3b = 3P 2-3T 1-3P 1 -T 2 +T 1 +2b (9 8) => b = 3P 2-2T 1-3P 1 -T 2 (10 9) => a = (T 2 -T 1-2(3P 2-2T 1-3P 1 -T 2 ))/3 (11 6&10) => a = (T 2 +T 1-2P 2 +2P 1 ) (12 11) Tulos: L(t) = (2P 1-2P 2 +T 1 +T 2 )*t 3 + (3P 2-2T 1-3P 1 -T 2 )*t 2 + T 1 *t + P 1 Ryhmitellään uudelleen: L(t) = (1-3t 2 +2t 3 )*P 1 + (t-2t 2 +t 3 )*T 1 + (-t 2 +t 3 )*T 2 + (3t 2-2t 3 )*P 2
Automaattinen tangenttien generointi Catmull-Rom splinissä tangentit määräytyy suoraan interpoloitavasta pistejonosta T = (P next P prev )/2 Tuottaa ihan hyviä käyriä, mutta ei säätövaraa! Kuva Kochanek-Bartels artikkelista Interpolating Splines with Local Tension, Continuity and Bias Control
Kochanek-Bartels -splinit Käytetään myös nimeä TCB-splinit T=tension, C=continuity, B=bias Määrittelee jokaiselle liikekäyrän avainpisteelle kaksi tangenttia:sisääntuleva ja ulosmenevä! Sisääntuleva vaikuttaa edelliseen liikekäyrän segmenttiin Ulosmenevä vaikuttaa seuraavaan liikekäyrän segmenttiin T,C ja B säätelee tangenttien pituuksia ja suuntia
TCB-splinit ovat Catmull- Romin laajennus Catmull-Rom määrittelee tangentiksi: 0.5*(P n+1 -P n-1 ) eli 0.5*((P n+1 P n ) + (P n P n-1 )) TCB määrittelee sisääntulevan tangentin: 0.5*(1-t)(1-c)(1+b)*(P n -P n-1 ) + 0.5*(1-t)(1+c)(1-b)*(P n+1 -P n ) TCB määrittelee ulosmenevän tangentin: 0.5*(1-t)(1+c)(1+b)*(P n -P n-1 ) + 0.5*(1-t)(1-c)(1-b)*(P n+1 -P n ) t säätelee tangentin pituutta pisteen P n kohdalla c säätelee käyrän jatkuvuutta pisteen P n kohdalla b säätelee käyrän vääntymää pisteen P n kohdalla t = 0, c = 0, b = 0 Catmull-Rom
t-parametrin vaikutus Kuva Kochanek-Bartels artikkelista Interpolating Splines with Local Tension, Continuity and Bias Control
c-parametrin vaikutus Kuva Kochanek-Bartels artikkelista Interpolating Splines with Local Tension, Continuity and Bias Control
b-parametrin vaikutus Kuva Kochanek-Bartels artikkelista Interpolating Splines with Local Tension, Continuity and Bias Control
Bezier-käyrät n-asteisten polynomikäyrien perhe 3.asteen Bezier-käyrä eroaa TCB-splineistä pelkästään tangenttien määrittelyn osalta Tangenttien sijaan määritellään kontrollipisteet väliin, jotka säätelevät käyrän muotoa Tangenteilla ja kontrollipisteillä on suora yhteys: C 1 = P 1 + T 1 /3 C 2 = P 2 T 2 /3
Bezier-käyrän määrittelytapoja 3. asteen Bezier-käyrän painot pisteille P 1,C 1,C 2 ja P 2 voi määritellä: ((1-t)+t) 3 = (1-t) 3 + 3t(1-t) 2 + 3t 2 (1-t) + t 3 Huom! 1.asteen painot tuottavat lin.interpoloinnin Yleinen kaava painoille (Bernstein): 0 n ( n Cr k)*(1-t) n-k *t k Yhteys Pascalin kolmioon
de Casteliau-menetelmä Bezier-käyrän voi määritellä myös kumuloituna lineaarisena interpolointina pääte- ja kontrollipisteitä A 1 = (1-t)P 1 + tc 1 A 2 = (1-t)C 1 + tc 2 A 3 = (1-t)C 2 + tp 2 B 1 = (1-t)A 1 + ta 2 B 2 = (1-t)A 2 + ta 3 D 1 = (1-t)B 1 + tb 2 D 1 vastaa 3. asteen Bezier-käyrää de Casteliau-menetelmää voi käyttää n-asteisten Bezier-käyrien luomiseen
Käyrien parametrisoinnista Mallintaja käyttää pääsääntöisesti framemäärää ajanmittana Jos frame lkm on epäsymmetrinen keyframen suhteen tangentteja pitää muuttaa! (http://www.cubic.org/~submissive/sourcerer/hermite.htm) Jos käytetään aikaa sellaisenaan, kaikki toimii hyvin
Käyrien parametrisoinnista Aikaparametrin t käyttö sellaisenaan ei tuota tasaista liikettä! Vertaa kuljettua matkaa t kohti kun käyrä on suora tai kaareva ajan sijaan tulisi käyttää matkaa s(t), jonka voi numeerisesti integroida infinitesimaalisista matkayksiköistä
Rotaatioiden interpoloinnista Kuten alussa mainittiin, kvaterniot soveltuvat rotaatioiden interpolointiin esitysmuoto koodattavissa <kiertokulma,kiertoakseli> kvaternioksi Q 0 *Q t vastaa kvaternioiden lin. interpolointia, t e [0,1],t e R Kvaternioiden lineaarinen interpolointi ei tarkoita komponenteittain tehtyä interpolointia! Kvaternioiden interpolointi säilyttää pituuden operaatiossa ja vastaa pikemminkin lin.interpolointia 4d-pallon pinnalla
Lin. Interpolointi 4d-pallon pinnalla Slerp(q 0,q 1,t) = (q 0 sin((1-t)α) + q 1 sin(tα)) / sin(α) Huom! Jos kierrettävä kulma α on hyvin pieni jakaja lähestyy nollaa ja slerp ei toimi hyvin kannattaa käyttää lineaarista interpolointia Slerp kärsii samasta ongelmasta kuten lin. interpolointi paikallekin eli liikkeen kulmikkuus On mahdollista tehdä Bezier-interpolointia kvaternioille sen takia että slerp lin. interpolaatio joka vaaditaan de Casteliau menetelmään
Bezier-interpolaatio kvaternioille Määritellään kontrollikvaterniot C 1 ja C 2 A 1 = slerp(q 0, C 1,t) A 2 = slerp(c 1,C 2,t) A 3 = slerp(c 2,Q 1,t) B 1 = slerp(a 1,A 2,t) B 2 = slerp(a 2,A 3,t) D 1 = slerp(b 1,B 2,t) D 1 vastaa lopullista rotaatiokäyrää
Kameran animointi Kameraan liittyy sisäiset ja ulkoiset parametrit Sisäiset parametrit määräävät perspektiiviprojektion ominaisuudet kuten fov, kuvasuhde, ikkunamuunnos..) Ulkoiset parametrit määräävät kameran sijainnin ja suunnan
Kameran animointi Ulkoiset parametrit ovat keskeisiä animoinnin kannalta Sijainnin animointiin vaaditaan jono pisteitä, jonka kautta kamera kulkee Sijainnin interpolointiin kannattaa käyttää TCBsplinejä hyvän kontrolloitavuuden takia Rotaatiot esitetään kvaternioina ja interpolaatiomenetelmänä kannattaa käyttää Catmull-Romia, koska tangenttien manuaalinen säätäminen on harvoin järkevää
Kameran animointi Kun kaikki geometria on määritelty maailmakoordinaatistoon on syytä suorittaa kameramuunnos Sijainnin ja rotaation perusteella voidaan muodostaa matriisi, jolla muunnoksen saa suoritettua Muunnosmatriisi on käänteinen verrattuna objektien suhteellista paikkaa ja asentoa kuvaaviin matriiseihin
Skenegraafit Käytännössä aina kaikki geometria sijoitetaan skenegraafiin Skenegraafin solmuina on objektit Skenegraafin kaaria vastaa lin. muunnos jolla kuvataan kappaleen suhteellinen siirtymä ja rotaatio isäsolmun suhteen Kameran voi sijoittaa mihin tahansa referenssikoordinaatistoon skenegraafissa mahdollista tehdä esim. first-person vuoristorataajeluja vaunun koordinaatistossa
Skenegraafit Helppoja ja hienoja demoja saa aikaan, kun toteuttaa skenegraafi ja animointituen omaan ohjelmaan ja tekee demon mallinnusohjelmassa Kaiken koodaamalla saa tietysti koodauskokemusta
Luurankomallit Kiinteistä kappaleista koostuvat mallit liian karkeita Luurankomallien avulla mahdollista tehdä sulavaa animaatiota Erotetaan 3d-mallin geometria ja animoitava luuranko toisistaan Luuranko vastaa kiinteän kappaleen mallia Luurangon perusteella liikutetaan jokaista 3dmallin pistettä erikseen
Luurankomallit: skinning Jokainen piste assosioidaan yhden tai useamman luun lokaaliin koordinaatistoon Pisteen lopullinen paikka määräytyy painotettuna summana Mallintajan mahdollista määritellä joka pisteen painot erikseen Lopputuloksena sulava 3d-mallin animaatio