Velho ja Elukka

Velho ja Elukka on Teknillisen korkeakoulun kurssin T-111.5450 Tietokoneanimaatio harjoitustyön tulos. Tehtävänantona oli luoda juonellinen animaatio ohjelmoimalla. Tämä WWW-sivu on osa harjoitustyön palautusta. Viimeinen päivitys tapahtui 16.1.2006.

Juoni

Iloinen elukka kirmaa niityllä pahaa aavistamatta. Ilkeä velho kuitenkin haluaa lihaa lounaspöytään ja yrittää ampua taikasauvallaan elukkaa. Elukka onnistuu väistämään pari sädettä ja avuksi saapuukin hyvä velho. Velhot valmistautuvat kaksintaisteluun ja hyvä velho tekee pahiksesta tähtisumua.

Tekniikat

Maasto on generoitu parametrisella funktiolla y = f(x,z). Ruoho on maaston pinnalle arvottuja teksturoituja nelikulmioita, jotka ovat suunnattuna aina kameraan päin. Nelikulmioita on käytetty maastossa 50000.

Puiden generointi perustuu rekursiiviseen funktioon, joka pyörittelee matriisia ja liittää lisää oksia. Viimeiseen oksaan arvotaan lehtiä ympärille. Haarautumissyvyys on 6, ja kaikissa uloimman tason oksissa on 30 lehteä.

Velho on mallinnettu luurankomallina käänteiskinematiikan avulla. Luurangon ympärille on tehty geometria sylintereistä ja palloista. Hahmo osaa kävellä eteenpäin, kääntyä ja heiluttaa käsiään. Tämän geometrian päälle on puettu vaatekappale, joka perustuu jousiverkkomalliin. Vaatteen verteksit nostetaan geometrian pinnalle niiden mennessä sen sisään. Tämä enimmäkseen pitää vaatteen velhon päällä, mutta lisäksi on laitettu keinotekoisia rajoituksia, joiden avulla hattu ja hihat pysyvät halutuissa paikoissa. Puku on muodostettu poikittaisesta sylinteristä ja pystysuuntaisesta kartiosta, jotka on venytetty geometrian muotoiseksi ennen jousiverkon rakentamista.

Elukan liike perustuu luurankomalliin, jossa luilla on kapselimainen vaikutusalue (keskellä maksimivaikutus, reunalla nolla) ja näistä saadaan painot verteksien pyörityksille (matrix palette). Elukassa on 7 luuta ja ne on aseteltu käsin. Elukan turkki on tehty renderöimällä ensin teksturoitu elukan nahka ja sen päälle blendattu karvatekstuuri 5 kertaa eri korkeuksille siirtämällä elukan verteksejä normaalin suuntaan.

Varjot on saatu aikaan renderöimällä maailma valonlähteestä katsottuna ja ottamalla tästä syvyyspuskuri tekstuuriin. Sitten kaikkiin kappaleisiin laitetaan tekstuurikoordinaattien generointi vertekseistä niin, että ne projisoituvat valoon (shadow mapping). Tekstuurin arvoa verrataan tekstuurikoordinaatin z-arvoon (r-koordinaatti OpenGL:ssä) ja tämän perusteella päätellään onko pikseli varjossa vai ei.

Lopullinen video käyttää depth of field -efektiä, pehmeitä varjoja aluevalon ansiosta ja anti-aliasointia. Nämä toteutettiin renderöimällä useampi kuva yhtä kuvaa varten (multi sampling) ja käyttämällä accumulation bufferia. Sampleja otetaan yhdelle kuvalle 16.

Hahmojen ja kameran liikkeisiin käytetään pääsääntöisesti Catmull-Rom -splinejä, mutta paikoitellen myös vapaata ohjelmakoodia.

Työkalut

Koodi on kirjoitettu C++:lla. Kurssin valmiskoodista on hyödynnetty vain kuvien kaappaus ja splini. Kaikki muu koodi on kirjoitettu itse. Ohjelma käyttää SDL- ja SDL_image-kirjastoja sekä OpenGL-rajapinnan versiota 1.3. Ohjelma, jolla lopullinen video renderöitiin, on käännetty ilmaisella Microsoft Visual C++ 2005 Express Editionilla Windows XP:ssä. Tekovaiheessa käytettiin myös gcc 3.3.5 -kääntäjää Linuxissa sekä gcc 4.0.1 -kääntäjää Mac OS X:ssä.

Video renderöintiin tietokoneessa, jossa oli AMD Athlon 64 3000+ -prosessori ja ATI Radeon 9600 Pro -näytönohjain. Renderöinti kesti n. 6h 20min.

Kaikki tekstuurit on tehty Paint Shop Pro 8 -kuvankäsittelyohjelmalla.

Elukan geometria on mallinnettu Wings 3D -mallinnusohjelmalla. Tämä on animaation ainoa kappale, jota ei ole tehty kokonaan koodilla.

Videoista osa tehtiin BMP-tiedostoista Eero Klamin tekemällä jpegtoavi-ohjelmalla ja osa muuntamalla BMP-tiedostot ImageMagickilla PNG-muotoon ja siitä ffmpeg-ohjelmalla.

Video

Video on saatavilla useassa eri formaatissa eri kuvanlaaduilla. Kaikki versiot ovat 720*576-resoluutiossa.

Tekijät

Miika Sell ja Hannu Saransaari