22.08.2013 Views

ATT ANIMERA FJÄDRAR OCH FJÄLL I MAYA - Umeå universitet

ATT ANIMERA FJÄDRAR OCH FJÄLL I MAYA - Umeå universitet

ATT ANIMERA FJÄDRAR OCH FJÄLL I MAYA - Umeå universitet

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>ATT</strong> <strong>ANIMERA</strong> <strong>FJÄDRAR</strong><br />

<strong>OCH</strong> <strong>FJÄLL</strong> I <strong>MAYA</strong><br />

Mattias Lindblom<br />

27 Maj 2006<br />

Rapport för examensarbete i interaktions design, 20p<br />

Internhandledare, TFE, <strong>Umeå</strong> <strong>universitet</strong>: Håkan Gulliksson<br />

Externhandledare, Craft Animations: Luigi Tramontana<br />

<strong>Umeå</strong> University<br />

Department of Computing Science<br />

SE-901 87 UMEÅ<br />

SWEDEN


Abstract<br />

Today more and more movies contain characters partly or completely animated by<br />

the computer. Today there exist no solution specifically designed to animate birds<br />

and their feathers. This paper describes my master thesis which goal was to create<br />

such a solution. Furthermore it investigates the best method for interaction with the<br />

system. The system utilizes physics engines which simulate the feathers collisions and<br />

interaction with each others. And the solution is developed as a Maya plug-in. The<br />

method of interaction found to work the best was using interpolated key feathers<br />

and textures to describe how the feathers attributes such as density and length<br />

changed over the surface of the bird.<br />

Abstrakt<br />

Allt fler filmer använder idag sig av helt eller delvis dator animerade karaktärer. Vill<br />

man animera en fågel idag finns det inget verktyg utvecklat specifikt för att<br />

underlätta skapandet av fjädrarna och animeringen av dem. Det här examensarbetet<br />

syftar till att undersöka möjligheten till att skapa ett sådant verktyg genom<br />

utnyttjandet av en fysikmotor. Vidare undersöks det vilken interaktionsform som bäst<br />

skulle kunna passa verktyget. Fysikmotorn genomför dels kollisionsdetektionen<br />

mellan fjädrarna men simulerar också deras interaktion med varandra.<br />

Animeringsverktyget fungerar som en plugin i Maya. Interaktionsmetoden som<br />

visade sig fungera bäst innebar utnyttjandet av interpolation av nyckelfjädrar och<br />

texturer som beskriver hur fjädrarnas egenskaper förändrar sig över fågelns yta.


Innehållsförteckning<br />

1. Introduktion .................................................................................................................... 1<br />

2. Mål och metod................................................................................................................ 2<br />

2.1. Målgruppsanalys ...................................................................................................... 3<br />

2.2. Utvecklingsprocessen ............................................................................................. 4<br />

2.2.1 Iterativ design ..................................................................................................... 4<br />

3. 3d-animeringar ............................................................................................................... 5<br />

3.1. Päls och hår i animerad film .................................................................................... 6<br />

3.2. Fjäderuppbyggnaden .............................................................................................. 9<br />

3.3. Fjädrar i animerad film ........................................................................................... 11<br />

4. Fysikmotorn ................................................................................................................... 14<br />

4.1. Kollisionsdetektionen ............................................................................................. 14<br />

4.2. Restriktioner ........................................................................................................... 15<br />

4.3. Uppdatering av systemet ..................................................................................... 16<br />

4.4. Ageie PhysX ........................................................................................................... 16<br />

5. Maya © ............................................................................................................................. 17<br />

5.1. Mayas gränssnitt .....................................................................................................18<br />

5.2. Dependencygrafen och Mayanoder ......................................................................18<br />

5.2.1. Scenen ..............................................................................................................19<br />

5.2.2. Dataflödet ........................................................................................................19<br />

5.2.3 Noden ............................................................................................................... 20<br />

5.3. Quaternioner i Maya .............................................................................................. 21<br />

6. Användarutvärderingar ............................................................................................... 22<br />

6.1. Användarintervju ................................................................................................... 22<br />

6.2. Observation vid användandet av ”Shave and a haircut” .................................... 23<br />

6.3. Användartest ......................................................................................................... 23<br />

7. Interaktionsform för kamning ..................................................................................... 23<br />

7.1. Direktmanipulering ................................................................................................ 25<br />

7.2. Nyckelfjädrar .......................................................................................................... 28


7.3. Texturering av fjäderutseende och orientering .................................................. 28<br />

7.4 Lösningen på interaktionen för orientering och böjning av fjädrar .................... 28<br />

8. Placering av fjädrar ...................................................................................................... 29<br />

8.1. Fast Surface Particle Repulsion............................................................................. 30<br />

8.2. Placering via sannolikhetsfördelning ................................................................... 32<br />

8.3. Kollisionsdetektion ............................................................................................... 33<br />

9. Spara och ladda tillstånd ............................................................................................. 35<br />

9.1 Interpolation av färger ........................................................................................... 35<br />

10. Implementation .......................................................................................................... 36<br />

10.1. PhysXnoden .......................................................................................................... 36<br />

10.2. Featherklassen ..................................................................................................... 38<br />

11. Slutsatser och diskussion ............................................................................................ 40<br />

12. Litteraturförteckning .................................................................................................. 42


Att animera fjädrar och fjäll i Maya 1<br />

1. Introduktion<br />

Vid produktion av 3d-animerade filmer. måste man ofta styra varje enskilt objekt och<br />

delobjekts rörelse för varenda bildruta. Detta kan bli väldigt omständigt och ta en<br />

massa tid. Tid är ju pengar så därför finns det ett intresse för att snabba upp<br />

processen. Antingen genom att underlätta styrningen av objektens rörelser eller<br />

genom att själv göra en förenklad rörelse och låta mjukvaran styra detaljerna i<br />

rörelsen.<br />

Det vore väldigt tidskrävande att animera flera tusen fjädrar på en fågel för hand.<br />

Idag gör man det ofta automatiskt genom att utnyttja animeringsprogrammens<br />

inbyggda funktioner för animering av hår och päls. Dessa har dock en stor nackdel,<br />

nämligen att de tillåter penetration av hårstråna/fjädrarna med varandra, det vill säga<br />

att hår och fjädrar passerar genom varandra. Detta är inte någon större fara när det<br />

handlar om hår och päls eftersom det är svårt att se huruvida så tunna objekt<br />

passerar igenom varandra eller bara ligger väldigt nära. Men för fjädrar vilka är<br />

mycket bredare blir problemet betydligt tydligare.<br />

Det här examensarbetet är genomfört som ett delprojekt på företaget Craft<br />

animation vilka utvecklar verktyg för animering i 3d i realtid. Det fullständiga<br />

projektet syftar till att ge animatörerna ett verktyg för att animera fågelskrudar och<br />

fjällbeklädda ytor. Hela processen från att bygga upp fjädrarna/fjällens form och<br />

utseende till placering och rörelse skall stödjas. I det här examensarbete har följande<br />

delar behandlats.<br />

Möjligheten att i realtid kamma fjäderskruden, dvs. bestämma fjädrarnas<br />

riktning, lutning och kurvatur (fluffighet).<br />

Automatisk animering av fjädrarna/fjällen utan penetration.<br />

Utplacering av fjädrarna.<br />

Verktyget har implementerats i animeringsmiljön Maya och utnyttjar en fysikmotor<br />

med möjlighet till hårdvaruacceleration. Fysikmotorn som valdes var Agieas<br />

fysikmotor PhysX.<br />

En annan viktig aspekt i projektet var att få fram ett verktyg vilket tillåter<br />

animatörerna att arbeta effektivt. Det var också önskvärt att verktyget så mycket<br />

som möjligt jobbar enligt principerna för Maya och Mayanoder.<br />

Arbetet skedde på Craft Animations utvecklingskontor i Göteborg och bestod i två<br />

delar. Jakob Bränström som är en student från Chalmers hade hand om utvecklingen<br />

av det andra delprojektet. I det delprojektet studerades hur utformningen av<br />

fjädrarna ska gå till och hur de olika fjädertyperna interpoleras beroende på deras<br />

inbördes placering gentemot nyckelfjädrarna.


Att animera fjädrar och fjäll i Maya 2<br />

Här i rapporten beskrivs de målsättningar projektet har och vilka metoder som<br />

använts. Efter att mål och metod har beskrivits kommer en kort introduktion till 3danimering<br />

och orsakerna till de problem som finns vid skapandet av realistiska<br />

animeringar. Tyngdpunkten i avsnitten om 3d-animering har legat på lösningar vilka<br />

tagits fram för animeringen av päls och fjädrar vid produktionen av Hollywood filmer.<br />

Filmer innehållande animerade karaktärer täckta med antingen päls eller fjädrar, så<br />

som King Kong, Narnia och Stuart Little 2. Därefter följer en genomgång av de två<br />

huvudkomponenterna i systemet, Maya och PhysX , vilket följs upp av en diskussion<br />

om hur placeringen av fjädrar samt interaktionen vid kamningen av fjädrarna lösts.<br />

Som avslutning innan sammanfattningen förklaras hur fjädrarnas orientering sparas i<br />

texturmappar och hur det färdiga systemet är uppbyggt.<br />

Det visade sig att det första angreppspunkten att kamma fjädrarna, genom att<br />

imitera hur man skulle gjort i verkligheten genom att dra en kam eller liknande<br />

verktyg över fjädrarna, inte var det effektivaste eller smidigaste metoden. Istället<br />

visade det sig vara bättre att utgå det sätt som animatörerna var vana att animera<br />

päls på och anpassa den metoden med nyckelkurvor och mappade texturer.<br />

2. Mål och metod<br />

Projektet kunde delas upp i tre delmål där det första delmålet var att undersöka<br />

möjligheterna till att i realtid kamma en fjäderskrud. Med kamning menas att påverka<br />

fjädrarna som är placerade på en yta så att de lägger sig i önskad riktning och lutning<br />

utan att de för den skull penetrerar varandra. Se i figur 1 hur en plan yta med fjädrar<br />

vilken bara delvis blivit kammad ser ut. Kamningen har här skett i riktning mot det<br />

övre vänstra hörnet. För detta arbete skulle även lämpliga kamningsverktyg<br />

utvärderas.<br />

Det andra delmålet var att placera ut fjädrarna på en yta enligt en täthet som<br />

specificerades av användaren. Hur användaren skulle specificera tätheten behövde<br />

också undersökas. Möjligheten till en deterministisk utplacering var skulle speciellt<br />

undersökas.<br />

Som tredje delmål skulle fjädrarna/fjällen animeras och renderas automatisk med<br />

hjälp av en fysikmotor och Mayas inbyggda renderare alternativt sätta fjädrarnas<br />

transformmatris och kurvatur för de bildrutor som fysikmotorn används i. Fördelen är<br />

att användaren sedan kan gå in och förändra enstaka fjädrars matris eller kurvatur i<br />

efterhand. Fördelarna med att interagera lösningen med renderaren är för det första<br />

att man att användaren slipper köra simuleringssteget. Men också att renderaren kan<br />

utnyttja företagets eventuella renderingsfarm. Renderingen är den process där man<br />

lägger till alla de detaljer och effekter som är för tunga för att beräknas i realtid som


Att animera fjädrar och fjäll i Maya 3<br />

till exempelvis belysning och skuggor. Man kan säga att det är lite som att framkalla<br />

animationen. En renderingsfarm är ett kluster av datorer som används för att köra<br />

renderingen och på så sätt öka beräkningskraften tillgänglig renderaren.<br />

Figur 1. En plan delvis kammad yta med fjädrar.<br />

2.1. Målgruppsanalys<br />

Eftersom de större filmbolagen och animeringsstudiorna ofta har sina egna in-house<br />

lösningar för den här typen verktyg begränsar köparna av den slutliga produkten till<br />

små och medelstora animeringsstudior.<br />

Slutanvändaren är ofta texturerarna på ovan nämnda företag. En texturerare har i<br />

uppgift att lägga på struktur, färg, genomskinnlighet osv. till modellerna och<br />

objekten i 3d-scenen. Till exempel ser de till att ytan i ansiktet på en mänsklig 3dmodell<br />

ser ut som hud och inte som en slät metall på en robot. Texturerarna är oftast<br />

i 25-40 år åldern och de flesta i den undre delen av åldersgruppen. Att de är estetiskt<br />

lagda och intresserade av grafik kan man utgå från baserat på deras val av yrke.<br />

Eftersom arbetet kräver en mycket användande av datorer kan även stor datavana<br />

antas. Produkten kommer att vara en plugin till Maya och användaren kommer<br />

knappast byta utvecklingsmiljö enbart för få utnyttja den. Även kännedomen av<br />

Maya förutsätts vara åtminstone god och då särskilt av textureringsdelen. De flesta<br />

av slutanvändarna har tidigare använt sig av Mayas verktyg för hår och päls. De kan<br />

därför anses känna till metodiken för detta verktyg.


Att animera fjädrar och fjäll i Maya 4<br />

2.2. Utvecklingsprocessen<br />

I ett första skede gällde det att sätta sig in i vad som var möjligt att göra med PhysX-<br />

och Maya SDK. Om det överhuvudtaget var möjligt att emulera så många fjädrar som<br />

behövs på en fågel i realtid. Sedan behövde det beslutas om vilken interaktionsmetod<br />

som ska användas vid kamning och hur fjädrarnas placering ska gå till.<br />

De delmål som delprojektet delats in i bygger till stor del på föregående dels<br />

funktionalitet, en iterativ utvecklings och design process blev därför naturlig. Efter att<br />

första delen genomförts och ett antal möjliga manipulationsverktyg tagits fram<br />

gjordes en användarintervju och observation av användningen pälsverktyget i Maya<br />

av några texturerare på animeringsbyrån Fido.<br />

2.2.1 Iterativ design<br />

1988 föreslog Barry Bohem en utvecklingsprocess som han kallade för spiralmodellen<br />

vilken gick ut på att utvecklingen skedde i flera steg och varje steg bestod av flera<br />

återkommande faser. Till exempel börjar man med en riskanalys följt av en planerings<br />

fas och implementering (1). Figur 2 beskriver hur processen har sett ut under<br />

projektets gång. Spiralmodellen bygger på en iterativ utvecklingsprocess vilket här<br />

innebär att först sker en analys av vilka krav som ställs på produkten innan en<br />

planeringsfas genomförs som följs av en implementeringsdel. Sedan börjades det om<br />

med en analys huruvida de ställda kraven är uppfyllda och om nya krav behövs och så<br />

fortsätter det tills projektet är slutfört. För fjäderprojektet blev det fyra iterationer.<br />

För det här projektet gjordes först en målgruppsanalys och en uppställning av krav på<br />

lösningen. Vid planeringen bestämdes det sedan att några enkla verktyg behövde<br />

implementeras för att kunna undersöka olika interaktionsformer samt se om det var<br />

möjligt att påverka så många fjädrar via fysikmotorn i realtid. Vid resten av<br />

iterationerna utvärderades föregående implementering dessutom gjordes tre<br />

användaranalyser i form av en intervju, en observation och ett test av de utvecklade<br />

verktygen.<br />

Figur 2. Förenklad modell av den iterativa processen.


Att animera fjädrar och fjäll i Maya 5<br />

I varje iteration infördes ytterligare funktionalitet till lösningen. Först<br />

implementerades fysikemuleringen i Maya och sedan enklare verktyg för att kunna<br />

påverka fjädrarnas orientering. I fortsättningen kommer dessa verktyg att i rapporten<br />

refereras till som kamningsverktygen. I de två sista iterationerna implementerades<br />

möjligheten att påverka fjädrarna med hjälp av en mappad textur respektive<br />

simuleringen av fjädrarna för skapandet av animationen. Användaranalyserna skedde<br />

i de tre första iterationerna.<br />

3. 3d-animeringar<br />

En film består av en serie stillbilder som visade i följd ger en illusion av rörelse.<br />

Bilderna tas av en filmkamera med ett fixt tidsmellanrum mellan bilderna. Ofta tar<br />

man 24 bilder per sekund eftersom det anses vara vid den hastigheten eller högre<br />

som ögats luras. Om bilderna inte tas med en filmkamera. De kan till exempel vara<br />

tecknade eller fotograferade med en stillbildskamera. Om animatören förändrar<br />

scenen något mellan varje foto eller teckning kan han skapa en animation. Idag är det<br />

vanligt med datorgenererade animationer som är både 2- och 3-dimesionella. De<br />

vanligaste teknikerna är keyframing eller att jobba med bildruta per bildruta.<br />

Keyframing innebär att animatören instruerar programvaran om hur ett objekt i<br />

scenen ser ut i en start- och en målbild. Sedan skapar programvaran alla<br />

mellanliggande bildrutor genom interpolation. Tekniken fungerar endast på enkla<br />

rörelser eller om man gör många nyckelrutor och då blir det väldigt arbetsamt.<br />

När betraktaren ser en animerad film skapas en föreställning om vilka fysiska lagar<br />

som gäller i denfilmens värld. Allt eftersom filmen fortgår cementeras de regler som<br />

antas gälla. Om miljön består av människor, bilar och andra vardagliga saker förväntar<br />

sig publiken omedvetet att saker och ting ska bete sig enligt de fysiklagar som<br />

existerar i vår verklighet. Om en karaktär eller ett objekt bryter mot en massa av<br />

dessa lagar så sticker objektet eller karaktären ut och verkar inte riktigt passa in i<br />

miljön (2).<br />

Även om det är svårt att animera realistiska rörelser i en helt datoranimerad film så<br />

går det att förenkla och anpassa karaktärerna och miljöns utseende och utryck för att<br />

göra arbetet lättare. Ett exempel är att se till att filmen uppfattas som mer tecknad<br />

eftersom där inte finns lika stora förväntningar exaktheten i rörelser och liknande. I<br />

en produktion där man blandar både datoranimerade karaktärer och filmade ställs<br />

ännu större vikt på att rörelserna är naturliga. Publiken kan ju hela tiden jämföra de<br />

animerade karaktärerna med de filmade. Ännu värre blir problemet om de filmade<br />

karaktärerna interagerar med de animerade.


Att animera fjädrar och fjäll i Maya 6<br />

Idag har man börjat undersöka allt fler tekniker för att påskynda animeringsarbetet.<br />

Man har bland annat börjat utveckla datorstödd karaktärsanimering där användaren<br />

skapar en modell vilken riggas till ett skelett. Användaren behöver sedan bara<br />

instruera programmet vad man vill att karaktären ska göra som till exempel gå längs<br />

med en gata. Eller så räcker det med att styra en enstaka rörelse som att styra<br />

karaktärens hand att plocka upp ett glas så beräknar programstödet ut de resterande<br />

rörelserna som krävs. Bland annat hur lederna i armen rör sig och rörelser för att hålla<br />

balansen om glaset är tungt. Karaktärsanimering har bland annat Y. Abe och J.<br />

Popovi´c undersökt i (3). Den här utvecklingen är något som man på Craft Animations<br />

har tagit fasta på och man har utvecklat ett antal verktyg för att direkt animera bland<br />

annat fordon. Iden är att man i realtid styr fordonet eller vad det nu är man vill<br />

animera med hjälp av en styrkontroll som till exempelvis en joystick. Objektets<br />

rörelser sparas sedan bildruta per bildruta i ett 3d animeringsprogram som Maya och<br />

3d max studio. En annan teknik som växer fram är användandet av fysikmotorer för<br />

att simulera objektens rörelser på ett verklighetstroligt sätt.<br />

Att animera någonting som hår, päls och fjäderskrudar bildruta för bildruta är svårt.<br />

Den typen av strukturer består av flera tusen objekt och har ett väldigt komplicerat<br />

rörelsemönster. Istället har flera lösningar tagits fram som gör detta automatiskt vid<br />

renderingen av animationen. Nedan kommer ett mindre antal av lösningarna<br />

beskrivas och hur dessa har använts vid produktion av datoranimerade biofilmer.<br />

3.1. Päls och hår i animerad film<br />

En vanlig metod för att skapa detaljer på ett objekt är att koppla en textur eller ett<br />

mönster till ytan på objektet. Texturen kan vara antingen en matris av färgvärden, en<br />

bild till exempelvis. Texturen kan även vara en funktion av något slag som ändrar<br />

objektets färg till exempel en matematisk funktion. Ett enkelt sätt att skapa en<br />

illusion av hår är att använda en bild av hår eller päls och mappa denna som en textur<br />

till objektet. En texturs normaliserade rymd beskrivs på intervallet (1,0). En två<br />

dimensionell texturs koordinat anges då som U och V där både U och V är på<br />

intervallet (1,0). Att mappa en textur innebär att definiera vilket värde i texturen som<br />

varje polygon/face upptar i texturrymden. Att göra på detta sätt duger ofta till spel<br />

och liknande men ger inte ett tillräckligt bra resultat för att duga i filmer som strävar<br />

efter fotorealistiska karaktärer. (4)<br />

Inför produktionen av filmen King Kong 2005 utvecklade företaget Weta Digital ett<br />

nytt system för animering av päls. Med detta kunde man med hjälp av visuell<br />

programmering både skapa, frisera och animera pälsen. Visuell programmering<br />

innebär att man programmerar systemet genom manipulera grafiska element istället<br />

för genom text (4). Ett exempel på visuell programmering är användandet av<br />

wiredeformerar beskrivet nedan. Genom ett nätverk av deformeringsnoder i Maya


Att animera fjädrar och fjäll i Maya 7<br />

kunde man kontrollera varje hårstrå som växte fram på en yta. I det här fallet en<br />

subdivision yta, det vill säga en yta som vars geometri genomgåt en serie av<br />

utjämningar genom insättning av fler polygoner (5). Genom att låta håret växa rakt ut<br />

från ytan och därefter koppla samman en serie av deformeringsnoder styrde man<br />

hårets utseende och beteende. Deformeringsnoders funktion i Maya är att förändra<br />

en eller flera geometrier och/eller kurvor. Man la på flera lager av olika styreffekter<br />

som till exempelvis kamning, krusning eller att håret klumpar ihop sig.<br />

Kamningen eller riktningen av håret skapades med hjälp av hårsäcksdeformerare som<br />

drevs av målade texturer eller matematiska utryck. En hårsäcksdeformerare har i<br />

uppgift att ändra hur mycket och i vilken riktning som håret växer. Detaljer i hårstråna<br />

åstadkoms sedan genom att använda ytterligare deformerare. Flera nivåer av<br />

klumpningsdeformerare som gav olika stora klumpar av hår fanns att tillgå, och för<br />

att öka komplexiteten i pälsen använde man sig av deformerare som skapade ett<br />

intryck av en mer ovårdad päls.<br />

De kollisionsnoder man använde sig av hade i uppgift att se till så att hårstråna inte<br />

penetrerade geometrier som till exempel på Kongs rygg och ansikte där hårstråna<br />

skulle ligga tätt längsmed hudens yta.<br />

Genom att använda sig av wiredeformerare där animatören skapade en kurva som<br />

närliggande hårstrån drogs mot fick man en ökad kontroll, även här kunde flera<br />

nivåer av styrka användas. Hur en wiredeformerare fungerar syns i figur 3 där<br />

kurvorna följer den vita styrkurvan, wiredeformeraren.<br />

Figur 3. Wiredeformerare<br />

Tjockleken i Kongs päls gjorde det möjligt att använda sig av soft-body dynamik som<br />

sedan drev flera deformerare för att kunna animera rörelser i pälsen. Vind<br />

simulerades genom automatiskt skapade wiredeformerare (7).


Att animera fjädrar och fjäll i Maya 8<br />

Rythm and Hues hade aldrig jobbat med hår och päls i den utsträckning som krävdes<br />

för The Chronicles of Narnia och utvecklade därför en helt ny lösning för hår dynamik<br />

som uppfyllde deras krav. Efter att ha iakttagit vilda djur så som till exempelvis lejon<br />

insåg man två krav som ställdes på lösningen. Man såg att hårstråna som skulle<br />

animeras dels var styva och men också att de rörde sig i klumpar på grund av<br />

interaktionen sinsemellan. Man bestämde sig för att man behövde ett stelt system<br />

med hår-hår interaktion.<br />

För att simulera hårstråna använde man en massfjädermodell. Hårstråna fick bestå av<br />

en serie massnoder som representerade delmassan i ett segment.<br />

Figur 4. Linjär fjädring Figur 5. Vinkelberoende fjädring<br />

i massfjädermodellen. i massfjädermodellen.<br />

Noderna bands samman av två typer av fjädringar, linjära och vinkelberoende. De<br />

linjära fjädringarna ser till att hålla segmenten på konstant avstånd och den<br />

vinkelberoende ser till att upprätthålla den relativa orienteringen. I figur 4<br />

representerar linjerna som binder samman noderna den linjära fjädringen och bågen i<br />

figur 5 den vinkelberoende fjädringen. Alla massnoder har en vinkelberoende fjädring<br />

i förhållande till föregående nod även om bara en är utritad i figuren. Den här<br />

lösningen kunde hantera tusentals hårstrån på en sekund per bild om man<br />

utelämnade kollisionsdetektionen och hår-hår interaktionen. Det visade sig att full<br />

kollisionsdetektion och hår-hår interaktion skulle kräva 95 % av beräkningstiden. Ett<br />

tusental hårstrån simulerades istället och sedan fick varje hårstrå representera en<br />

volym av hårstrån som skulle renderas. På så sätt kunde man rendera miljontals med<br />

hårstrån.<br />

Två typer av kollisionsdetektion fanns i systemet Dels mellan hårstrån och andra<br />

objekt i scenen och dessutom för kollisioner mellan hårstrån. Kollisioner mellan andra<br />

objekt löstes på ett traditionellt sätt med standardmetoder som till exempelvis<br />

spatial hashning och AABB uppdelning där objektens geometrier angavs som<br />

kollisions ytor. Problem kunde uppstå om kollisionsobjekten klämdes fast mellan<br />

varandra eller om hårets hårsäckar hamnade under ytan av föremålet som karaktären


Att animera fjädrar och fjäll i Maya 9<br />

låg eller släpades ovanpå. Flera metoder användes för att lösa dessa problem.<br />

Antingen kunde renderaren frysa områden där hårstråna börja bete sig märkligt<br />

alternativt kunde en medelrörelse tas ut. Ibland så skulpterades kollisionsobjektets<br />

yta om så att problem områdena försvann.<br />

Eftersom simulationen fungerade genom att ha ett antal nyckelstrån som<br />

representerade en viss volym av hårstrån och man ville simulera hår-hår interaktion<br />

var det viktigt att dessa volymer inte penetrerade varandra. Genom att införa<br />

ytterligare en fjäderkraft mellan hår som var i närheten av varandra undvek man<br />

problemet. Kraften bestämdes av variabler som avstånd, relativ rörelsehastighet och<br />

användarspecificerad hår-hår interaktionen. För att simulera vind använde man sig av<br />

två verktyg. Det ena tillförde en rörelsekraft med en slumpmässig variation i riktning<br />

med vinden på nyckelhåren. Det andra gav en viss kontroll av enstaka hårstråns<br />

rörelse.<br />

3.2. Fjäderuppbyggnaden<br />

För att kunna skapa en lösning som ger verklighetstrogna animeringar av<br />

fjäderskrudar och fjädrarnas rörelser behövs en förståelse av hur en fjäder och<br />

fjäderskrud är uppbyggd. Det finns sex typer av fjädrar och vi kommer här beskriva de<br />

två huvudtyperna kontur- och dunfjädrar samt borst. I figur 6 kan du se exempel på<br />

fyra olika fjädrar. En genomsnittlig fågel har cirka 2 500 fjädrar, en ladusvala har cirka<br />

1 500 fjädrar och en sångsvan har cirka 25 000 (5).<br />

Figur 6. Från vänster till höger har vi en konturfjäder, dunfjäder och två stycken borst.


Att animera fjädrar och fjäll i Maya 10<br />

Först måste vi reda ut lite anatomiska begrepp. En fjäder består av tre<br />

huvudkomponenter, fjäderpenna, spole och fanstrålar. Fjäderpennnan är den mest<br />

proximala delen av spolen och är den delen av fjädern och som fäster i fågeln via<br />

fjädersäcken se figur 7. På spolen växer sedan fanstrålarna snett ut på båda sidorna.<br />

Fanstrålarna fäster sedan i varandra med hjälp av bistrålar med små hakar och bildar<br />

en plan yta som kallas fan. Det är på grund av avsaknaden av de små hakarna som<br />

fanstrålarna i dunet spretar, även proximalt på konturfjädrarna saknas dessa hakar<br />

(5) (9).<br />

3<br />

4<br />

2<br />

Figur 7. Fjäderns anatomiska benämningar.<br />

1. fanstråle, 2. fan, 3. spole, 4. fjäderpenna.<br />

Begreppen som kommer användas i den här rapporten för läges- och<br />

riktningsbeskrivningar är proximalt och distalt för att beskrivar den relativa<br />

positionen längs med fjäderns längd. Proximalt innebär nära fågelns kropp. Anterior<br />

är den sida av fjädern som befinner sig framåt eller utåt från fågeln och posterior är<br />

motsatsen. Ventralt innebär inåt mot fågeln dvs. undersidan av fjädern och dorsalt är<br />

ovansidan av fjädern, den sida som syns mest. Den dorsala kammen blir då spolens<br />

ovansida och den ventrala kammen innebär spolens undersida, se figur 8.<br />

1<br />

Distalt<br />

Proximalt


Att animera fjädrar och fjäll i Maya 11<br />

Figur 8. Schematiskvy över fjäderstrukturen.<br />

1. distal bistråle, 2. proximal bistråle, 3. fanstråle, 4. dorsal kam, 5. ventral kam, 6. spole<br />

Konturfjädrar kallas de större fjädrarna som har en kraftig spole. De har också<br />

fanstrålar som har bistrålar med hakar. Det är konturfjädrar som sitter på fågelns<br />

vingar. Och det är den här typen av fjädrar som projektet i huvudsak syftar till att<br />

simulera. Den andra huvudtypen dunfjädrar saknar ofta eller har an klen spole. Dess<br />

fanstrålar saknar dessutom hakar på bistrålarna. Dunets huvudsyfte på en fågel är att<br />

fungera som ett isolerande lager. Det går i animeringssammanhang ofta bra att<br />

använda sig av päls för att få ett dunliknande utseende. Förutom dessa två typer av<br />

fjädrar finns det flera mellanting, som till exempelvis borst som är en dunliknande<br />

fjäder med kraftig spole. Borsten saknar de flesta fanstrålarna utom ett fåtal antingen<br />

poximalt eller distalt på spolen. Oftast sitter denna typ av fjädrar runt ögonen som<br />

skydd. I figur 6 går det att se exempel på hur dessa fjädrar kan se ut (9).<br />

3.3. Fjädrar i animerad film<br />

Vid produktionen av Stuart Little 2 ställdes Sony Pictures Imageworks inför dilemmat<br />

om huruvida man skulle fuska med fjädrarna på fågelkaraktärerna i filmen eller<br />

använda sig av kompletta geometrier som fjädrar. Delvis på grund av att filmen<br />

filmades i den traditionella bemärkelsen med filmkamera och sedan hade ett flertal<br />

animerade karaktärer inlagda efteråt ställdes höga krav på realismen i animationerna.<br />

Man ansåg därför att alternativet att måla på fjädrarna med hjälp av texturer och<br />

liknande inte var aktuellt. Man behövde dessutom möjligheten att låta fjädrarna<br />

interagera med vind och föremål i scenen (2).


Att animera fjädrar och fjäll i Maya 12<br />

Skillnaden mellan hår och fjädrar är att det mänskliga ögat inte kan skilja på enstaka<br />

hårstrån såvida man inte tittar på ett specifikt hårstrå. För hår och päls gör det inget<br />

om de penetrerar varandra, tillskillnad från fjädrar som är betydligt bredare och<br />

tydligt urskiljbara.<br />

För att skapa fjäderskrudarna i Stuart Little 2 använde man sig av päls för de allra<br />

finaste fjädrarna och lät dem övergå till större geometriska fjädrar där det behövdes.<br />

Man använde sig av 3 082 fjädrar och ungefär 70 000 hårstrån till karaktären Margalo.<br />

För att definiera en fjäder använde man sig av över hundra parametrar vilka<br />

kopplades till lika många gråskaletexturer för modellen. Några av parametrarna var<br />

längd, bredd, antalet fanstrålar, spolens kurvatur och hur sprucken den är.<br />

På en riktig fågel är fjädrarna placerade i rader som löper ner längs sidan på fågeln<br />

förutom på halsen där en stor mängd fjädrar sticker rakt ut. Vid skapandet av<br />

fjädersystemet för filmen ansåg man det inte nödvändigt att exakt kopiera sättet<br />

fjädrarna var placerade på fågeln utan det räckte med att de täckte modellen.<br />

Flygfjädrarna placerades ut separat efteråt.<br />

Placeringen av fjädrarna löste man genom att använda sig av en metod som kallas<br />

”particle repulsion”. På ytan placerades lika många partiklar/punkter som fjädrar som<br />

skulle placeras ut. Partiklarna stöter ifrån varandra så att det sker en jämn fördelning<br />

av partiklarna över ytan. I avsnitt 6.1 finns en djupare beskrivning av en optimerad<br />

variant av metoden. Nackdelarna med metoden var för det första att den var<br />

utvecklad för implicita ytor och modellerna av karaktärerna i filmen bestod av flera<br />

NURBS ytor som sattes samman. Man blev då tvungen att göra om delar av metoden<br />

för att klara av sammansatta NURBS ytor. Den andra nackdelen vara att man endast<br />

fick ut en likformig fördelning av fjädrarna på ytan. Vilket gjorde att algoritmen fick<br />

anpassa något. ”Particle repulsion” användes endast till utplaceringen av fjädrarna<br />

och inte hårstrån.<br />

Problemet med att fjädrarna penetrerar varandra eller modellens hud blev extra<br />

tydligt på karaktären Falcon vars fjäderskrud hade en varierande teckning vilket<br />

gjorde penetration extra synbar. Margalo som hade samma färg på fjädrarna över<br />

stora delar av kroppen var det inte ett lika stort problem med. Precis som med päls<br />

utnyttjade man en hundratals nyckelkurvor som placerades ut på modellen. Sedan<br />

interpolerades nya mellan nyckelkurvorna så att tusentals kurvor kunde skapas<br />

automatiskt. Dessa kurvor motsvarade fjädrarnas spole.<br />

Problemet var att det på vissa ställen penetrerade fjädrarna ytan på modellen när<br />

modellen rörde på sig. I figur 9 illustreras i ett tvärsnitt hur penetration uppstår när<br />

hänsyn endast tas till nyckelkurvornas orientering och kurvatur i bakgrunden syns<br />

objektet innan det ändrat form på grund av rörelse. Lösningen blev att man även<br />

använde sig av information om kurvans höjd ovanför ytan den var fäst på, se figur 10.


Att animera fjädrar och fjäll i Maya 13<br />

Figur 9. Även om kurvornas lutning följer Figur 10. Varje punkt i kurvan hålls på<br />

med ytans förändring sker penetration. konstant avstånd ovanför ytan.<br />

Nu följde fjädrarna med hudens rörelse utan att penetrera den och låg på konstant<br />

avstånd från en punkt på ytan. Men fjädrarna penetrerade fortfarande varandra och<br />

de vred sig konstigt, till exempelvis på fågelns hals när den vred på huvudet. Den<br />

streckade fjädern i Figur 11 visar en fjäder som vridit sig på ett felaktigt sätt relativt<br />

resten av gruppen.<br />

Kontrollpunkt<br />

Figur 11. Oönskad vridning av fjädern. Figur 12. Fanens geometri beskrivs med hjälp<br />

av kontrollpunkter<br />

Man byggde då vidare på metoden att hålla reda på spolkurvans höjd över ytan till<br />

fjäderns kontrollpunkter. Fjäderns kontrollpunkter är de punkter på fjädern som<br />

beskriver geometrin på fanen se figur 12. Nu låste man inte avståndet till ytan på en<br />

punkt till punkt basis som i fallet med spolkurvan. Istället såg man till att avståndet<br />

mellan kontrollpunkterna och ytan hölls konstant. Man blev då av med problemet att<br />

fjädrarna kunde vrida sig ut från ytan och samtidigt minimerade man även mängden<br />

penetration fjädrarna emellan till en acceptabel nivå (2).<br />

Inför filmen kammades varje fågel av en grafiker, han la för hand varje fjäder till rätta.<br />

Efter att detta gjorts en gång krävdes det en minimal insats av kamning inför varje<br />

scen. För kamningen fanns det verktyg som kunde vrida eller ändra riktning på<br />

enstaka fjädrar samt öka/minska böjningen.


Att animera fjädrar och fjäll i Maya 14<br />

Till Maya finns det en populär plugin skapad av Joe Alter (10) som kallas för ”Shave<br />

and a haircut” för animering av hår och päls. ”Shave and a haircut” använder sig av<br />

nyckelkurvor för kamning av pälsen/frisyren. Den är en ofta använd plugin av<br />

animationsbyråer som inte har behov/möjlighet till en egen lösning och det är samma<br />

användare som utgör målgruppen för det här fjäderprojektet, eftersom det inte finns<br />

någon motsvarande lösning för fjädrar.<br />

4. Fysikmotorn<br />

Utvecklingen av fysikmotorer drivs framåt av spelindustrin som vill ha mer realistiska<br />

spel. Ett sätt att uppnå det är att låta objekten i spelet interagera med varandra på<br />

ett fysikaliskt korrekt sätt. Låt säga att man skjuter på en plåtburk eller att en massa<br />

stockar rullar ner för en sluttning. Det går att programmera så att burken till<br />

exempelvis flyger upp i luften när den blir träffad, eller ge varje stock ett<br />

rörelsemönster att följa som ser realistiskt ut. Nackdelen är att burken flyger likadant<br />

oavsett var den blir träffad och stockarna rullar på samma vid även om spelaren står i<br />

vägen för dem. En fysik motor har i huvudsak tre uppgifter (11).<br />

Upptäcka kollisioner<br />

Lösa restriktioner som till exempel Newtons lagar och leder<br />

Uppdatera systemet genom att beräkna systemets nya tillstånd<br />

4.1. Kollisionsdetektionen<br />

För att veta huruvida två objekt rör vid varandra och därmed påverkar varandra<br />

behöver fysikmotorn utföra en stor mängd beräkningar för varje objekt.<br />

Kollisionsdetektionen är den del av fysikmotorn som tar mest beräkningskraft, ofta<br />

omkring 90 % av beräkningstiden. I värsta fall blir det (n-1)n/2 kollisionspar för test av<br />

penetration/intersektion där n är antalet objekt. Det blir snabbt en stor mängd tester.<br />

För 2 500 fjädrar behövs 3 123 750 tester per systemuppdatering om varje fjäder<br />

endast består av ett kollisionsobjekt.<br />

Det finns ett flertal tekniker för att minska antalet beräkningar. Alla teknikerna<br />

bygger på samma grundidé, nämligen att genom flera steg minska antalet möjliga<br />

kollisionspar genom att gå från mindre till mer komplexa och beräkningstunga<br />

metoder.<br />

Ett första steg är ofta att ta reda på vilka kollisionspar som är möjliga, en vanlig<br />

metod för det är att göra en spatialuppdelning av kollisionsrymden. Det finns flera<br />

olika sätt att göra detta på bland annat Optimized Spatial Hashing som här används<br />

vid utplaceringen av fjädrarna och för att avgöra om en fjäder ligger inom<br />

påverkningsbart avstånd från kamningsverktygen.


Att animera fjädrar och fjäll i Maya 15<br />

Sedan fortsätter man med mer komplicerade tester som till exempelvis att testa om<br />

ett objekts alla vertexar (cirklarna i figur 13) ligger på framsidan av de plan som det<br />

andra objektets polygoner spänner upp. I fallet beskrivet i figur 13 har det alltså inte<br />

skett någon kollision.<br />

Figur 13. Kollisionstest mellan två kuber.<br />

I varje steg utesluts allt fler kollisionspar tills man kommer till sista steget. Då<br />

kontrolleras om de verkligen har kolliderat eller ej.<br />

Andra sätt att minska antalet kollisionspar är att definiera flera kollisionsgrupper där<br />

kollisioner endast kan ske mellan objekt i samma grupp. Eller att tillfälligt inaktivera<br />

kollisioner för vissa objekt under ett begränsat antal tidssteg (11).<br />

4.2. Restriktioner<br />

Fysikmotorn behöver lösa flera olika sorters restriktioner för hur krafterna verkar på<br />

objekten. De mest grundläggande är Newtons lagar vilka bland annat påverkar<br />

objektens acceleration och kollisionskrafterna. Sedan finns restriktioner som till<br />

exempelvis leder, fjädringar och friktion.<br />

Här nedan visas i figur 14 exempel på några olika leder. Förutom att begränsa<br />

objektets rörelseomfång kan lederna även innehålla en fjädringseffekt vilket syns i<br />

form av den grå gummidelen i leden i figur 14. Denna led föreställer den typ av led<br />

vilken fungerar som fågelfjädrarnas fjädersäck och -penna (9).


Att animera fjädrar och fjäll i Maya 16<br />

Figur 14. Olika typer av leder i fysikmotorn.<br />

4.3. Uppdatering av systemet<br />

Till skillnad från i verkligheten så sker inte en kontinuerlig rörelse av objekten utan<br />

simuleringen sker i diskreta tidssteg. Givet ett objekts tillstånd såsom positionen och<br />

krafter som verkar på objektet kan dess tillstånd vid en annan tidpunkt approximeras.<br />

Approximationen sker genom integration av ett antal differentialekvationer som<br />

beskriver objektens rörelser. Det fins flera olika numeriska metoder för lösningen<br />

med olika prestanda och precision (11).<br />

4.4. Ageie PhysX<br />

Fysikmotorn som används i det här arbetet är Agiea PhysX vilket är en kommersiell<br />

fysikmotor med möjlighet till hårdvaruacceleration via en PPU (Physics Processor<br />

Unit) ansluten till PCI-porten. Versionen som har använts är 2.6.2. Den har används för<br />

fysik simulering av fjädrarna i form av stela objekt och leder. Beroende på hur<br />

noggrann approximation av fjädern som önskades används olika många<br />

kollisionsprimitiver och leder. Se figur 15 för de fyra första detaljnivåerna. De<br />

blåa/mörkare delarna är kollisionsobjekt och de gula/ljusa leder.<br />

Ageia PhysX består av ett C++ API med vilket man skapar en scen i vilken sedan<br />

initierar de objekt man vill simulera. Scenen existerar och exekveras separat från<br />

resten av lösningen i det här fallet separat från Maya. Kommunikationen mellan<br />

scenen/fysikmotorn och Maya sker i tre steg. Först anropas motorn för att instruera<br />

den om hur lång tid som ska simuleras och sedan ber man att objekten i scenen<br />

uppdateras med deras nya tillstånd. Förfrågan kan ske antingen genom att låsa<br />

exekveringen av programmet tills resultatet är färdigberäknat eller genom att loopa<br />

runt förfrågningsraden tills ett resultat returneras. I loopen kan man göra andra<br />

beräkningar medans resultat beräknas. Slutligen när objektens tillstånd uppdaterats<br />

går det att hämta information om aktuellt tillstånd. Om man väljer att utnyttja


Att animera fjädrar och fjäll i Maya 17<br />

hårdvaruacceleration är den begränsad till 4 000 primitiver i scenen om alla steg i<br />

kollsionsdetektionen ska acceleras och 64 000 primitiver om första steget inte<br />

accelereras (9). Detta innebär att för simuleringen av fjädrarna kan inte första steget<br />

accelereras eftersom vår modell kan innehålla över 2 500 fjädrar med minst två leder<br />

och tre objekt.<br />

Figur 15. Fyra olika mycket detaljerade fjäderobjekt i fysikmotorn.<br />

5. Maya ©<br />

Maya är en modellerings- och animeringsmiljö för 3D utvecklat av Alias|Wavefront. På<br />

marknaden finns idag en mängd verktyg och program för att producera 3D<br />

animationer. Den snabba utvecklingen inom animeringsbranschen innebär att det<br />

snabbt och ofta kommer ut nya program och uppdateringar av befintliga verktyg.<br />

Utvecklarna på Alias|Wavefront insåg att de omöjligen skulle kunna tillgodose varje<br />

användare med alla funktionaliteter och förmågor som de skulle kunna tänkas vilja<br />

ha. De satsade istället på att göra det möjligt för användaren att anpassa och utveckla<br />

paketet som denne ville. Både genom att ändra användargränssnittet och genom att<br />

lägga till nya funktioner.


Att animera fjädrar och fjäll i Maya 18<br />

Den stora skillnaden med Maya gemfört med andra 3D-program är att man valt att i<br />

stället för att scenen representerar en mängd objekt så representerar scenen i Maya<br />

istället ett nätverk med noder som kallas för dependecygrafen. Ett exempel på hur<br />

dependecygrafen kan se ut ses i figur 15. Dessa noder har olika funktioner såsom till<br />

exempelvis en formförändring eller position och tillsammans utgör noderna objekten<br />

i scenen.<br />

5.1. Mayas gränssnitt<br />

Vad som händer när användaren interagerar med Mayas användargränssnitt är att ett<br />

MEL kommando exekveras. MEL är Mayas script språk. Användargränssnittet är<br />

egentligen bara en visualisering av de kommandon som används för att styra Maya.<br />

De flesta kommandona påverkar dependencygrafen vilken kan ses som själva scenen<br />

och innehåller all data som behövs för att beskriva 3D-världen såsom objekt,<br />

animeringar, dynamik, ljus och så vidare. Användargränssnittet är helt<br />

anpassningsbar . Det är till och med möjligt att jobba med endast en<br />

kommandoprompt som användargränssnitt.<br />

5.2. Dependencygrafen och Mayanoder<br />

För att kunna utnyttja Maya fullt ut behöver användaren förstå den underliggande<br />

metodiken och strukturen i Maya. För en utvecklare är detta en nödvändighet. Istället<br />

för att använda det traditionella modulera angreppssättet vid utvecklingen av Maya<br />

har man utnyttjat ett perspektiv där man kollar på flödet av data genom en serie<br />

operationer. Du kan till exempel stoppa in en 3D-modell i ena sidan och få ut en<br />

mängd pixlar på andra. Data som kommer ut behöver alltså inte vara av samma typ<br />

som stoppades in. Mayas kärna är implementerad enligt detta paradigm i form av<br />

dependecygrafen. Paradigmet är dock modifierat enligt en ”push-pull” modell.<br />

Byggstenarna i grafen är en mängd noder som kopplas samman. Varje nod har ett<br />

antal in och ut parametrar och varje nod har dessutom en mindre deluppgift i hela<br />

grafen. En transformationsnod har till exempel i uppgift att multiplicera objektet med<br />

en transformationsmatris som beräknas utifrån nodens invariabler som rotation,<br />

förflyttning med mera.<br />

För att göra en mer komplicerad förändring av indata behövs ett nätverk av noder. All<br />

funktionalitet i som modellering, animation, texturering och dynamik i Maya skapas<br />

med hjälp av sådana nätverk av noder. Redan efter ett fåtal operationer har antalet<br />

noder i dependecygrafen i figur 16 blivit påfallande många (13).


Att animera fjädrar och fjäll i Maya 19<br />

Figur 16. Dependecygrafen.<br />

Vill man lägga ytterligare funktionalitet till Maya så skapas en ny typ av nod och ett<br />

MEL kommando för att koppla upp noden i grafen. Sedan kan gränssnittet byggas ut<br />

så att det inkluderar det nya kommandot. På så sätt kan man bygga ut Maya utan att<br />

det syns för användaren att funktionen inte var något som följde med Maya från<br />

början.<br />

5.2.1. Scenen<br />

När man pratar om scenen i 3D-animerings sammanhang menar man modellerna,<br />

animeringarna, ljusen, texturerna kamerorna och övrig information som behövs för<br />

renderingen. I Maya består scenen av dependencygrafen och det data som lagras<br />

internt i varje nod. Traditionellt brukar dock scenen lagras i en databas med objekten.<br />

I en sådan databas är lätt att slå upp t.ex. alla ljuskällor. Den dynamiska naturen som<br />

följer av dependencygrafens uppbyggnad gör samma uppgift betydligt svårare.<br />

Programmeringsinterfacet gör å andra sidan att man som programmerare inte<br />

behöver känna till varje detalj runt uppbyggnaden av dependecygrafen men en<br />

övergripande förståelse för hur scenen lagras gör det lättare att skapa effektiva<br />

tillämpningar för Maya.<br />

5.2.2. Dataflödet<br />

Dataflödet i Maya går till så att det för varje attribut i en nod finns det en flagga som<br />

säger om värdet är aktuellt eller inte. Dessutom innehåller varje nod en tabell över<br />

vilka inattribut som påverkar vilka utattribut. Så fort ett utattribut anses inaktuellt<br />

undersöker Maya vilka noder som är anslutna till attributet och noterar att även de till<br />

det inaktuella utatributet anslutna inattributen är inaktuella. På så sätt sprids<br />

informationen vidare genom grafen, och då vet Maya vilka attribut som behöver<br />

räknas om. Men värdet beräknas inte om förrän det aktuella värdet efterfrågats.<br />

Dataflödet i Maya är välbeskrivet av D. Gould i (13). I figur 17 syns hur dataflödet ser ut<br />

vida skapandet av en kub. PolyCube1 skickar vidare data som behövs för att noden<br />

pCubeShape1 ska kunna skapa en mesh i form av en kub. Meshen skickas sedan<br />

vidare till initialShadingGroup som skuggar och färglägger kuben så att den syns vid<br />

rendering och i viewporten.


Att animera fjädrar och fjäll i Maya 20<br />

Figur 17. Dataflödet mellan noder i Maya vissualiserat i dependecygrafen.<br />

5.2.3 Noden<br />

Varje nod består av en uppsättning in- och utvärden. Egenskaperna som dessa värden<br />

representerar refereras till som nodens attribut. Till exempel vis håller attributet<br />

rotateX rotationsmängden runt X-axeln. Den enkla noden i figur 18 har två attribut,<br />

input och output. Även om det inte visualiseras i Maya har alla noder också en<br />

funktion compute(). Funktionen Compute() har i uppdrag att utifrån en eller fler<br />

inattribut beräkna en eller flera utattribut.<br />

enkelNod<br />

input<br />

output<br />

compute()<br />

Figur 18. En Enkelnod.<br />

Tänk dig den nod som beskrivs i figur 19. Den har två attribut cirkelRadie och<br />

cirkelArea. Båda attributen håller en double, det finns inget som indikerar om de är<br />

input- eller outputattribut. Men eftersom en cirkels area är beroende av radien och<br />

vice versa så kan man mistänka att de är beroende på varandra. Skulle radien<br />

förändras är inte längre det lagrade värdet i areaattributet aktuellt. Skulle en annan<br />

nod ansluten till area attributet fråga efter aktuellt värde så behöver det beräknas via<br />

computefunktionen.


Att animera fjädrar och fjäll i Maya 21<br />

Figur 19. Cirkelnod.<br />

En nods attribut kan vara en primitiv datatyp såsom integer, string, double, bolean<br />

också vidare eller så kan det vara något mer komplicerad data som till exempelvis en<br />

mesh eller beizerkurva. Det kan också vara ett enstaka värde eller en serie av värden.<br />

Vilka attribut som påverkar vilka andra definieras när noden skapas, likaså om man<br />

läsa, skriva till eller både och från attributet.<br />

5.3. Quaternioner i Maya<br />

Quaternioner är ett kraftfullt sätt att representera rotationer på ett mer kompakt<br />

sätt. I Maya APIn finns det en klass som hanterar quaternioner inklusive<br />

sammanslagning av och interpolation mellan två quaternioner. Det är också möjligt<br />

att ange ett objekts orientering med hjälp av en quaternion.<br />

Quaternioner är hyperkomplexa tal och har ett 4 dimensionellt vektorrum. En<br />

quaternion anges här på formen<br />

eller<br />

q = (q0, w), där w = (q1,,q2, q3)<br />

q = q0 + iq1 + jq2 + kq3<br />

Här är q0 skalärdelen och w är vektordelen. Talbaserna i, j, k är imaginära och för dem<br />

gäller följande samband<br />

i 2 = j 2 = k 2 = ijk = -1<br />

ij = -ji = k<br />

jk = -kj = i<br />

ik = -ki = j<br />

cirkel<br />

cirkelRadie<br />

cirkelArea<br />

compute()<br />

Den viktigaste tillämpningen av quaternioner på senare tid är att representera<br />

rotationer i 3 dimensioner. Den konventionella metoden att beskriva rotationen med<br />

en serie eulervinklar. Dessa eulervinklar är rotations mängden runt tre oberoende<br />

axlar. Enligt en välkänd eulersats är det möjligt att genomföra vilken rotation som<br />

helst av en kropp runt en punkt som en enda rotation runt en axel som passerar<br />

genom punkten. Denna rotation går att beskriva i form av en quaternion där<br />

vektordelen är axeln som rotationen sker runt och skalären är mängden av rotation.


Att animera fjädrar och fjäll i Maya 22<br />

Det beror främst på tre egenskaper att quaternioner ofta är att föredra framför<br />

eulervinklar för att representera rotationer. Första orsaken är quaternioner är<br />

kompaktare och bara består av 4 element istället för 9. Det är bland annat detta som<br />

gör att antalet beräkningar minskar till 60 % när man slår ihop två rotationer med<br />

hjälp av en multiplikation. Men framförallt så slipper man oroa sig för gimbal-locks.<br />

Gimbal-locks är ett känt fenomen som innebär att man kan förlora en eller flera<br />

frihetsgrader vid användandet av eulervinklar på grund av singularitetsproblem.<br />

Ytterligare en födel är möjligheten att interpolera mellan två quaternioner och då ta<br />

den kortaste vägen. Se Mukundas arbete (14) för formler och härledningar till hur en<br />

quaternion beräknas samt används.<br />

6. Användarutvärderingar<br />

Utvärderingarna har gjorts vid tre tillfällen. Dels via användarintervjuer och<br />

observationen av hur verktyget ”Shave and a haircut” användes professionellt för att<br />

skapa päls på djur genomfördes på animeringsbyrån Fido i Stockholm. Och dels via<br />

ett enkelt användartest av kamningsverktygen som genomfördes på Craft<br />

Animations kontor i Göteborg. Syftet med användarutvärderingarna var dels att ta<br />

reda på vilka behov som fjäderlösningen syftade till att uppfylla och dels vilken<br />

interaktionsform som passade att använda sig av.<br />

6.1. Användarintervju<br />

Det var framförallt tre texturerare på Fido som intervjuades. Det som frågades om<br />

var bland annat vilka förväntningar de hade på den här typen av verktyg och vad det<br />

absolut var tvunget att klara av. Det var också intressant att få reda på vilka lösningar<br />

som idag används till att animera päls och vad de tyckte om dessa. Andra frågor som<br />

dök upp angick hur de skulle kunna tänka sig interagera med ett system för kamning<br />

av fjädrar. Besöket pågick under en halv dag.<br />

De hade inga preferenser för hur de skulle kunna tänka sig att interaktionen skulle gå<br />

till men tyckte att resonemanget om att kamma fjädrarna i realtid för att man direkt<br />

skulle se resultatet lät vettigt.<br />

Texturerarna tyckte vidare att det var nödvändigt att kunna lägga till både<br />

slumpmässig och kontrollerad variation i fjädrarnas utseende så inte alla fjädrar såg<br />

likadana ut. De föreslog ett flertal tekniker så som bland annat texturering och shape<br />

blending. Shape blending innebar att man blandar två former/geometrier och får ut<br />

en tredje. Det är då möjligt att ställa in vilken av original geometrierna den nya skulle<br />

likna mest och hur mycket mer den skulle likna den.


Att animera fjädrar och fjäll i Maya 23<br />

Ett väl använt verktyg för animering av päls berättade de var Joe Alters (10) ”Shave<br />

and a haircut”. De var tydligen väldigt nöjda med kraften och effektiviteten i detta<br />

verktyg.<br />

6.2. Observation vid användandet av ”Shave and a haircut”<br />

Vid nästa besök på Fido visade en av texturerarna hur de jobbade med animation av<br />

päls. Verktyget de använde sig av var ”Shave and a haircut” och det utnyttjar<br />

nyckelkurvor vilka beskrev hårstrån på djurets kropp. På varje djur använde man sig<br />

av 50-100 sådana nyckelkurvor och sedan kunde flera tusen hårstrån genereras.<br />

Man använde sig av lager på lager med olika sorters hår. Till varje lager hade man en<br />

uppsättning med texturer som beskrev saker som tätheten, färgen och tjockleken på<br />

håren.<br />

Han visade på problemen som kunde uppstå eftersom interpolationen av<br />

nyckelkurvorna skedde i världskoordinater istället för i förhållande till ytans normal.<br />

Men visade också fördelarna om man till exempel vill skapa en frisyr på en människa<br />

med mycket hårprodukter typ stubb eller en mangafrisyr.<br />

En annan sak som han visade upp var hur man jobbar med mappning av texturer och<br />

han förklarade att mappningen av texturer inte var något som ett nytt system<br />

behövde sköta. Det var snarare så att systemet inte fick sköta det eftersom det var<br />

något textureraren ville ha full kontroll över och var van vid att göra för hand.<br />

6.3. Användartest<br />

Något avancerat användartest på första versionen av verktyg behövde aldrig göras.<br />

Orsaken var att när kamningsverktygen var klara gjordes en väldigt preliminärt test av<br />

verktygen av två medarbetare på Craft Animations. Testet gick ut på att kamma en<br />

plan yta samt en sfär med verktygen och det insågs direkt att det inte alls var lämpligt<br />

att använda sig av den här formen av kamningsverktyg. Beslutet blev då att istället<br />

satsa på den beprövade metoden med nyckelkurvor som på ett eller annat sätt<br />

återfinns i alla lösningar för hår, päls och fjäder animation som stöts på under arbetet<br />

med projektet. Den nya metoden att kontrollera fjädrarna har dock inte hunnits med<br />

att utvärdera i någon större grad men är betydligt effektivare och exaktare än den<br />

första metoden.<br />

7. Interaktionsform för kamning<br />

Vid kamningen av fjädrar ansågs det finnas ett intresse av att påverka fjädrarnas<br />

orientering och kurvatur i realtid. Både på enskilda fjädrar eller på en mängd av<br />

fjädrar. Detta ansågs intressant dels för att behålla företagets nisch med inriktning på<br />

animeringsverktyg i realtid, men främst på grund av antagandet att om användaren<br />

hela tiden kan se det färdiga resultatet av kamningen så går det både snabbare och


Att animera fjädrar och fjäll i Maya 24<br />

smidigare att uppnå önskat resultat eftersom man då skulle slippa gå via renderings-<br />

/simuleringssteget.<br />

För det system som byggts under projektet gäller följande angående fjäderns<br />

koordinatsystem. Det är uppbyggt på så sätt att Y-axeln rör sig distalt från<br />

fjäderpennan upp mot fjäderns spets, X-axeln går i längs med fanstrålarna posteriort<br />

och Z-axeln rör sig ventralt från fjädern. Rotationspunkten ligger i spetsen på<br />

fjäderpennan. Koordinatsystemet visas i figur 20.<br />

Figur 20. Koordinatsystemet som<br />

använts för fjädrarna i projektet.<br />

Det är endast nödvändigt att rotera i två axlar eftersom det endast är i specialfall man<br />

skulle vilja vrida fjädern på ett sådant sätt att den inte låg med<br />

undersidan/ventralakammen längs med den ytan den är fäst på. När fjäderns<br />

orientering sätts roteras den alltid först runt Y-axeln och sedan runt X-axeln oavsett i<br />

vilken ordning användaren anger dem. Man låter inte systemet vrida fjädern runt<br />

fjäderns z-axel. Vid produktionen av ”Stuart Little 2” löste man istället problemet<br />

med fjädrar som vred sig ut i från ytan genom låsning av avståndet mellan fjäderns<br />

kontrollpunkter och ytan. Hur den oönskade vridningen ser ut beskrivs i figur 12.<br />

Tre olika orienteringslägen ansåg behövas för att bestämma hur fjäderns orientering<br />

förändras. De tre lägen beskriv i figur 21 och är:<br />

Lutning , vinkeln fjädern är fäst i ytan med ändras.<br />

Riktning , förändring av vilket håll fjädern ska lutas.<br />

Både lutning och riktning.<br />

y<br />

z<br />

x


Att animera fjädrar och fjäll i Maya 25<br />

Figur 21. De tre orienteringslägena är från vänster till höger,endast lutning, endast<br />

riktning samt både lutning och riktning.<br />

7.1. Direktmanipulering<br />

Första ansatsen till att ta fram ett verktyg för kamning av fjäderskruden var att<br />

använda direktmanipulation genom att låta någon form av verktyg påverka en eller<br />

flera fjädrar i viewporten. Viewporten är det fönster i Maya där man ser en förenklad<br />

3D-representation av scenen. Det fanns två huvudsakliga orsaker till att det var ett<br />

naturligt val. Den första orsaken var att ur ett rent användarperspektiv anses<br />

direktmanipulation ofta underlätta inlärningen och kan ge en bättre förståelse till hur<br />

systemet fungerar (14). Den andra orsaken var önskan att i realtid kunna se hur<br />

fjäderskruden förändrade sig under kamningen och då kändes direktmanipulation<br />

som ett naturligt val. En brainstorming över vilka ett egenskaper<br />

direktmanipulerande verktyg skulle kunna tänkas ha resulterade i följande lista.<br />

Frihetsgrader<br />

o 3 dimensioners frihet, kan röra sig i hela scenen.<br />

o 2 dimensioners frihet, följer ytan som kammas.<br />

Orienteringslägen<br />

o Lutning , vinkeln fjädern är fäst i ytan med ändras.<br />

o Riktning , förändring av vilket håll fjädern ska lutas.<br />

o Både lutning och riktning.<br />

Mängd av påverkan<br />

o Lutar/roterar fjädern mer och mer<br />

Inställbar hastighet<br />

Förutbestämd hastighet<br />

o Lutar/roterar fjädern till ett bestämt läge<br />

Gradvis<br />

Hela vägen på en gång


Att animera fjädrar och fjäll i Maya 26<br />

Som ett första experimentellt kamningsverktyg användes ett delvis transparent<br />

sfärliknande objekt. Objektet kunde föras över ytan som skulle kammas. Och ju<br />

närmare centrum av sfären fjädern befann sig desto större påverkan utsattes den för<br />

enligt formeln:<br />

, där 0 < d < r<br />

Avståndet från sfärens centrum till fjädern är lika med d. Sfärens radie är lika med r.<br />

Genom att öka sfärens avstånd från ytan minskade man mängden påverkan av<br />

fjädrarna. Ungefär som att minska trycket när man stryker någonting.<br />

Sfären kunde påverka fjädrarna i ett av de tre lägena och beroende på valt<br />

orienteringsläge ändrades sfärens utseende. På så vis kunde användaren se på<br />

verktyget hur och vilka fjädrar den påverkar. Hur dessa experimentella<br />

kamningsverktyg såg ut syns i figur 22.<br />

Figur 22. Första verktyget roterar riktningen på fjädern, andra verktyget ändrar fjäderns<br />

lutning och tredje verktyget är en kombination av de båda första. Både i funktion och i<br />

utseende.<br />

Efter ett tags användande insågs det att ytterligare ett orienteringsläge behövdes.<br />

Med ett måldefinierat kamningsverktyg skulle användaren kunna definiera fjäderns<br />

orientering och kurvatur. När användaren sedan förde det måldefinierade verktyget<br />

över ytan så orienteras fjädrarna mot den av användaren definierade orienteringen.<br />

Användaren definierar orienteringen genom att vrida verktyget i önskat läge. Med<br />

detta verktyg skulle det även vara möjligt att rotera fjädern runt sin egen axel.<br />

Se figur 23. På det måldefinierade verktyget är en pil målad så att användaren kan se<br />

hur fjädern kommer att orientera sig.


Att animera fjädrar och fjäll i Maya 27<br />

Figur 23. Måldefinerat kamningsverktyg.<br />

Verktygens utseende var endast tänkta som tillfälliga lösningar för att hålla isär dem,<br />

mer intuitiva utseenden behövdes om verktygen skulle användas vidare. Bland annat<br />

var det tvetydigt vad pilen på det måldefinierade verktyget representerade, var det<br />

vilket håll under- eller översidan av fjädern peka. Eller var det riktningen från<br />

fjäderpenna till spets. En alternativ och betydligt tydligare lösning skulle vara att ha<br />

en fjäder i som beskriver hur de kammade fjädrarna kommer att se ut inne i sfären.<br />

För att ställa in orienteringen skulle man istället använda sig av reglage och endast<br />

fjädern skulle vrida på sig och inte hela sfären. Även ha ett reglage för mängden<br />

böjning skulle implementeras och även denna böjning skulle representeras av fjädern<br />

i verktyget. En prototyp av verktyget syns i figur 24.<br />

Figur 24. Prototyp av ett tydligare måldefinerat kamningsverktyg.


Att animera fjädrar och fjäll i Maya 28<br />

7.2. Nyckelfjädrar<br />

En annan möjlighet är att bygga på samma metod som de flesta pälslösningarna<br />

använder och låta användaren definiera upp ett antal nyckelfjädrar och sedan<br />

interpolera mellan dessa. Nackdelen är då att man inte ser resultatet förrän man<br />

renderar scenen. Det finns även en risk för antingen en väldigt homogen fjäderskrud<br />

eller att väldigt många nyckelfjädrar behöver skapas. För varje nyckelfjäder använder<br />

man i så fall Mayas inbyggda verktyg för att ange orienteringen och ett reglage för att<br />

ange mängden böjning.<br />

Det är den relativa orienteringen av fjädern gentemot ytans normal som ska<br />

interpoleras. På så sätt undviker man att fjädrarna hamnar i ett läge de pekar in i ytan<br />

istället för ut ifrån. Med Joe Alters päls och hår plugin interpoleras hårstråna istället i<br />

världskoordinater vilket kan orsaka problem om inte tillräckligt många nyckelkurvor<br />

används.<br />

7.3. Texturering av fjäderutseende och orientering<br />

I ”Shave and a haircut” använder man sig av mappade texturer för att definiera<br />

många av hårstrånas egenskaper hos hårstrån som till exempelvis längd, tjocklek,<br />

täthet, opacitet och böjning. På samma sätt är det meningen att fjädrarnas längd och<br />

täthet ska mappas inför utplaceringen av fjädrarna. Även egenskaper för ljuseffekter<br />

och skuggning av fjädrarna mappas, den delen av projektet som behandlar de<br />

enstaka fjädrarnas texturering är dock inte påbörjad ännu.<br />

I användarintervjuerna av erfarna texturera som var vana av att använda sig av päls<br />

lösningen i Maya kom det fram att de tyckte att lösningen med texturkartor<br />

fungerade bra ypperligt. En möjlighet som särskilt uppskattades var möjligheten att<br />

använda funktioner som gradienter och brus i ritprogrammen som användes för<br />

redigering och skapandet av texturerna. Fjädrarnas orientering är i form av<br />

quaternioner. Och eftersom quaternioner består av fyra tal skulle det vara möjligt att<br />

även mappa fjädrarnas orientering i en textur med fyra bytes djup, rött, grönt, blått<br />

och alpha. Sedan skulle en separat textureringskarta behövas för att kunna mappa<br />

fjädrarnas kurvatur.<br />

Med hjälp av 3d-paint verktyget i Maya kan man rita/ändra texturen på objekten<br />

direkt i Maya och se resultatet direkt i viewporten. Det blir då möjligt att ändra<br />

fjädrarnas orientering och böjning i realtid direkt i Maya.<br />

7.4 Lösningen på interaktionen för orientering och böjning av<br />

fjädrar<br />

När testanvändarna provade de första alternativen till kamningsverktyg visade det sig<br />

att det antingen tog för lång tid att få fjädrarna att rotera ett halvt varv eller så blev<br />

det inte tillräckligt noggrant och verktygen kändes klumpiga. Men ett ännu större


Att animera fjädrar och fjäll i Maya 29<br />

problem var att det var ganska svårt att förflytta kamningsverktygen i 3 dimensioner<br />

vilket innebar att man skulle vara tvungen att tvinga sfären att följa objektets yta och<br />

bara kontrollera den med 2 frihetsgrader. Nackdelen blev då att man förlorade<br />

möjligheten att påverka kraftens styrka genom att hålla sfären lite högre ovanför<br />

objektetsyta.<br />

Sammanfattningsvis kan man säga att det ansågs klumpigt och ineffektivt att<br />

använda den här typen av direktmanipulation. Även om alla identifierade<br />

egenskapers påverkan ännu inte undersökts lämnades<br />

direktmanipulationsalternativet. Det är möjligt att det gått att få till en smidig lösning<br />

men de tidigare intervjuade texturerarna tyckte att den befintliga lösningen för<br />

modellering av päls med nyckelkurvor och texturer fungerade utmärkt så istället<br />

koncentrerades arbetet på hur de kunde anpassas och eventuellt förbättras.<br />

Genom att kombinera de två alternativen av nyckelfjädrar och texturering kan man<br />

först använda nyckelfjädrarna för att snabbt få en fjäderskrud som man sedan kan<br />

varieras med hjälp av textureringen. Det går även att jobba med endast det ena<br />

alternativet om man skulle vilja.<br />

Man börjar alltså med att först skapa nyckelfjädrarna sedan kör man ett MEL<br />

kommando med en mappad textur över tätheten. Här används en<br />

placeringsalgoritmen för att bestämma antalet fjädrar och deras positioner och de<br />

nya fjädrarna skapas med hjälp av interpolation mellan nyckelfjädrarna. MELkommandot<br />

skapar sedan physXnoden och kopplar de skapade fjädrarna till noden<br />

tillsammans med eventuella mappade texturer som innehåller information om<br />

variationer i orientering och böjning. Med hjälp av textureringen blir det enkelt för<br />

användaren att lägga till brus och slumpmässighet i fjädrarnas utseende och<br />

orientering för att kunna till exempel kunna skapa en mer ovårdad fjäderskrud.<br />

8. Placering av fjädrar<br />

Innan några fjädrar kan skapas måste man veta var de ska placeras. Detta gäller<br />

särskilt när fjädrarnas skapas genom interpolation av nyckelfjädrar. Några huvudkrav<br />

fanns för utplaceringen av fjädrarna.<br />

Variation i avståndet mellan fjädrarna skall vara möjlig<br />

Tätheten ska variera över ytan och kunna definieras<br />

Två fjädrar fick inte hamna på samma ställe eller alldeles bredvid<br />

Möjlighet att återskapa en tidigare fördelning<br />

För att användaren ska slippa göra om allt jobb med kamningen av fjädrarna även om<br />

denne skulle upptäcka att fjädrarna sitter för glest/tätt på ett område och vill ändra


Att animera fjädrar och fjäll i Maya 30<br />

detta måste det vara möjligt att ändra tätheten i efterhand utan att kamningen går<br />

förlorad.<br />

I naturen växer fjädrarna i rader, med en liten variation i placeringen av varje fjäder.<br />

Att komma fram till hur alla rader skulle ligga oavsett om det skedde automatiskt<br />

eller manuellt skulle kräva alldeles för mycket tid. Det är dessutom osannolikt att<br />

resultat skulle bli särskilt bra. Dock var det önskvärt att få en variation av fjädrarnas<br />

avstånd till varandra för att få ett mindre konstgjort utseende. Perfekt symmetri är ju<br />

ytterst ovanligt i naturen.<br />

På en fågel varierar både fjädrarnas storlek och täthet beroende på var på kroppen<br />

de sitter. Båda ska gå att mappa med hjälp av en textur. Utplaceringsalgoritmen ska<br />

placera fjädrarna glesare där tätheten är lägre på fågeln och tvärtom där den är hög. I<br />

den mappade texturen motsvarar ett vitt område maximalt täthet och ju mörkare<br />

områdena är desto glesare ska fjädrarna sitta. På samma sätt är det när<br />

storleksskalan på fjädrarna texturmappas.<br />

Fjädrarna får inte penetrera vandra och får därför inte placeras i samma punkt eller<br />

för nära varandra. Då kan problem uppstå i form av oscillationer av fjädrarnas rörelse.<br />

I de fall att användaren skulle vilja skapa två modeller som ser exakt likadana ut<br />

behöver utplaceringen av fjädrarna kunna återskapas.<br />

Valet stod mellan tre olika tekniker, kollisionsdetektion av cirklar, Fast Surface<br />

Particle Repulsion, eller någon form av sannolikhetsfördelning. Som beslutsunderlag<br />

av vilken teknik som skulle användas jämfördes teknikerna med listan av krav som<br />

ställdes på den slutgiltiga lösningen. Dessutom var det önskvärt att det gick så snabbt<br />

som möjligt att få fram placeringarna eftersom system ska fungera i realtid.<br />

8.1. Fast Surface Particle Repulsion<br />

I artiklar om fjäder, päls- och hårlösningar förekommer ofta en teknik som kallas<br />

Surface Particle Repulsion eller kort PR [källor som använder PR]. Heckberts (15)<br />

variant Surface Particle Repulsion är en relativt snabb och effektiv lösning med<br />

möjlighet att på en 100 MHz grafikdator simulera 10 000 partiklar med en iterations-<br />

och uppritningstid på en sekund.<br />

Fast surface particle repulsion algoritmen består av tre steg. Varje partikel har en<br />

rörelse energi och hastighet. Hastigheten beräknas parvis mellan alla partiklar med<br />

den Gaussiska formeln e -r²/2σ² . I formeln är r det euklidiska avståndet mellan de två<br />

partiklarna och σ är repulsionsradien, det vill säga ett styrkemått på hur nära de får<br />

komma varandra. Fördelen med den Gaussiska formeln är att den har ett maxvärde ≠<br />

∞ om r = 0 vilket inte är fallet om man använder den fysikaliska formeln -1/r². En annan<br />

fördel är att den avtar väldigt snabbt. Redan med ett avstånd på 3σ är värdet endast<br />

1% av det maximala, partiklar längre bort än så kan man i praktiken bortse från.


Att animera fjädrar och fjäll i Maya 31<br />

För att snabba upp det hela jämfört med den tidigare varianten av surface particle<br />

repulsion beräknas repulsionskraften inte för alla par utan endast de som ligger inom<br />

3σ om noggrannheten är 1 %. Om man ska kunna göra detta måste det vara möjligt att<br />

hitta alla partiklar som ligger inom en viss radie från partikeln. Detta sker genom att<br />

lägga alla partiklar i ett 3 dimensionellt rutmönster (grid) av kuber och varje kub får<br />

en hink (bucket) kopplad till sig. I denna hink läggs alla partiklar som befinner sig i<br />

kuben. I figur 25 visas hur ett 2 dimensionellt rutnät med partiklar skulle kunna se ut.<br />

Här har en förfrågan ställts efter de partiklar som befinner sig inom cirkelns radie.<br />

Figur 25. Vill man sedan ha reda på alla<br />

partiklar inom avståndet r plockar man upp<br />

alla partiklar i hinkarna som är kopplade<br />

rutorna inom avståndet r från cirkelns<br />

centrum.<br />

Efter att partiklarna flyttats enligt summan av deras parvisa energier/hastigheter<br />

ligger partiklarna i regel inte längre på ytan och måste därför flyttas in till ytan inför<br />

nästa iteration.<br />

Varje partikel har full kontroll över sin egen repulsionsradie och kan öka den om inga<br />

andra partiklar finns tillräkligt nära för att den ska röra på sig. Den kan också minska<br />

radien om för många påverkar den. På så sätt hålls anatalet grannar ganska konstant.<br />

Om antalet partiklar inom ett visst delområde är för stort eller för få skapas eller<br />

förstörs partiklar i det området för att upprätthålla tätheten även om ytans form<br />

förändras.<br />

Man kan tyvärr inte använda sig av en varierad täthet med PR men i Stuart Little 2<br />

löste man det genom att modifiera algoritmen något. Utplaceringen av fjädrarna blir<br />

trots det stel och onaturlig när avstånden är jämnt fördelade.


Att animera fjädrar och fjäll i Maya 32<br />

8.2. Placering via sannolikhetsfördelning<br />

Fördelarna med att använda sig av en sannolikhetsfördelning är dels att<br />

komplexiteten är linjär med tätheten som genereras och dels att det är enkelt att<br />

implementera den. För att kunna få en varierbar täthet kan man använda sig av en<br />

teknik som kallas uttunning. I det här fallet går uttunningen till så att ett antal<br />

fjäderpositioner genereras med ytans största möjliga täthet. För varje position<br />

genereras ett slumptal och om slumptalet är större än kvoten mellan tätheten i den<br />

positionen och maximal täthet så tas den bort.<br />

Genom att genera fjäderpositionerna i normaliserade UV koordinater, det vill säga (X,<br />

Y) där 0


Att animera fjädrar och fjäll i Maya 33<br />

De punkter som fjädrarna ska placeras på är si, där i = 1, …, j. Även om man inte kan få<br />

punkter som ligger på samma ställe så hamnar de ibland för tätt för att det ska gå att<br />

använda för att få en tillräckligt jämn fågelskrud. Resultatet var dock bättre än för en<br />

likformig fördelning bestående av N stycken punkter med koordinat (Xi,Yi). Där Xi och<br />

Yi likformigt fördelade slumptal mellan 0 och 1 och i = 1, .., N.<br />

Genom att använda samma frö för att starta slumptalsgenereringen kan man<br />

generera samma fördelning igen.<br />

8.3. Kollisionsdetektion<br />

Med tekniken particel repulsion låter man alla partiklar påverka varandra med en<br />

repellerande kraft. Ett alternativ för att få ner antalet partiklar som påverkar varandra<br />

är att endast räkna partiklar som ligger tillräckligt nära varandra. De kommer då<br />

uppträda som skumgummicirklar som trängs med en radie motsvarande kraftens<br />

räckvidd. För fast particel repulsion är skulle skumgummicirkelns radie bli 3σ. I figur<br />

26 och 27 syns skillnaden när skumgummicirkelns radie är σ och σ antingen är 1 eller<br />

mindre än 1.<br />

Figur 26. Fjäderfördelning med högre Figur 27. Fjäder fördelning där σ < 1 och<br />

täthet där texturen är ljusare. kala fläckar uppstått.<br />

Om antalet cirklar inte är tillräckligt många eller deras radie för liten för att täcka upp<br />

hela ytan undviker man att fjädrar på ett område med samma fjädertäthet ligger<br />

jämnt fördelade men problemet blir då att man riskerar kala fläckar.<br />

En avvägning mellan hur ojämnt fjädrarna ska ligga och risken för kala fläckar är<br />

nödvändig. Användaren har möjlighet att ange hur mycket av ytan som ska täckas<br />

upp med hjälp av en variabel σ, där 0< σ


Att animera fjädrar och fjäll i Maya 34<br />

blir cirklarnas kraftradie väldigt liten och fjädrarna måste ligga väldigt nära varandra<br />

för att repellera varandra. Risken blir då stor för fjädrar som ligger tät och kala<br />

fläckar.<br />

Om cirklarna genereras inom en kvadrat med arean 1 så kan fjädertätheten<br />

texturmappas med hjälp av en normaliserad UV mappad textur. För att veta<br />

cirklarnas radie behöver vi vet värdet på r vilket beror på λ vars värde fås från den UV<br />

mappade texturen.<br />

För att beräkna cirklarnas radie utnyttjas formeln för kristall packning. Se figur 28.<br />

Antalet romber i kvadraten är detsamma som antalet cirklar och dess sammanlagda<br />

area är densamma som kvadraten. Cirklarna är packade tätast möjligt så vilket är<br />

önskbart om σ =1. Sambandet mellan cirkelns radie fås då från figuren och resulterar i<br />

följande matematiska härledning.<br />

.<br />

För fullständig täckning av en yta med arean 1 och fjädertätheten λ behöver rombens<br />

area vara 1/λ. Och om rombens area fås av ger detta att .<br />

Cirkelns kraftradie är då lika med σr. Ekvationen kan härledas ur figur 28. Antalet<br />

romber i kvadraten är lika många som antalet cirklar. Rombernas sammanlagda area<br />

är detsamma som kvadraten.<br />

Figur 28. Sambandet mellan rombens area och cirkelns radie fås från figuren till höger.<br />

Om kvadraten har sidorna lika med 1 är rombens area lika med 1/(antalet cirklar).


Att animera fjädrar och fjäll i Maya 35<br />

Om algoritmen avbryts innan en fullständig relaxering skett behöver även eventuella<br />

överlappningar också kompenseras för. Genom att använda en poissonfördelning<br />

som utgångsläge innan kollisionsalgoritmen körs minskas antalet iterationer och<br />

eventuell önskad slumpmässighet kan införas utanför kollisionsalgoritmen. För att<br />

veta om två cirklar befinner sig till räckligt nära varandra används en 2-dimesionell<br />

spatial hashning med en cellstorlek lika med minsta möjliga cirkel diameter. Med den<br />

här tekniken uppfylls alla ställda krav och genereringen av 5000 fjäderpositioner med<br />

30 iterationer tar ca: 25 sekunder.<br />

9. Spara och ladda tillstånd<br />

Både vid användarintervjun och vid observationen som gjordes med texturerarna<br />

från filmbolaget Fido framkom det att användning av texturmappar var ett effektivt<br />

sätt att jobba på. Dessutom var det ett sätt att jobba på som de var vana vid.<br />

Ytterligare ett krav som kom fram vid intervjun var behovet av att kunna överföra en<br />

kamning av ett djur till ett annat enkelt och effektivt. Även detta kunde lösas genom<br />

användandet av texturer för att spara fjädrarnas orientering. Eftersom fjäder<br />

orienteringen anges i form av en quaternion behövs det fyra tal för att spara<br />

informationen om den. En textur har förutom en röd, grön och blå kanal även en<br />

alpha kanal vilken beskriver genomskinligheten hos texturen. En quaternion är en<br />

utveckling av de imaginära talen och har istället för 2 rymder 4 rymder. Fördelen med<br />

quaternioner är att de inte kan hamna i gimbal-lock och inte heller behöver komma<br />

ihåg rotationsordningen vilket en euler rotation behöver. Genom att använda<br />

texturer skulle det fortfarande vara möjligt att finjustera fjäderkamningen efter att<br />

nyckelfjädrarna använts för att befolka fjäderskruden.<br />

9.1 Interpolation av färger<br />

Efter att interpoleringen av nyckelfjädrarna gjorts är det möjligt för användaren att<br />

markera en eller flera av fjädrarna och justera deras orientering med hjälp av Mayas<br />

rotationsverktyg. Det är nödvändigt att kunna spara dessa finjusteringar i en textur.<br />

Men eftersom varje fjäder i regel bara motsvarar en punkt i texturen och texturen<br />

saknar fjädrar på flera pixlar måste de tomma pixlarna fyllas i för att texturen ska vara<br />

användbar om en annan utplacering av fjädrarna skulle vilja genereras. Två möjliga<br />

metoder finns, och båda innebär en interpolation. Först gäller det att välja ut de tre<br />

närmsta kända värdena. Sen interpolerar man värdena på ett av två sätt. Det ena är<br />

att interpolare med hjälp en slerp. Vilket är speciell funktion för att interpolera<br />

quaternioner. Slerpfunktionen tar två quaternioner som den ska interpolera mellan<br />

samt ett tal mellan noll och ett vilket beskriver hur mycket interpolation som ska ske<br />

mellan den första och den andra quaternionen. Tillbaka från funktionen får man en ny<br />

quaternion. Det andra sättet är betydligt lättare men ger inte en lika jämn


Att animera fjädrar och fjäll i Maya 36<br />

interpolation av orienteringen. Den är att interpolerar mellan de tre färgerna enligt<br />

följande algoritm.<br />

För att hitta färgen C i punkten P.<br />

1. Välj ut de tre närmaste punkterna där färgen är känd. P1, P2 och P3<br />

2. Låt C1, C2 och C3 vara färgen i respektive punkt.<br />

3.<br />

4.<br />

5.<br />

10. Implementation<br />

Implementeringen av fysikmotorn har skett i två lager. Först i en fjäderklass som<br />

initierar fjädrarna i fysikscenen samt håller reda på fjädrarnas tillstånd där. Det andra<br />

lagret består av en nod i Maya som initierar fysikscenen samt sköter<br />

kommunikationen mellan fjäderklassen och fjädrarna i Mayascenen.<br />

10.1. PhysXnoden<br />

Attributen till physXnoden är global transformation matrix, local transformation<br />

matrix, in transformation matrix, out transformation matrix, in curvature, out<br />

curvature, tick.<br />

Figur 29. PhysXnoden och dess attribut.


Att animera fjädrar och fjäll i Maya 37<br />

De fyra in- och utattributen som syns i figur 29 är arrayer där varje enskilt element<br />

motsvarar en fjäder. Inattributen används för placering och orientering av<br />

fjäderpennan i physX och vilken kurvatur fjäderns leder ska ha som utgångsläge.<br />

Utattributen är hur fjädern i Maya ska förändras för att motsvara representationen i<br />

fysikmotorn. Den globala och lokala transformationsmatrisen håller reda på<br />

relationen mellan Mayas världskoordinat och fysikmotorns lokala koordinat.<br />

Tickattributet har registrerats för att påverka utattributen vilket gör att<br />

computefunktionen anropas varje gång tick booleanen växlar värde. När physXnoden<br />

ska drivas i Maya skapas en callback som med ett visst mellanrum växlar värde på tick<br />

attributet.<br />

Compute funktionen har i uppgift att skapa lika många instanser som antal element i<br />

inattributet om detta ännu inte gjorts. Feather klassens constructor skapar och<br />

initierar fjädrarna i fysikmotorn. Och om fjädrarna redan skapats uppdateras istället<br />

eventuella förändringar av inattributen i fysikmotorn genom anrop till<br />

Featherinstanserna. Sista steget är att uppdatera utattributen.<br />

Vid initieringen och skapandet av noden markerar man det objekt som fjädrarna sitter<br />

på och kör ett MELkommando för att initiera physXnoden. Då traverseras dag-grafen<br />

och dess transformnoder så att alla transformnoder som tillhör en fjädernod kopplas<br />

till intransformerna på physXnoden. Dag-grafen är den graf som beskriver<br />

transformnodernas relation till varandra. För att få en nods världsmatris multipliceras<br />

nodens transformmatris med alla dess föräldrars transformmatriser.<br />

Sedan kopplas fjädernodens kurvatur till inCurvaturattributet med samma index.<br />

Fjädernodens meshattribut kopplas mot en deformeringsnod vilken orienterar<br />

fjädern samt ändrar kurvaturen så att den stämmer med utattributen i physXnoden. I<br />

figur 30 visas hur två fjädrar kopplats till physXnoden.<br />

Figur 30. PhysXnoden med två fjädrar och deras uppkoppling i dependecygrafen.


Att animera fjädrar och fjäll i Maya 38<br />

10.2. Featherklassen<br />

Featherklassen håller reda på pekare till fjäderns aktörer (actor-objekt) i fysikmotorn<br />

så som spole, fan, fjädersäck och leder. Konstruktorn skapar först en fjädersäck vilket<br />

är en box. På denna fästs en sfäriskled som håller fast själva fjädern. På så sätt kan<br />

man orientera fjädersäcken efter hur fjädern kammas så strävar sedan fjädern efter<br />

att hålla samma orientering men med en kraftig fjädrande rörelsebegränsning lateralt<br />

och roterande. För rörelser dorsalt och ventralt finns också en fjädrande<br />

rörelsebegränsning men inte lika kraftig. Fjäderns rörelse omfång beskrivs i figur 31<br />

och 32.<br />

Figur 31. Fjäderns rörelseomfång Figur 32. Fjäderns rörelseomfång<br />

begränsad av hårdare fjädringskrafter. begränsad av mjukare fjädringskrafter.<br />

Spolen består av lika många avlånga boxar som fjädern delas upp i. Varje del av<br />

spolen fäster i näst följande och föregående med hjälp av en gångjärnsled med<br />

ganska mjuk fjädring. Denna fjädring blir hårdare ju mer proximalt på spolen leden är<br />

placerad. På varje del av spolen fästs två tunna parallelltrapetser vilka approximerar<br />

en del av fanens yta. Hur fjädern representeras i form av olika geometrier och leder<br />

kan ses i figur 33 vilken föreställer en fjäder på näst lägsta detaljnivå. Andra<br />

detaljnivåer syns i figur 15.


Att animera fjädrar och fjäll i Maya 39<br />

Figur 33. Fjäderns representation i PhysX.<br />

1. Spolsektion, 2. Fansektion, 3. Gångled,<br />

4. Sfäriskled, 5. Fjädersäck<br />

Fjädersäcken är den enda kinematiska aktören och den enda som direkt påverkas av<br />

kamningen. En kinematisk aktör är statisk mellan varje uppdatering fysiksystemet och<br />

saknar egenskaper som massa. På fjädersäcken sker heller ingen kollisionsdetektion<br />

och för att den ska ändra orientering eller position måste scenen först instrueras om<br />

det. Så när fjädern ska byta orientering i fysikmotorn är det fjädersäcken som roteras.<br />

Resten av fjäderns form bestäms i fysikmotorn av lederna och av kollisioner mellan<br />

fjädrarna och andra kollisionsobjekt.<br />

När Featherklassen får en förfrågan om en viss fjäders orientering returneras<br />

quaternionen för rotationen av fjäderns spets i förhållande till normalen se figur 34.


Att animera fjädrar och fjäll i Maya 40<br />

Figur 34. Fjäderns rotation fås från vinkeln mellan<br />

normalen(1) och fjäderns spets(2).<br />

11. Slutsatser och diskussion<br />

Maya ger intrycket av att vara ett väldigt flexibelt system där man samma sak kan<br />

åstadkommas på flera än ett sätt. Vikten vid utvecklingen av systemet verkar ha legat<br />

på just denna flexibilitet vilket verkar lett till vissa kompromisser gällande prestanda.<br />

Som exempel kan nämnas att uppdateringen av för många transformnoder inom går<br />

väldigt långsamt av någon anledning, redan vid hundra stycken börjar det bli<br />

märkbart. Eftersom orienteringen av så många fjädrar skulle ändras mellan varje<br />

uppdatering av fysikmotorns tillstånd uppstod en hel del problem med prestandan<br />

innan vi beslutade oss för att inte kamma fjädrarna i realtid. Istället följde vi det som<br />

framkom i användarintervjuerna om att utnyttjandet av nyckelkurvor och texturer<br />

ansågs vara en bra lösning på interaktionen. Fysikmotorn visade sig kunna behandla<br />

betydligt fler objekt än vad Maya gör. Detta kan dock vara en fråga om att optimera<br />

hur transformerna till fjädrarna i Maya sätts. I systemet så sker det en simulering som<br />

sätter fjädrarnas positioner för varje bildruta men på grund av prestanda problemet<br />

med att sätta deras transform skulle det antagligen ge ett snabbare system att köra<br />

fysikemuleringen under renderingen istället.<br />

Ett problem med att lära sig Mayas API låg i att vi endast kunde hitta två böcker som<br />

behandlar ämnet skrivna av Gould (gould1) (gould2). I båda är det bara en mindre del<br />

av boken som behandlar själva APIn. Hjälpdokumentationen saknar en hel del<br />

information om Mayas egna noder såsom deras attribut och attributens funktion.<br />

Något annat som saknades i dokumentationen var vad klassernas funktionsanrop


Att animera fjädrar och fjäll i Maya 41<br />

fyllde för funktion och vilken typ av attribut de tar, till exempelvis anges det aldrig om<br />

vinklarna ska anges i grader eller radianer.<br />

Något annat som drog ner utvecklingshastigheten var den dåliga felhanteringen i<br />

Maya. Om ett plugin krascha eller returnera ett felaktigt värde så meddelades detta<br />

inte till användaren istället fortsatte Maya som om inget hänt.<br />

Både för päls och fjädrar verkar det finnas en unik lösning för varje större<br />

animeringsbyrå och sånt som en byrå anser som viktigt för att åstadkomma<br />

fotorealistiska animationer tycker en annan är ganska oväsentligt. Rhythm and Hues<br />

tyckte att det var väsentligt att hårstråna kunde kollidera med varandra medan Weta<br />

Digital tyckte räckte med att representera hårets volym. Sony Pictures Imageworks<br />

utnytjade ingen kollisionsdetektion mellan fjädrarna vilket vi har använt. Istället<br />

använde Sony Pictures Imageworks andra tekniker där man begränsade fjädrarnas<br />

rörelser för att undvika interpenetration.<br />

Utplacerings algoritmenanvänder sig av en fysikaliskt baserad formel för att beräkna<br />

den repellerande kraften. Eventuellt skulle en gaussiskformel liknande den i fast<br />

particel repulsions ge färre iterationer. Istället för att ange antalet iterationer och<br />

fyllnadsgrad skulle det vara mer logiskt för användaren att ange en önskad grad av<br />

relaxering. Och beroende på relaxeringstalet väljs fyllnadsgraden och sedan itererar<br />

algoritmen tills önskad relaxeringgrad uppnåtts eller ett maximalt antal iterationer<br />

gjorts.


Att animera fjädrar och fjäll i Maya 42<br />

12. Litteraturförteckning<br />

1. Sharp, Preece, Rogers. Interaction Design beyond human-computer interaction. New<br />

York : John Wiley & Sons Inc., 2002.<br />

2. STUART LITTLE 2:Taking Character Animation to the Next Level or Fur, Feathers and<br />

Flying…. Kaufman. 2002, SIGGRAPH 2002 course notes.<br />

3. Physics-based motion editing: Interactive animation of dynamic manipulation. Abe,<br />

Popovi´c. 2006, ACM 2006 SIGGRAPH Symposium on Computer Animation.<br />

4. Donald, Beaker. Computer graphics with OpenGL. Upper Saddle River : Pearson<br />

Education International, 2004.<br />

5. Visual programming language. Wikipedia. [Online] [Citat: den 27 05 2007.]<br />

http://en.wikipedia.org/wiki/Visual_programming_language.<br />

6. SIGGRAPH 99 Course 37. Siggraph 99. [Online] ACM Siggraph, 99. [Citat: den 27 05<br />

2007.] http://www.siggraph.org/s99/conference/courses/course_37.html.<br />

7. Grooming, animating & rendering fur for "King Kong”. Hill, Preston. 2006, ACM<br />

SIGGRAPH 2006 Sketches.<br />

8. Fjädrar (Biologi). Wikipedia. [Online] [Citat: den 20 05 2007.]<br />

http://sv.wikipedia.org/wiki/Fj%C3%A4der_(biologi).<br />

9. Proctor, Lynch. Manual of Ornithology, Avian structur & function. u.o. : Yale<br />

University Press, 1998.<br />

10. Alter. Shave and a Haircut 4.5. JoeAlter Inc. [Online] 2007. [Citat: den 05 02 2007.]<br />

http://www.joealter.com/newSite/Manual45.pdf.<br />

11. Hansson. Craft Physics Interface. Linköping : Linköping University, Department of<br />

Electrical Engineering, 2007.<br />

12. Ageia. PhysX Ageia. [Online] [Citat: den 05 02 2007.] http://www.ageia.com/physx/.<br />

13. Gould. Complete Maya Programming: An Extensive Guide to MEL and C++ API. u.o. :<br />

Morgan Kaufmann Publishers, 2002.<br />

14. Quaternions: From Classical Mchanics to Computer Graphics, and Beyond.<br />

Mukundan. u.o. : Asian Technology Conference in Mathematics, 2002.<br />

15. Keane, Eysenck. Cognitive psychology : a student's handbook. Hove : Lawrence<br />

Erlbaum, 2000.<br />

16. Heckbert. Fast Surface Particle Repulsion. Pittsburgh : School of Computer Science,<br />

Carnegie Mellon University, 1997.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!