Luihin perustuva 3D-animointi tietokonepeleissä



Samankaltaiset tiedostot
3D animaatio: liikekäyrät ja interpolointi. Tommi Tykkälä

Harjoitus Bones ja Skin

Selainpelien pelimoottorit

arvostelija OSDA ja UDDI palveluhakemistoina.

Koht dialogia? Organisaation toimintaympäristön teemojen hallinta dynaamisessa julkisuudessa tarkastelussa toiminta sosiaalisessa mediassa

Tik Tietokoneanimaatio

Luento 3: 3D katselu. Sisältö

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages

Luku 8. Aluekyselyt. 8.1 Summataulukko

T Tietokoneanimaatio ja mallintaminen. Lauri Savioja Teknillinen korkeakoulu Tietoliikenneohjelmistojen ja multimedian laboratorio 02/02

Videon tallentaminen Virtual Mapista

Demo 1: Simplex-menetelmä

Luku 7: Animaatio. Eksplisiittiset menetelmät Implisiittiset menetelmät Suora ja käänteinen kinematiikka Motion capture Elokuvamaisuus

Aika/Datum Month and year Kesäkuu 2012

LAUSEKKEET JA NIIDEN MUUNTAMINEN

Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat

Maailman muutosta tallentamassa Marko Vuokolan The Seventh Wave -valokuvasarja avauksena taidevalokuvan aikaan

Matematiikan tukikurssi

Animaation tuotanto. Mika Timonen

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg

on hidastuvaa. Hidastuvuus eli negatiivinen kiihtyvyys saadaan laskevan suoran kulmakertoimesta, joka on siis

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Ohjeissa pyydetään toisinaan katsomaan koodia esimerkkiprojekteista (esim. Liikkuva_Tausta1). Saat esimerkkiprojektit opettajalta.

Algoritmit 2. Luento 2 Ke Timo Männikkö

Vektorit. Kertausta Seppo Lustig (Lähde: avoinoppikirja.fi)

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

TIEA341 Funktio-ohjelmointi 1, kevät 2008

SVINGIN KIINNITYSKOHDAT

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

2.3 Voiman jakaminen komponentteihin

Liiketaitotestit ja tuloskortti

Katsaus korruption vaikutuksesta Venäjän alueelliseen talouskasvuun ja suoriin ulkomaisiin investointeihin

Flash ActionScript osa 4

2016/06/21 13:27 1/10 Laskentatavat

Valmistelut: Aseta kartiot numerojärjestykseen pienimmästä suurimpaan (alkeisopiskelu) tai sekalaiseen järjestykseen (pidemmälle edenneet oppilaat).

Solmu 3/2001 Solmu 3/2001. Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä:

Asko Ikävalko, k TP02S-D. Ohjelmointi (C-kieli) Projektityö. Työn valvoja: Olli Hämäläinen

TEKIJÄNOIKEUSNEUVOSTO LAUSUNTO 2015:6. Tekijänoikeus kolmiulotteiseen tietokoneanimaatioon

Algoritmit 2. Luento 13 Ti Timo Männikkö

Kenguru 2012 Student sivu 1 / 8 (lukion 2. ja 3. vuosi)

Yhtälöryhmä matriisimuodossa. MS-A0004/A0006 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Algoritmit 2. Luento 2 To Timo Männikkö

ELOKUVATYÖKALUN KÄYTTÖ ANIMAATION LEIKKAAMISESSA. Kun aloitetaan uusi projekti, on se ensimmäisenä syytä tallentaa.

Kenguru 2016 Student lukiosarja

XXIII Keski-Suomen lukiolaisten matematiikkakilpailu , tehtävien ratkaisut

Algoritmit 1. Luento 9 Ti Timo Männikkö

Harjoitus Morphing. Ilmeiden luonti

1 Kertaus. Lineaarinen optimointitehtävä on muotoa:

Videon tallentaminen Virtual Mapista

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luonnontieteiden popularisointi ja sen ideologia

Tietorakenteet ja algoritmit - syksy

Datatähti alkukilpailu

Teoreettisia perusteita II

A = a b B = c d. d e f. g h i determinantti on det(c) = a(ei fh) b(di fg) + c(dh eg). Matriisin determinanttia voi merkitä myös pystyviivojen avulla:

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Viikon aiheet. Funktion lineaarinen approksimointi

Käyttöönotto-opas RT Controller

4. Luennon sisältö. Lineaarisen optimointitehtävän ratkaiseminen Simplex-menetelmä

Kurssin loppuosassa tutustutaan matriiseihin ja niiden käyttöön yhtälöryhmien ratkaisemisessa.

Yhtälöryhmä matriisimuodossa. MS-A0007 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Algoritmit 1. Luento 10 Ke Timo Männikkö

FYSP101/K1 KINEMATIIKAN KUVAAJAT

Tiedekunta/Osasto Fakultet/Sektion Faculty Valtiotieteellinen tiedekunta

Opetusmateriaali. Fermat'n periaatteen esittely

Algoritmit 1. Luento 8 Ke Timo Männikkö

Lue ohjeet huolellisesti ennen laitteen käyttöä.

Ohjelmoinnin perusteet Y Python

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 4 / vko 47

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Taulukot. Jukka Harju, Jukka Juslin

D B. Levykön rakenne. pyöriviä levyjä ura. lohko. Hakuvarsi. sektori. luku-/kirjoituspää

Algoritmit 1. Luento 3 Ti Timo Männikkö

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

763306A JOHDATUS SUHTEELLISUUSTEORIAAN 2 Ratkaisut 1 Kevät y' P. α φ

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA

Datatähti 2019 loppu

Ohjelmoinnin perusteet Y Python

Tilastollinen vastepintamallinnus: kokeiden suunnittelu, regressiomallin analyysi, ja vasteen optimointi. Esimerkit laskettu JMP:llä

PowerPoint -esitysgrafiikka

Puzzle SM Pistelasku

11.4. Rakenteellista käsittelyä tilavuusrenderöintialgoritmeissa

Muodonmuutostila hum

! #! %! & #!!!!! ()) +

NÄIN JUOSTAAN OIKEIN. Virheitä korjaamalla kohti parempaa juoksutekniikkaa

Königsbergin sillat. Königsberg 1700-luvulla. Leonhard Euler ( )

1 Kannat ja kannanvaihto

!"#$%&'$("#)*+,!!,"*--.$*#,&--#"*/".,,%0

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

Animaation tuotanto ja kuvaustekniikat peleissä

Algoritmit 2. Luento 6 To Timo Männikkö

5. Grafiikkaliukuhihna: (1) geometriset operaatiot

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

Yhteenlaskun ja skalaarilla kertomisen ominaisuuksia

Department of Mathematics, Hypermedia Laboratory Tampere University of Technology. Roolit Verkostoissa: HITS. Idea.

Transkriptio:

Luihin perustuva 3D-animointi tietokonepeleissä Tiina-Kaisa Oikarinen Helsinki 21.3.2006 Seminaarikirjoitelma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos Institution Department Matemaattis-luonnontieteellinen Tekijä Författare Author Tiina-Kaisa Oikarinen Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos Luihin perustuva 3D-animointi tietokonepeleissä Oppiaine Läroämne Subject Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Seminaarikirjoitelma 21.3.2006 13 sivua Tiivistelmä Referat Abstract Tämä seminaarikirjoitus käsittelee hahmojen kolmiulotteista animointia tietokonepeleissä. Kirjoitelmassa tarkastellaan, miten animaatioita voidaan tallentaa, animoida ja piirtää ruudulle. Esitelty tekniikka perustuu luihin, jotka muodostavat luurankoja. Luurangon asentoa on mahdollista muuttaa kohdistamalla sen luihin erilaisia muunnoksia. Luuranko kiinnitetään olemassa olevan mallin objektiverkkoon, ja sen avulla malli saadaan liikutettua eri asentoihin. Tietokonepelillä on käytössään rajallisesti resursseja, joten animaatioiden tulee viedä mahdollisimman vähän tilaa ja suoritustehoja. ACM Computing Classication System (CCS): I.3.7 [Three-Dimensional Graphics and Realism] Avainsanat Nyckelord Keywords Tietokonepelit, 3D-animointi, luut Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information

ii Sisältö 1 Johdanto 1 2 Animaatioihin liittyviä käsitteitä 2 2.1 Luurankohierarkia............................ 2 2.2 Transformaatio.............................. 3 2.3 Suunnan esittäminen 3D-avaruudessa.................. 4 2.4 Mallit ja instanssit............................ 4 3 Animaatioiden tallentaminen 5 3.1 4x3-matriisin purku ja vakioiden käyttö................. 6 3.2 Avainkuvat ja lineaarinen interpolointi................. 6 4 Animointi 8 4.1 Animaatioiden peräkkäistoisto...................... 8 4.2 Animaatioiden toistaminen........................ 9 4.3 Animaatioiden sulauttaminen...................... 10 5 Deformaatio 11 5.1 Luiden siirto maailma-avaruuteen.................... 11 5.2 Mallin perusasennon poisto....................... 12 5.3 Verteksien ja niiden normaalien muuntaminen............. 12 6 Yhteenveto 12 Lähteet 13

1 1 Johdanto Perinteinen piirretyistä elokuvista tuttu animaatio koostuu erillisistä kuvista, joita näytetään tarpeeksi nopeasti peräkkäin ja näin saadaan aikaan liikettä. Samalla periaatteella toimivat myös elokuvat, jotka koostuvat oikeasti vain pysäytyskuvista, joita näytetään nopeasti peräkkäin. Kun siirrytään 3D-maailmaan ja tietokonepeleihin perusperiaate säilyy samana. Oman lisänsä ja haasteen toteutukseen tuo kolmas ulottuvuus ja pelien käytössä olevat rajatut resurssit. Meillä on aluksi 3D-malli hahmosta, jonka mallintaja on luonut. Jotta saataisiin aikaan animoitu hahmo, tulee luoda jonkinlainen kontrollirakenne, jota muuntamalla saadaan aikaan erilaisia mallin asentoja. Useimmiten käytetään luurankoa, joka koostuu luista. Malli tulee kiinnittää jotenkin tähän luurankoon, niin että luurangon luiden vaihtaessa paikkaa myös malli seuraa mukana. Nyt meillä on keino liikuttaa mallia eri asentoihin. Luihin perustuvissa animaatiojärjestelmissä animaatio saadaan aikaan muuntamalla luurangon luita paikasta toiseen. Eri luihin kohdistuvat muunnokset saavat yhdessä aikaan mallin uuden asennon. Kun asentoja on tarpeeksi monta, malli liikkuu kolmiulotteisessa maailmassa eteenpäin. Tietokonepeleissä animoidaan usein paljon asioita. Animoitavista kohteista tärkein on yleensä pelaajan hahmo, jonka jälkeen oleellisimpia ovat muut keskeiset henkilöhahmot. Hahmojen lisäksi pelit sisältävät huomattavan paljon muita animoituja kohteita. Mitä todentuntuisempi peli pyrkii olemaan, sitä enemmän se sisältää animaatioita, sillä oikeassa maailmassa erityisesti luonnossa, kaikki on liikkeessä. Ongelmaksi muodostuu muistin vähyys. Animaatiot vievät paljon tilaa ja niitä joudutaan optimoimaan, jotta ne mahtuisivat niillä käytössä olevaan muistiin. Tietokonepelien tapauksessa joudutaankin tekemään kompromissi animaatioiden näyttävyyden ja kulutettujen resurssien välillä. Luvussa 2 käydään läpi 3D-animointiin liittyviä peruskäsitteitä. Luvussa 3 selvitetään, miten animaatiot saadaan tallennettua mahdollisimman pieneen tilaan. Luvussa 4 käsitellään animaatioiden toistamista ja sulauttamista toisiinsa. Luvussa 5 selitetään, kuinka objektiverkko deformoidaan, jotta malli voitaisiin piirtää näytölle. Luku 6 on yhteenveto. Kaikki luvut perustuvat lähteeseen [Rab05], erityisesti lukuun 5.2 Character Animation (sivut 495-537).

2 2 Animaatioihin liittyviä käsitteitä Tässä kappaleessa käydään lyhyesti läpi animointiin liittyviä keskeisiä käsitteitä, joiden ymmärtäminen on tarpeen, jos haluaa ohjelmoida animaatiojärjestelmän. 2.1 Luurankohierarkia Luuranko koostuu luista. Luurangon luut muodostavat yleensä puuhierarkian, jossa jokainen luu roikkuu vanhemmastaan. Jokaisella luulla voi olla monta lapsiluuta. Hierarkia vastaa pitkälti tosimaailman ihmisluurangon rakennetta. Jokaiseen luuhun liittyy transformaatio, joka määrittää, kuinka luun liike eroaa sen vanhemman liikkeestä. Jos luulla ei ole vanhempaa, transformaatio määrittää sen liikkeen suhteessa johonkin muuhun määriteltyyn tilaan avaruudessa. Puuhierarkian ylin luu on juuriluu (root bone), ja sillä ei ole vanhempaa. Useimmilla luurangoilla on vain yksi juuriluu, joka on yleensä lantiolla, olkapäissä tai selän puolivälissä. Animaatiot muuttavat luiden transformaatiota ajan kuluessa ja saavat aikaan liikkeen. Luiden transformaation tallentaminen suhteessa niiden vanhempaan on tehokasta. Suurin osan ihmisen liikkeestä on etenemiskinematiikkaa (forward kinematics), jossa liike siirtyy luurankohierarkiassa vanhemmilta lapsille. Toisin sanoen isoin osa liikkeestä tehdään ensin suurten luiden siirroilla ja liikkeen hienomotorisemmista osista huolehtivat pienemmät luut. Tämä on helppo toteuttaa, kun luun liike on määritelty suhteessa vanhemman liikkeeseen. Tälle vastakkainen liikerata on käänteiskinematiikka, missä viimeisen luun paikka on kiinnitetty ja hierarkiassa ylemmät luut muuttavat paikkaansa, jotta viimeinen luu pysyisi paikallaan. Esimerkiksi sormenpään pitäminen samassa kohdassa, vaikka muu keho liikkuisi eri kohtaan. Käänteiskinematiikkaa käytetään animaatioiden korjaamiseen, kun halutaan varmistaa, että kosketus maailman muihin esineisiin säilyy vaikka animaatioita sulautetaan ja vääristetään. Luiden organisaatio ja niiden liitostavat toisiinsa mallissa muodostavat kokonaisuuden, jota kutsutaan kehikoksi (rig). Kehikko ei määrittele animaatiota, sillä se ei muutu ajan myötä, mutta se vaikuttaa siihen, mitkä liikkeet ovat mahdollisia ja miten ne voidaan saada aikaan. Hahmolla voi olla useita eri kehikoita erilaisia liikekokonaisuuksia varten, esimerkiksi eri kehikko kävelyyn, akrobatiaan ja naamanilmeisiin. Animaatiojärjestelmän olisi hyvä sallia luurankojen ja kehikoiden vaihtaminen, sillä tällöin ei rajoiteta animaattorin mahdollisuuksia animoida hahmoja monipuolisesti.

3 2.2 Transformaatio Animoinnissa puhutaan usein luun suunnasta (orientation), siirrosta (translation), skaalauksesta (scale) ja vääristymästä (shear). Tämä kokoelma ominaisuuksia muodostaa luun transformaation. Transformaatio on useimmiten lineaarinen muunnos, eli viiva, joka on suora, on myös suora muunnoksen jälkeen. Transformaatio voidaan esittää 4x3-matriisina ja se kirjoitetaan usein leveyssuunnassa, eli siinä on 4 saraketta ja 3 riviä. Vasemmalla sijaitseva 3x3-osion kolme saraketta sisältävät kierron, skaalauksen ja vääristymän. Matriisin neljäs sarake sisältää siirron. Kuvassa 1 on esimerkkimatriisi, josta käy ilmi transformaation eri osien sijainti matriisissa. kierto skaalaus vaaristyma siirto R 11 R 12 R 13 T x R 21 R 22 R 23 T y R 31 R 32 R 33 T z 0 0 0 1 Kuva 1: Transformaatio 4x3-matriisina Animaatioita manipuloitaessa matriisi jaetaan usein neljään osaan. Kukin sarake muodostaa yhden osan ja näin saadaan erotettua tieto luun kierrosta, skaalauksesta, vääristymästä ja siirrosta. Tämä tehdään, koska kullakin muunnoksella on oma merkityksensä, eikä kaikkia muunnoksia tarvita normaalisti kaikille luille. Esimerkiksi ihmistä muistuttavan luurangon luut ovat kiinni vanhempiluussa nivelellä, joka sallii niiden pyörimisen. Niiden siirto on siis kiinnitetty (vanhempiluun nivelen kohta avaruudessa), mutta niitä voidaan kiertää. Koska luut ovat kovaa ainesta, ne eivät voi skaalautua tai vääristyä. Luun sijainti voidaan siis tallentaa kehikkoon vakiona, skaalaus on aina yksi ja vääristymää ei ole. Ainoastaan luun suunta pitää tallentaa, sillä vain se muuttuu ajan myötä, kun hahmoa animoidaan. Animaatiojärjestelmän muistin käyttö ja suoritusnopeus kannattaa optimoida tilanteeseen, jossa luuta kierretään tai sekä kierretään että siirretään.

4 2.3 Suunnan esittäminen 3D-avaruudessa Suunta 3D-avaruudessa voidaan esittää ainakin kolmella eri tavalla: Eulerin kulmilla, 3x3-matriisilla tai nelikolla. Eulerin kulmat (Euler Angles) ovat kolme kulmaa, joiden avulla voidaan kuvata mikä tahansa orientaatio 3-ulotteisessa avaruudessa. Kukin kulma kuvaa kierron tietyn avaruuden akselin ympäri. Kierrot suoritetaan peräkkäin ja näin saadaan aikaan haluttu suunnan muutos. Eulerin kulmille pitää kiinnittää akselien järjestys, jotta tiedetään, minkä akselin ympäri kulmat kierretään. Myös kierron suunta pitää kiinnittää. Koska pysyvää konventiota ei ole, eri järjestelmät käyttävät eri järjestystä ja eivät ole siksi yhteensopivia. Suurempi ongelma on, että monet näennäisesti erilaiset kolmen kulman yhdistelmät kuvaavat saman kierron. Tämä aiheuttaa ongelmia, kun animoinnissa interpoloidaan avainasentojen välillä. 3x3-matriisit ovat yksinkertainen tapa kuvata kiertoja. Matriiseja voi käyttää suoraan laskutoimituksissa. Kaksi matriisia, jotka kuvaavat lähekkäisiä orientaatioita, sisältävät myös samankaltaisia numeroita. Tästä johtuen kahden matriisin välinen interpolointi tuottaa hyvän lopputuloksen. Matriisin puutteena on sen viemä muistitila, joka on kolminkertainen Eulerin kulmiin verrattuna. Toinen ongelma tulee siitä, että 3x3-matriisilla voi esittää myös kierron, skaalauksen ja vääristyksen yhdistelmiä, kuten nähtiin aiemmin. Interpoloitaessa kahden matriisin välillä ei saada aikaan puhdasta kiertoa vaan mukaan tulee skaalausta ja vääristymistä, joiden poistaminen on suhteellisen kallis operaatio. Paras tapa esittää kierto on nelikot (quaternions). Nelikot koostuvat neljästä komponentista (x,y,z,w). Näistä (x,y,z) määrittää kierron akselin ja vektorin (x,y,z) pituus määrittää sinin puolikkaasta kierrettävästä kulmasta. Arvo w määrittää cosinin puolikkaasta kierrettävästä kulmasta. Näin saadaan erotettua keskenään sellaiset kulmat, joiden puolitetun kulman sini on sama, mutta puolitetun kulman cosini eri. Käytännössä käytetään vain yksikköpituisia nelikoita. Jos kaksi nelikkoa sisältää lähekkäisiä numeroita, kuvaavat ne samankaltaisen suunnan. Tästä johtuen niiden interpolointi toimii hyvin. Nelikoita käytetäänkin melkein aina, kun halutaan esittää suuntaa animoitaessa, sillä ne vievät vähän tilaa ja niillä interpolointi on tehokasta. 2.4 Mallit ja instanssit Malli on kuvaus tietystä pelimaailman objektista ja se koostuu objektiverkosta, joka on kokoelma nurkkapisteitä, kolmioita ja tekstuureita. Olennaisin osa hahmoa ani-

5 maatiojärjestelmän näkökulmasta on mallin sisältämä luuranko. Yhtä mallia voidaan käyttää useita kertoja samassa kohtauksessa. Esimerkiksi lokkiparven linnut käyttävät kaikki samaa mallia. Kustakin lokista tallennetaan kuitenkin lokkikohtaista tietoa kuten sen sijainti ja suunta, animaatioiden tila ja sen luiden tämänhetkinen asento. Tämän lisäksi kuhunkin lokkiin liittyy pelimekaanista tietoa, kuten miten nälkä sillä on. Lokkikohtainen tieto tallennetaan sen instanssiin, joka sisältää viittauksen instanssin käyttämään malliin. Animoitaessa tiettya instanssia täytyy tallentaa tieto siitä, mikä animaatio on kyseessä, sen alkamisaika, sen nopeus ynnä muuta sellaista. Animaatio saatetaan haluta myös pysäyttää tai sen nopeutta muuttaa. Näitä tietoja ei voida tallentaa itse animaatioon, sillä se on kaikille lokeille yhteinen. Animaatioita ei myöskään haluta kopioida, sillä ne vievät paljon tilaa. Tarvitaan jonkinlainen animaatiokonrollirakenne, joka yhdistää kohtauksen instansseihin tietyn animaation ja tallentaa tietoja animaatiosta, kuten sen nopeuden ja alkamisajan, ja joka voidaan käskeä pysähtymään (stop tai pause) tai muuttamaan suoritusnopeuttaan. Tietorakenteena käytetään kahta linkitettyä listaa, toisessa listassa ovat instanssit ja toisessa animaatiot. 3 Animaatioiden tallentaminen Animaatioiden tallentamisen suurin haaste on saada ne mahtumaan mahdollisimman pieneen tilaan. Esimerkiksi animaatiojärjestelmälle annettu muistitila on Playstation 2:ssa noin 8 megatavun luokkaa. Esimerkkinä luvussa toimii animaatiojärjestelmä, jossa jokaisesta luusta tallennetaan aluksi 4x3-matriisi, kutakin animaation kuvaa kohden kertaalleen. Näin animaation suorittaminen on helppoa. Oletetaan, että pelin animaatioissa on 30 kuvaa per sekunti, 5 päähahmoa, joilla kullakin 100 animaatiota, 15 sivuhahmoa, joilla kullakin 20 animaatiota, ja jokainen animaatio kestää keskimäärin 4 sekuntia. Kaikissa hahmoissa on 50 luuta. Kaiken kaikkiaan animaatiot veisivät tilaa 220 megatavua. Tämä on mahdoton tilavaatimus, sillä se ei ole lähelläkään sitä muistimäärää mitä animaatioille on tarjolla nykyisissä pelikonsoleissa. Animaatiojärjestelmän ohjelmoijalla ei ole valtaa vähentää hahmoja, animaatioita tai luiden määrää. Siksi ainut keino onkin pyrkiä optimoimaan tallennettavien animaatioiden viemä tila mahdollisimman pieneksi.

6 3.1 4x3-matriisin purku ja vakioiden käyttö Jokaisesta luusta tulisi tallentaa vain oleellinen tieto. Tavallinen 4x3-matriisi kuvaa neljä toisistaan erillistä muunnosta: siirron, orientaation, skaalauksen ja vääristymän. Kuten aiemmin huomattiin, useimmat luut voivat vain vaihtaa orientaatiota. Poikkeuksena ovat luut, jotka kuvaavat lihaksia, ne osaavat myös vääristyä. On myös joitain animaatioita, jotka eivät liikuta kaikkia luita, esimerkiksi istuallaan oleva hahmo liikuttaa yleensä vain yläruumiinsa luita. Paikallaan pysyvät luut voidaan tallentaa vakioina, eli niiden sijainti tallennetaan vain kerran, koska se on kaikissa animaation kuvissa sama. Optimoidaan animaation viemä tila jakamalla jokaisen luun 4x3-matriisi neljään osaan ja selvittämällä, mitkä osat pysyvät samana tai ovat vastaavat kuin vanhempiluulla. Vakiot tallennetaan kerran animaatiota kohti ja osat, joiden tieto on sama kuin vanhempiluulla, jätetään tallentamatta. Nyt siirto, skaalaus ja vääristymä saadaan tallennettua kukin kolmella arvolla ja orientaatio tallennetaan nelikkona, eli se vie neljä arvoa. Tämä säästää huomattavasti muistia. Kääntöpuolena prosessorille tulee enemmän laskettavaa, kun se etsii animaation, lukee sen sisältämän datan, täydentää animaation sisältämän datan vakioilla ja vanhempiluun osista saatavilla tiedoilla ja koostaa sitten näistä kaikista kutakin luuta kohden 4x3-matriisin. Nähty vaiva on kuitenkin kannattavaa, sillä yhden kuvan yhden luun tallentamiseen käytetty muistitila saadaan noin puolitettua, kun tarpeettomat muunnokset jäävät pois. Yhden luun viemä tila per kuva on nyt 24 bittiä, kun se aiemmin oli 48 bittiä. Pelin animaatiot vievät nyt 110 megatavua tilaa. 3.2 Avainkuvat ja lineaarinen interpolointi Seuraava tapa rajoittaa animaation viemää tilaa on vähentää käytettäviä kuvia per sekunti. Tällöin yksi animaatio vie vähemmän tilaa, sillä siinä on vähemmän tallennettavia kuvia ja siten vähemmän yhden luun eri asentoja. Otetaan käyttöön tekniikka, jotka kutsutaan avainkuviksi ja joka on lähtöisin käsinpiirretyistä animaatioista. Ideana on, että pääartisti piirtää vain tärkeimmät avainkuvat hahmon animaatioista. Yleensä kustakin hahmon liikkeestä piirretään staattiset asennot alusta, keskikohdasta ja lopusta. Vaikeammissa tai epätavallisissa liikkeissä käytetään useampia avainkuvia, jotta päästäisiin haluttuun lopputulokseen. Avainkuvien väliin tarvittavat vähemmän tärkeät kuvat piirtää useampi eri ihminen. Koska avainkuvat määräävät pitkälti liikkeen päälinjat, on välikuvien piirto suhteellisen helppoa.

7 Tietokonepeleissä sen sijaan, että tallentaisimme animaatiosta esimerkiksi 30 kuvaa, eli asentoa per sekunti, tallennamme vähemmän asentoja ja interpoloimme näiden ennalta luotujen avainasentojen väliset asennot. Animaattorit luovat nämä avainasennot valmiiksi, ja loput interpoloidaan pelin ollessa käynnissä. Koska orientaatio tallennettiin nelikkona, on sen interpolointi helppoa. Väliasennot saadaan nyt lineaarisella interpoloinnilla. Kahden peräkkäisen avainkuvan välissä oleva kuva, joka on ajassa 25 prosenttia ensimmäisestä avainkuvasta, saadaan seuraavasti. Ensimmäisen avainkuvan arvot kerrotaan luvulla 0,75 ja toisen avainkuvan arvot luvulla 0,25; sitten näistä saadut arvot lasketaan yhteen. Nyt meillä on tiedossa välikuvan arvot eli uusi asento, joka saatiin laskemalla. Siirto, skaalaus ja vääristys interpoloituvat suoraan hyvin. Orientaation interpoloinnissa tulee nelikot ensin normalisoida eli niiden pituudeksi pitää saada käytetyn yksikön pituus, useimmiten 1. Interpoloinnin jälkeen nelikot pitää uudelleennormalisoida, sillä muuten niihin jää skaalaja vääristymävirheitä. Tämä onnistuu jakamalla nelikon jokainen luku nelikon pituudella. Avainkuvien käytössä on myös omat haasteensa. Jos kyseessä on tarkka animaatio, sen yksityiskohtia menetetään. Ei ole myöskään yhtä sopivaa avainkuvien tiheyttä, vaan niiden määrä on animaatiokohtainen. Esimerkiksi helikopterin roottorin liike vaatii huomattavasti enemmän avainkuvia kuin nukkuvan ihmisen animointi, missä muutama avainkuva riittää, sillä pääasiallinen liike on ihmisen rintakehän kohoilu. Avainkuvien tiheyden määrittämisen lisäksi tulee olla tarkkana, kun valitsee itse avainkuvia. Jos nukkuvan ihmisen rintakehän animaatiosta valitaan sellaiset kuvat, joissa rintakehä on juuri laskeutumisen puolivälissä ja toisessa kohoamisen puolivälissä, ei saada aikaan mitään liikettä, sillä kuvat ovat käytännössä samat. Avainkuvia käyttämällä ei siis voida loputtomasti vähentää animaation käyttämää tilaa, sillä vastaan tulee raja, jonka jälkeen animaatio ei enää näytä siltä, mikä oli tarkoitus. Avainkuvien määrä per animaatio onkin animaatiokohtaista. Jotkut animaatiot tarvitsevat monia avainkuvia eivätkä siedä interpolointia, siinä missä toisissa pystytään hyödyntämään paljon interpolointia ja näin selvitään paljon vähemmällä määrällä avainkuvia. Keskiarvo tietokonepelien animaatioissa käytettäville avainkuville on noin 10 per sekunti. Muistia kuluu siis kolmannes siitä mitä ennen avainkuvien käyttöönottoa meni, kun jokaista animaatiota varten tallennettiin 30 kuvaa per sekunti (110 KB/3 = 36,7 KB). Animaatiot vievät nyt noin 37 megatavua tilaa. Lineaarinen interpolointi ei sovellu kaarevia liikeratoja sisältävien animaatioiden välikuvien luomiseen, sillä se olettaa, että muutos tapahtuu suoraa linjaa pitkin. Näin

8 ei kuitenkaan ole esimerkiksi pomppivan pallon kohdalla. Ongelma korjaantuu, kun interpoloidaan käyrää pitkin; suorat voidaan korvata esimerkiksi Bezierin käyrillä. Tämä saa useimmiten aikaan luonnollisemman lopputuloksen, sillä useimmat liikeradat muodostavat käyriä. Kustakin Bezierin käyrästä pitää tallentaa kaksi tai kolme kontrollipistettä siinä missä suoran yhteen osaan riitti yksi, sen päätepiste. Käyrästä tallennetaan myös pieni tietorakenne. Käyriä kannattaa kuitenkin käyttää, sillä niitä tarvitaan noin kymmenesosa verrattuna siihen, kuinka monta erillistä suoraa lineaarisessa interpoloinnissa tarvittaisiin saman liikkeen aikaansaamiseen. Käyriä käytettäessä osioita tarvitaan vähemmän, sillä kaarevaliikerata voidaan arvioida kaarevilla osilla paremmin kuin suorilla osilla. Suorien osioiden tulee olla melko lyhyitä, jotta ne yhdistettyinä toisiinsa näyttäisivät muodostavan kaaren. Käyrät osat kaartuvat jo valmiiksi ja ne saadaan liittymään toisiinsa sulavasti, jolloin vähempi määrä osioita riittää saamaan aikaan hyvännäköisen kaaren. Koska käyriä käyttämällä selvitään huomattavasti vähemmillä osioilla, animaation käyttämä muistitila vähenee nyt 37 megatavusta 10 megatavuun. 4 Animointi Animaatioita voidaan toistaa peräkkäin, toistaa tiettyinä ajanhetkinä ja luoda niistä sulauttamalla uusia animaatioita. Tässä kappaleessa käsitellään lyhyesti, miten animointi tapahtuu animaatiojärjestelmässä. 4.1 Animaatioiden peräkkäistoisto Monet animaatiot toistetaan useita kertoja peräkkäin (looping). Animaation toistokertojen vaihtumiskohdassa ei saa tulla äkillisiä muutoksia hahmon sijainnissa tai liikkeen nopeudessa. Animaattorit osaavat huolehtia tästä tehdessään animaatioita, mutta jatkuvuus tulee ottaa myös huomioon, kun ohjelmoidaan animaatiojärjestelmää. Käytettäesssä transformaatioita muuntamaan luurangon asentoa tulee varmistua siitä, ettei muunnos riko jatkuvuutta. Jatkuvuus tulee ottaa huomioon myös silloin, kun toistetaan peräkkäin useita eri animaatioita. Erillisten animaatioiden toistonopeuden tulisi olla sama, sillä se helpottaa liikkeen nopeuden säilyttämistä samana.

9 4.2 Animaatioiden toistaminen Kun halutaan toistaa (sample) animaatio, valitaan animaatiolle lokaaliaika (local time). Se alkaa tyypillisesti nollasta, kun animaation toisto alkaa, ja loppuu, kun alkuperäisellä nopeudella toistettu animaatio loppuu. Esimerkiksi viiden sekunnin pituisen animaation lokaaliaika alkaa nollasta (0.0) ja kuluu, kunnes saavuttaa 5 sekuntia (5.0). Yksikkönä käytetään yleensä sekuntia. Toinen pelien käyttämä aika on globaaliaika (global time), mikä kuvaa pelimaailman sisäistä kuluvaa aikaa. Animaation lokaaliaika voi kulkea eri tahtiin globaalin kanssa, jos sitä toistetaan nopeampaa tai hitaampaa kuin alkuperäisellä nopeudelle, joka on kiinnitetty animaation tekovaiheessa. Se voi myös kulkea taaksepäin, jos animaatio halutaan toistaa vastakkaisessa järjestyksessä. Yleensä pelin sisäiset luonnonvoimat kuten painovoima kulkevat globaaliajan kanssa samaa tahtia, eikä niiden nopeuteen voi vaikuttaa. Lisäksi on vielä olemassa tosimaailman aika (real-world time), jonka käyttäjä näkee. Globaaliaika ja tosimaailman aika kulkevat samaa vauhtia, kun peli on käynnissä, paitsi silloin kun pelaaja pysäyttää (pause) pelin tai katsoo jotain pelin tapahtumaa hidastuksena. Animaatiojärjestelmien ei tarvitse välittää tosimaailman ajasta, mutta on hyvä muistaa, ettei pelin globaaliaika ole sama asia todellisen ajan kanssa. Animaation nopeus on kuluneen globaalin ajan suhde kuluneeseen lokaaliaikaan. Jos nopeus on yksi, kulkevat ajat samaa tahtia ja animaatio toistuu alkuperäisellä nopeudella. Jos nopeus on 0,5 animaatio toistetaan puolella globaalin ajan nopeudesta, eli animaatiosta toistetaan puoli sekuntia globaalin ajan kulkiessa yhden sekunnin ja näin ollen näytöllä näkyvä animaatio hidastuu. Pelissä on vain yksi globaaliaika, joka vastaa pelissä tähän hetkeen mennessä kulunutta aikaa. Yleensä animaatioita toistetaan pelin globaaliajassa, joka normaalisti vastaa piirrettävänä olevaa ajanhetkeä. Joskus on kuitenkin tarpeen pystyä toistamaan animaatioita menneisyydessä tai tulevaisuudessa ilman, että pelin globaaliaika muuttuu minnekään. Animaatiojärjestelmän pitäisi siis pystyä käsittelemään useaa globaaliaikaa samanaikaisesti (scrubbing). Animaatioita toistetaan etukäteen, jotta pystyttäisiin ennustamaan animaation liikkeen suuntaa. Esimerkiksi minne hahmon askeleet johtavat, mihin sen aloittama hyppy suuntautuu tai mihin kohtaan hahmo kurkottaa ottamaan jotain esinettä. Oleellista on varmistaa, että animaation toistamiseen käytetään koodia, jossa tuetaan tehokasta pääsyä animaation yksittäiseen kuvaan, vaikka se olisi animaation keskellä. Animaatioiden tallentamiseen ei kannata käyttää sellaisia tekniikoita, joissa joudutaan pahimmillaan toistamaan animaatioa alusta saakka haluttuun kohtaan, jotta yksittäisen kuvan arvot selviäi-

sivät (esimerkiksi kaikkien kuvien tallentaminen delta-arvoina, joka kertoo, miten kuva on muuttunut edellisestä kuvasta). 10 4.3 Animaatioiden sulauttaminen Hyvän animaatiojärjestelmän tulee osata toistaa useita animaatioita samanaikaisesti yhdessä hahmossa ja sulauttaa (blend) ne saumattomasti toisiinsa niin, että ne muodostavat yhden animaation. Yksinkertaisin tapa on käyttää lineaarista interpolointia (lerp) kahden animaation transformaatioiden yhdistämiseen. Transformaatio voi olla, joko 3x3-matriisi tai nelikko. Kahden siirron, skaalauksen ja vääristymän yhdistäminen on helppoa. Kahden rotaation yhdistäminen on työläämpää, sillä se vaatii transformaatioiden ja tuloksen normalisointia. Kaksi normalisoinneista voidaan kuitenkin korvata kevyemmällä algoritmilla, joka käyttää arvioituja arvoja sen sijaan, että laskisi neliöjuurten tarkkoja arvoja. Useampia animaatiota voidaan sulauttaa toisiinsa tekniikalla, jossa kullekin animaatiolle annetaan painoarvo (multiway blending). Sulautettavat animaatiot lasketaan yhteen, kukin kerrottuna omalla painoarvollaan, ja saatu tulos jaetaan kaikkien animaatioiden painoarvojen summalla. Usein halutaan animoida vain osa luurangon luista. Esimerkiksi vilkuttamisessa riittää animoida vain vilkuttava käsi. Luumaski (bone mask) on lista numeroita, jotka antavat kullekin luulle numeroarvon nollasta ykköseen. Numeroarvot kertovat, kuinka paljon animaatio vaikuttaa kyseiseen luuhun (0= ei vaikutusta, 1=täysi vaikutus). Parhaaseen lopputulokseen päästään, kun animaattori antaa luiden painoarvot suoraan. Yleensä niiden vaikutusta ei voi nähdä suoraan animointiohjelmassa, minkä vuoksi niitä joudutaan testamaan pyörittämällä animaatioita pelissä ja tutkimalla, milloin aikaansaadaan haluttu lopputulos. Luumaski yhdistetään animaatioon ja sitä käytetään, kun animaatioita sulautetaan keskenään. Luumaskin arvot kerrotaan animaation painoarvolla. Saatuja uusia luumaskin arvoja käytetään sulautuksessa. Animaation vaikutus siis on eri luissa eri suuri. Luumaskien avulla voidaan määrittää osia luurangoista, joihin vaikuttaa vain tietty animaatio ja sitten sulauttaa näiden animaatioiden liittymäkohtien luita keskenään niin, että aikaansaadaan sulava kokonainen animaatio.

11 5 Deformaatio Luurankoon kohdistuvat transformaatiot tietyllä ajanhetkellä muodostavat asennon (pose). Animointi on prosessi, missä luurangon asentoa muutetaan ajan kuluessa. Koska asento on lista erilaisia transformaatioista, sitä ei voi piirtää suoraan ruudulle. Deformaatio on prosessi, missä otetaan yksi animaation tuottama asento ja siirretään sen perusteella objektiverkon (mesh) nurkkapisteet asennon kuvaamaan kohtaan, jolloin malli on valmis piirrettäväksi ruudulle. Tyypillisesti animaatiojärjestelmä välittää vain animaatioiden toistamisesta ja sulauttamisesta. Renderöintijärjestelmä taas on kiinnostunut vain yksittäisistä asennoista ja käyttää niitä deformoinnissa. Animointi ja renderöinti ovat siis toisistaan erillisiä. Tämä on hyödyllistä, sillä renderöinti voidaan suorittaa eri nopeudella kuin muu peli. Useimmat pelimoottorit tekevät kaiken animointiin liittyvän laskennan prosessorissa ja antavat sitten asennot graikkalaitteistolle, joka suorittaa mallin deformaation ja renderöinnin ruudulle. 5.1 Luiden siirto maailma-avaruuteen Luuranko on alunperin lokaalissa asennossa (local pose), missä asennon kuvaavien luiden transformaatiot on tallennettu suhteessa niiden vanhempiin. Luuranko pitää muuttaa maailma-asentoon (world pose), missä transformaatiot kertovat luun paikan suhteessa maailma-avaruuteen. Tämä on yksinkertainen prosessi. Muuntaminen aloitetaan juuriluusta. Sen nykyinen transformaatio kerrotaan transformaatiolla, joka ilmoittaa animoitavan instanssin sijainnin ja suunnan pelimaailmassa. Nyt juuriluun transformaatio on muunnettu maailma-avaruuteen. Seuraavaksi muunnetaan kaikki juuriluun lapset kertomalla niiden transformaatiot äsken lasketulla juuriluun maailmatransformaatiolla. Näin jatketaan rekursiivisesti edeten puussa alaspäin, kunnes kaikkien luiden transformaatiot on muunnettu. Maailmatransformaatio tulee laskea ensin vanhempiluissa ja vasta sitten lapsissa. Tämän varmistaminen onnistuu tallentamalla luiden transformaatiot (alkuperäiset ja muunnetut) taulukkoon, jossa vanhempiluut tallennetaan aina ennen lapsiluita. Näin luut voidaan käsitellä lineaarisesti. Maailma-asentoa käytetään useimmissa fysiikkasimulaatioissa ja törmäystarkistuksissa.

12 5.2 Mallin perusasennon poisto Nyt kaikki luut ovat maailma-avaruudessa. Transformaatioita ei voida suoraan käyttää muuttamaan mallin objektiverkkoa, sillä se on perusasennossa. Objektiverkko pitääkin muuntaa ensin 'tyhjään asentoon'. Perusasento saadan nollattua ottamalla sen luiden transformaatioiden käänteistransformaatiot ja kertomalla maailmaasennossa olevan luurangon vastaavien luiden muunnokset niillä. Tästä syntyviä transformaatioita voidaan käyttää objektiverkon muuntamiseen. 5.3 Verteksien ja niiden normaalien muuntaminen Seuraavaksi siirretään objektiverkon verteksejä. Jokaiseen objektiverkon verteksiin vaikuttaa tietty määrä luita. Yleensä vaikuttavien luiden maksimimäärä rajataan animaatiojärjestelmissä, käytetyin raja on neljä luuta. Mekaanisissa objekteissa riittää yksi luu per verteksi, sillä kaikki osat ovat kovia. Ihmisen vertekseihin tarvitaan taas vähintään 3, sillä nivuset, olkapäät ja kasvot eivät muuten animoidu nätisti. Jokaiselle vaikuttavalla luulle määrätään myös arvo, joka kertoo, kuinka paljon luu vaikuttaa deformoitavaan verteksiin. Näitä arvoja käytetään verteksin sijainnin laskennassa. Lopuksi muunnetaan vielä vertekseihin liittyvät vektorit, joita käytetään varjostuksiin. Ilman vektoreiden muuntamista hahmon varjostus menisi todennäköisesti väärin. Objektiverkko on nyt muunnettu uuteen asentoon, ja se voidaan piirtää ruudulle. Sama prosessi toistetaan jokaista animaation kuvaa kohti. 6 Yhteenveto Tietokonepeleissä käytetään paljon animaatioita, sillä ne saavat pelin näyttämään paremmalta. Animaatioiden viemä tila pitää saada mahdollisimman pieneksi, jotta pelin animaatiot mahtuisivat niille varattuun muistitilaan. Tässä onnistutaan optimoimalla yhden luun kuvaamiseen kuluvaa muistitilaa, vähentämällä animaatiosta tallennettujen kuvien määrää ja interpoloimalla loput kuvat näiden avainkuvien avulla. Animaatioiden toistossa tarvitaan omia tekniikoita, joiden avulla saadaan toistettua monia eri animaatioita peräkkäin ja sulautettua useista eri animaatioista uusia animaatioita. Animaatioiden uusiokäyttö sulauttamalla on kannattavaa, koska animaatioiden tekeminen on hidasta ja niiden tallentaminen vie tilaa.

13 Hahmoon liittyy aina tietty luuranko ja animaatioita. Näiden animaatioiden vaikutus hahmon objektiverkkoon voidaan laskea ja ruudulle piirrettävä kuva onkin hahmon objektiverkko, jota on muokattu luurangon asennon perusteella. Koska kyse on animaatiosta kolmiulotteisessa maailmassa hahmo liikkuu oikeasti. Pelilogiikan ja hahmon animaation onkin hyvä olla yhteisymmärryksessä siitä, missä kohtaa pelimaailmaa hahmo on. Lähteet Rab05 Rabin, S., Introduction to Game Development. Charles River Media, 2005.