Eksplisiittiset menetelmät Implisiittiset menetelmät Suora ja käänteinen kinematiikka Motion capture Elokuvamaisuus
Animaatio Peleissä tärkeimmät animoitavat kohteet ovat pelihahmot, etenkin avatar Animointi on vaikeaa: kuluu joko paljon muistia tai paljon laskentatehoa mutta erityisesti työlästä saada luonnolliseksi Eksplisiittiset menetelmät: jokainen frame on tallennettuna sellaisenaan (2d: bittikartat, 3d: kaikkien kulmapisteiden sijainnit) Implisiittiset menetelmät: lasketaan liike lennossa
Menetelmät Eksplisiittisissä menetelmissä etuna yksinkertaisuus ja vähäinen laskenta Haittapuolena muistinkulutus Implisiittisissä vastaavasti paljon hankalaa laskentaa, mutta säästöä muistinkulutuksessa Implisiittisten etuna myös sovellettavuus eri tilanteisiin, esim. interaktio erilaisten esineiden kanssa
Eksplisiittiset menetelmät
Eksplisiittiset menetelmät Yksinkertaisin menetelmä: tallennetaan jokaista kuvaa kohti kolmioverkon kaikki pisteet Ajastimella pidetään huoli, että animaatio etenee, piirrettäessä vain valitaan oikea versio Pitää varmistaa, että animaatio etenee oikeaa vauhtia myös frame raten vaihdellessa Joudutaan valitsemaan valmiista versioista se, joka parhaiten vastaa tämänhetkistä tilannetta Tasaisempi animaatio interpoloimalla
Keyframet Keyframe-tekniikassa tallennetaan tarkat koordinaatit harvemmin kuin joka framella (esim. joka 5. tai 10. frame) Morph target tai per-vertex animation Näistä tallennetuista keyframeista interpoloidaan kolmioverkko lopuille frameille Interpolointi voi olla lineaarista tai hienostuneempaa (Bezier, Hermite,...) Hahmojen muoto ei säily Käytetty paljon kasvoihin
Keyframet Mitä tiheämmin keyframeja on, sitä parempi laatu, mutta sitä enemmän muistia kuluu Toisaalta tarvittu tiheys riippuu liikkeestä: nopea liike vaatii suurempaa tiheyttä kuin hidas Jos on käytössä riittävän tiheä animaatiodata, voidaan laskea virhearvojen perusteella datasta riippuvat keyframet automaattisesti Toisaalta animoija voi asettaa haluamansa keyframet manuaalisesti sopiviin kohtiin
Tag-järjestelmät Kombinatorinen räjähdys: jos hahmolla on esim. eri kävelytyylejä, aseita ja ilmeitä, erilaisia yhdistelmiä on paljon Oikeasti nämä ovat osittain riippumattomia Tag-järjestelmissä hahmo jaetaan eri osiin, joista kullekin on omat animaationsa, ja osat liitetään toisiinsa jopa vain yhdestä pisteestä Mahdollistaa esim. kustomoitavat varusteet Jatkuvuusongelmat
Implisiittiset menetelmät Implisiittisissä menetelmissä lasketaan kulmapisteiden sijainnit lennossa liikkeen kuvauksen perusteella Etuna mm. sopeutuminen maastoon ja muihin erilaisiin tilanteisiin, vähäinen muistinkäyttö, saman datan käyttö erilaisille hahmoille Hankalampaa ja sisältää enemmän laskentaa rinnakkaistuu hyvin GPU:lla tehtäväksi Hahmosta yleensä käytössä luurankomalli Skeletal animation, rigging
Implisiittiset menetelmät Implisiittisen animaation voi toteuttaa kahdella lähestymistavalla Suorassa kinematiikassa (forward kinematics, FK) lasketaan sijainnit juuresta (esim. lantio) alkaen, ja edetään lopulta sormiin ja varpaisiin Käänteisessä kinematiikassa (inverse kinematics, IK) lähdetään esim. käden sijainnista ja lasketaan, missä asennossa nivelten täytyy olla tämän tavoiteen saavuttamiseksi
Implisiittiset menetelmät FK sopii hyvin yhteen motion capturen kanssa FK on myös laskennallisesti helpompi kuin IK IK sopii hyvin tilanteisiin, joissa hahmon täytyy esimerkiksi ojentaa käsi tarttumaan johonkin esineeseen IK ei tuota esim. realistista kävelyä, joten yksi mahdollisuus on käyttää molempia FK:lla suuret liikkeet ja IK:lla yksityiskohdat
Kvaterniot Kvaterniot ovat matemaattinen konstruktio, joita käytetään esittämään 3d-avaruuden rotaatioita Kompleksilukujen laajennos neljään komponenttiin Etuja: ei gimbal lockia, 4 < 9 (matriisi), interpolointi Kvaternio on muotoa iq x + jq y + kq z + q w, tai toisin [q, q w ], missä q = [q x q y q z ] Tässä tarvittavat operaatiot: kertolasku (ks. kaava muualta), normi (pituus, kuin 4d-vektorille), konjugaatti q* = [-q, q w ] (= inverssi yhden mittaisille eli yksikkökvaternioille)
Kvaterniot Yksikkökvaternio voidaan tulkita 3d-rotaatioksi 3d-rotaatiohan on φ radiaania akselin u ympäri vastaava kvaternio q = [sin φ/2 u, cos φ/2] Rotaation sovellus pisteeseen p: lisätään p:n 4. komponentiksi 0 nyt p' = qpq*, missä * on konjugaatti ketjut: p' = rqpq*r* rotatoi ensin q:lla, sitten r:llä Rotaatiomatriisista kvaternioksi ja takaisin helppo muuntaa
Luurankoanimaatio Tyypillisin FK:n muoto on luurankoanimaatio Nivelten yhdistämät luut muodostavat hierarkian, jonka juurena on yleensä lantio Juuri (lantio) on esim. mallikoordinaatiston origossa suorassa Niveliin sisältyy asentoa suhteessa sen vanhempaan kuvaava muunnos; matriisi tai SQT (scale-quaternion-translation) Esim. säären asento saadaan lähtemällä lantiosta, kertomalla lonkkanivelen muunnoksella ja sitten polven muunnoksella Kullekin nivelelle voidaan siis laskea muunnos suhteessa juureen yhdistämällä vanhempien muunnokset Saadaan kullekin nivelelle muunnos, joka siirtää koordinaatiston nivelen kohdalle oikeaan asentoon
Luurankoanimaatio
Luurankoanimaatio Yksinkertaisimmillaan kunkin luun ympärillä on kiinteä kolmioverkko Tällöin osat eivät sovi saumattomasti yhteen Siispä usein käytetään yhtenäistä ihoa, jossa kunkin kulmapisteen sijaintiin voi vaikuttaa enemmän kuin yksi nivel (skinning) kullekin lista nivelistä painokertoimineen Kolmioverkko tallennetaan perusasennossa bind pose, tyypillisesti T:n näköinen asento
Luurankoanimaatio Nivelten perusasentoa vastaavien muunnosmatriisien (M B ) inverssit tallennetaan (ne ovat vakiomatriiseja) muunnosmatriisia voi ajatella koordinaatistomuunnoksena nivelen koordinaatistosta mallikoordinaatistoon inverssi muuntaa tällöin mallikoordinaatistosta kyseisen nivelen koordinaatistoon Tiedossa kulmapisteen sijainti v B mallikoordinaatistossa perusasennossa; tarvitaan sijainti uudessa asennossa koordinaatti on vakio nivelen omassa koordinaatistossa muunnetaan perusasennosta nivelen koordinaatistoon inverssillä ja siitä uuteen asentoon sen muunnosmatriisilla: v C = M C M B -1 v B (vain M C muuttuu joka framella)
Animaatiopätkät Toisin kuin elokuvissa, peleissä animaatiot on pakko koostaa pienistä pätkistä (clip), joita yhdistellään sopivasti syklit (kävely), toimet (heitto, kompastuminen) Aika ei välttämättä mene synkronissa todellisen ajan kanssa: nopeutus, hidastus, interpolointi pätkän aikaa kuvataan usein muuttujalla u = 0...1 (vrt. tekstuurit) pätkä voi sisältää metadataa synkronointia varten (käynnistä ääni, muuta valaistusta)
Animaatioiden yhdistäminen Usein on tarpeen animoida hahmoa monella eri pätkällä samaan aikaan: sekoittaminen interpoloimalla (blending) saman animaation keyframejen välillä sujuva vaihdos kahden animaation välillä (cross-fading) kikat, esim. eri loukkaantumisasteet välillä kävely/ontuminen Käytännössä tehdään lineaarinen interpolointi eli LERP luonnollisen näköinen tulos vaatii, että tehdään kullekin nivelelle erikseen (lisäetu: rinnakkaistuu hyvin) ei onnistu matriiseille, joten käytetään usein SQT:itä kvaternioille myös SLERP onnistuu helposti Cross-fading jatkuva/pysäytetty; lineaarinen/kuutiollinen Perusasentojen kautta kulkemalla voi pärjätä ilman sekoittamista
Kasvot Eläytymistä parantaa huomattavasti, jos hahmojen ilmeet saadaan esitettyä uskottavasti Samat tekniikat: Eksplisiittiset keyframet Implisiittinen luurankoanimaatio Luurankoversiossa voidaan käyttää kymmeniä luita pelkästään kasvoihin Myös huulten synkronisointi puheeseen tärkeää Äänteitä kymmeniä, joten pitää yksinkertaistaa
Käänteinen kinematiikka IK:ssa aloitetaan rajoitteista: yleensä hierarkian lehtisolmun sijainti ja suunta tunnetaan, ja täytyy selvittää muiden luiden asennot, joissa rajoite toteutuu Analyyttisissä menetelmissä ratkaistaan tilannetta kuvaavia yhtälöitä, mutta ne eivät toimi aina Iteratiivisissa menetelmissä etsitään likimääräisiä ratkaisuja kokeilemalla
Analyyttinen IK Jos niveliä on vähän, tilanne voidaan kuvata yhtälöillä, jotka voidaan ratkaista Esim. yksittäinen käsi Ihmisen nivelten rajoitteet täytyy ottaa huomioon: käsi ei taivu miten tahansa Yhtälöillä ei välttämättä tasan yhtä ratkaisua Kaikkiin asentoihin ei pääse (ratkaisua ei ole) Joihinkin asentoihin ratkaisuja on äärettömästi
Iteratiivinen IK Iteratiivisia menetelmiä on monenlaisia Esimerkki: Cyclic coordinate descent (CCD) Aloitetaan hierarkian viimeisestä luusta Käännetään se osoittamaan kohti kohdetta Edetään hierarkiassa ylöspäin, ja käännetään seuraava luu osoittamaan kohti kohdetta Näin edetään juureen asti; sitten aloitetaan taas alusta ja iteroidaan kunnes asento on löytynyt Välivaiheita ei piirretä
Yhdistelmät Kuten ehkä esimerkistä huomattiin, IK:n käyttäminen koko kehoon voi tuottaa epäluonnollisia tuloksia FK ja IK voidaan yhdistää monin tavoin Esim. alkuasento FK:sta, ja tarkka käden ja jalan sovitus maastoon ja esineisiin IK:sta IK:ssa voidaan rajoittaa ylempänä hierarkiassa olevien nivelten kääntymistä
Motion capture Pelien budjettien kasvaessa elokuvista tuttu motion capture -tekniikka on tullut suosituksi Studiossa näyttelijään kiinnitetään esim. valopisteitä, joita havainnoidaan kameroilla Saadaan valopisteiden 3d-sijainnit Jos valopisteet vastaavat luurankomallin luita, voidaan FK:n avulla helposti animoida erilaisia hahmoja Tulos hyvin luonnollisen näköinen
Motion capture
Animaation lisäksi Hyvältä näyttäviin pelihahmoihin tarvitaan nykyään muutakin kuin pelkkä animaatio Hiukset lyhyet voi tehdä esim. tuhansilla polygoneilla, joista jokaisen tekstuurissa useita hiuksia pitkissä hiuksissa tarvitaan fysiikkaa Vaatteet: fysiikka + luurankoanimaatio Iho: subsurface scattering olennainen Silmät jne.
Elokuvamaisuus Elokuvamaisuus (engl. cinematography) on elokuvien kuvaamisen tiedettä ja taidetta Peleissä pyritään usein elokuvamaiseen ilmaisuun ja tunnelmaan Esimerkiksi kameran tekniikasta johtuvaa sumeutta lisätään peleihin tarkoituksellisesti Kamerakulmien automaattinen valinta on erittäin hankala ongelma
First person Kaiken kaikkiaan kameralla on 6 mahdollista vapausastetta: sijainti (x, y, z) ja suunta (yaw), kallistuma (roll), nousukulma (pitch) Yksinkertaisin kuvaustapa on first person: näytetään se, mitä avatar näkee FP-kameralla yleensä 3-5 vapausastetta x ja z sekä suunta (y-akselin ympäri) lähes aina yleensä myös y ja nousukulma
First person Liikettä ei kannata toteuttaa vakionopeudella, vaan kiihtyvyyden avulla Jos kääntymis- tai liikkumisnappi on pohjassa, nostetaan oikean suuntaista nopeutta (maksimiin asti) Jos nappi ei ole pohjassa, hidastetaan vähitellen esim. kertomalla vakiolla (<1)
Third person Third person -kamera seuraa avataria sen ulkopuolelta, jolloin kuvakulman valinta saa elokuvamaisia piirteitä Avatar näkyvissä: animointi vs. samastuminen Elokuvissa kuvakulmat voidaan suunnitella etukäteen ja kuvaaja on ajatteleva ihminen Ei toimi peleissä Automatiikka tai pelaajan ohjaama kamera Toisaalta teknisiä rajoitteita kameran sijainnille ei ole
Third person Kamera sijoitetaan yleensä avatarin taakse yläpuolelle usein keskitetään avatarin katseen suuntaan, jota taas ohjataan hiirellä/tatilla kamera voi joutua seinään, välissä voi olla este Nopea liike saa kameran piirtämään laajan kaaren, mistä voi seurata matkapahoinvointia Ratkaisu: kohdistuspiste on vain tavoite, jota kohti kamera kääntyy riittävän hitaasti Interpoloidaan kulmia pallon pinnalla (SLERP)
Kameratyypit Elokuvallista ilmaisua varten pelintekijälle voi olla avuksi hyödyntää elokuva-alan (suhteellisen) pitkää kokemusta Kameratyyppien matkiminen: kiinteä, dolly, nosturi, steadycam Kuvakulmat: lähikuva, rintakuva, jne. Kameratekniikka: aukkoluvut, polttovälit jne. Myös muita yhteneväisyyksiä kuin kamerat: äänimaailma, valaistus,...
Liikkuva kamera Yksi mahdollisuus on tehdä liikkuva kamera, jonka sijainti päätellään dynaamisesti olennaisten asioiden pitää olla ruudun alueella asiat eivät saa peittää toisiaan liikaa tärkein kohde suunnilleen keskellä Ei pidä kuitenkaan liikuttaa ja vaihtaa kameraa turhaan, jottei pelattavuus kärsi esim. kameran vaihtuminen muuttaa ohjaussuuntia
Liikkuva kamera Liikkuvaa kameraa varten valitaan tärkeät kohteet: avatar, muut lähellä olevat hahmot ja tärkeimmät vuorovaikutukselliset esineet Etsitään kameralle etäisyys, jolla kohteiden rajauslaatikot ovat kokonaan kuvassa Näin saadaan pallopinta, jolta voidaan valita kameran sijainti esim. minimoimalla kohteiden peittoon jäämistä Tosin silloin yleisin kulma olisi suoraan ylhäältä