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
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.