Hemtentamen 2D1640 Grafik- och interaktionsprogrammering Jonas Frid 820530-0133 jfrid@kth.se
1. Vad har jag lärt mig? Jag kom till kursen relativt tomhänt och obevandrad inom grafikprogrammeringsområdet. Därför har jag lärt mig en hel del, även om vi bara har skrapat på ytan på det mesta som vi har berört. Till att börja med har jag fått en grund förståelse i hur människans syn fungerar, såsom de olika teorierna till färgseendet, hur samma nyans kan uppfattas som olika nyanser i ett sammanhang för att hjärnan möblerar om bilden till ett 3D-tänk, samt hur färger uppfattas olika i förhållande till olika färger. Vi stötte faktiskt på en sån synvilla under Photoshop-labben, när vi skulle göra om golvet till en textur som kunde läggas sida vid sida. När vi bara hade en ensam version av golvtexturen så såg den ut att vara lika ljus över hela bilden, men när vi la den intill en kopia av sig själv märktes direkt en ljushetskillnad. Vi testade även att klippa ut en liten fyrkant i bildens nedre del och förde sakta upp den längs bilden. Då såg man tydligt hur den urklippta fyrkanten verkade bli mörkare och mörkare ju längre bort från ursprungspositionen vi flyttade den. Det här fenomenet använde vi oss av för att balansera ljusheten på texturen. Vi la den lilla urklippta fyrkanten från texturens nedre kant i den övre kanten och ändrade sedan värdena tills den passade in. Man skulle egentligen behöva förtydliga det här med en bild, men tyvärr försvann den när min dator havererade tidigare i år. Det där med faltning och filtrering kände jag redan till ganska bra från kursen Spektrala Transformer, men när vi gick in på 2D- och 3D-grafik var det återigen ny mark för mig. Jag fick en grundläggande förståelse för hur man faktiskt kan använda det vi lärde oss i Linjär Algebra för att programmera grafiktransformationer med hjälp av matrismultiplikation. Jag lärde mig också hur Photoshop fungerar lite grundligare, hur man kan använda sig av de olika filtren och lagren för att åstadkomma trovärdiga resultat. Jag lärde mig också hur grafiken fungerar i de gamla Atari- 3D -spelen, hur man använder sig av 3D-bilder för att ge illusionen av en 3D-värld, samt hur man använder lager och sprites, där man ritar ut allt bakifrån och förstorar det för att åstadkomma en illusion av till exempel en bil som kör längs en väg. Det var något som kom igen praktiskt under Directorlabben. Jag har också fått en inblick i hur man representerar riktig 3D-grafik, återigen Linjär Algebra, och hur man transformerar och roterar i den världen. Jag vet att man kan visa 2D i 3D-grafik genom att använda sig av ortografisk projektion istället för perspektivprojektion. Jag har dessutom en ytlig förståelse i hur perspektivprojektionen egentligen fungerar, med hjälp av matriser och likformiga trianglar, samt hur man använder sig av bounding volumes för att slippa många uträkningar om komplicerade polygoner skär varandra eller ska klippas av andra orsaker. Och att projektionen sker i två steg: först räknar man ut var varje punkt befinner sig genom matrismultiplikationen, som kan ses som att man tänker sig en stor kub som är förändrat till perspektivets vinkel. När man räknar om punkterna trycker man ihop kuben så att den åter får formen av en liksidig kub. Då kläms de bakre punkterna ihop mer än de främre. Sen använder man sig av klippningsalgoritmer som tar bort de punkter sominte syns. Nästa steg i processen är en vanlig ortografisk 2D-projektion av det som syns. Men även om jag har förstått hur det här fungerar kan jag inte påstå att jag skulle kunna programmera något sådant. Inte i dagsläget i alla fall. Klippning vet jag dessutom kan göras på flera olika sätt, bland annat painter s algorithm där man målar ut allting bakifrån och fram, med hjälp av z-buffring (lagra modellernas djup i bilden) jämföra pixel för pixel, eller att bara jämföra alla föremål och klippa dem mot varandra. Vi snuddade en del vid impostors också, att man fejkar en 3D-modell med hjälp av bilder i 2D. Det kan ge ett ganska bra resultat och kräver inte lika mycket datorkraft, men blir aldrig riktigt lika bra ur alla vinklar.
Hierarkiska modeller har jag också lärt mig en del om. Jag vet att det bygger på att en förändring i toppen av en hierarki kan förändra alla undersåtar och att det är detta man använder sig av i OpenGL med hjälp av push- och popmatrix. Rätt så krångligt kan det bli om man inte har bra koll på koordinatsystemet i OpenGL. Det har jag insett genom att programmera hästen och spelet. I samband med Maya lärde vi oss ju en del om kurvor och ytor. Det jag tog med mig från den episoden var att man kan definiera en kurva med parametrar (funktioner) som bestämmer hur hela kurvan ska se ut. Man kan sedan sätta ihop flera parametriska kurvor till parametriska ytor. På så sätt kan man forma i stort sett vilken yta som helst. Man kan dessutom beskriva kurvor med interpolation. Då begränsar man kurvan till att gå igenom ett fastställt antal punkter. Sedan kan man flytta punkterna för att forma om kurvan/ytan. Man kan dessutom länka ihop kurvor och ytor på olika sätt, beroende på hur man vill att de beror av varandra: länkningen kan vara icke-kontinuerlig, C0-kontinuerlig eller C1-kontinuerlig. För att få en C1- kontinuitet, en total sammanlänkning av kurvorna där de beror av varandra, kan man använda sig av hermitekurvor eller beziérkurvor. Då är det lätt att länka samman kurvorna, eftersom man bara behöver kontrollera att tangenterna i länkpunkterna är parallella. Ett bättre sätt är dock att använda sig av B-splines. Där formar man kurvan med hjälp av interpolationspunkter istället. För att lägga till en ny kurva på den gamla behöver man bara byta ut en punkt. Maya var också rätt så nytt för mig, jag har använt 3D Studio för länge sen men det hjälpte inte mycket här. Varje program verkar ha sin egen värld av kommandon och menyer även om de liknar varandra. Där fick man praktisk förståelse för det här med kurvor och ytor. Dessutom kunde man prova på hierarkiska modeller genom att gruppera sina modeller. På föreläsningen gick vi dessutom igenom hur man kan modellera avancerade saker utan att egentligen modellera. Man använder sig istället av algoritmer som får beskriva vad som ska ritas ut. Fraktaler är ett exempel, L-system ett annat. På så sätt kan man modellera stora avancerade modeller med hjälp av till exempel regler från naturen utan större ansträngning. Men det tar ju en del datorkraftförstås. Vi gick ju också igenom en del om interaktion och dess historiska utveckling. Det var väldigt intressant att få insikt om hur principerna har förändrats med tiden och vilka misstag som begåtts. Det var intressant att QWERTY inte alls är den bästa lösningen på tangentbordslayout, utan att det bara var en lösning på att tangenterna fastnade i skrivmaskinen. I framtiden kommer man ju kunna ändra sin layout själv, med de nya OLED-tangentborden, jag undrar vad det kommer att leda till? Det blir i och för sig jobbigt om alla ska ha sin personliga bokstavslayout, men det är onekligen pedagogiskt att de kan visa allt möjligt och inte bara låser sig till ett utseende. Det var också intressant att se hur spelvärlden har utvecklats och vilka enorma möjligheter som faktiskt finns idag för interaktion, samt att få en större förståelse för den stora processen bakom varje mjukvaruprojekt. Det är inte bara att sätta sig och göra något, utan man måste utvärdera och blanda in målgruppen i utvecklandet. Men de två områdena jag lärde mig mest om var nog ändå objektorienteringen och OpenGL. Objektorientering lärde vi oss en del om i början här på KTH, men det var så pass länge sedan att man glömt det mesta. Eftersom den här kursen gick parallellt med Programutvecklingsteknik, som också hanterar objektorientering, så kunde jag dessutom få användning av båda kurserna i varandra. Det jag lärde mig om objektorientering var hur abstrakta-, interna- och super-klasser hänger ihop, samt vad design patterns är och en hel del om SWING. Speciellt i samband med KidKlad, där vi använde oss av MVC-modellen. OpenGL var en lite större utmaning, eftersom jag aldrig programmerat i c++ förut. Men Jens hade gjort det så han lärde mig en del, resten plockade jag upp själv från internet. Men det var i samband med det sista spelet som jag verkligen började greppa hur OpenGL fungerar, i och med att vi
försökte importera saker från Maya. Det visade sig väldigt svårt att få ut polygonerna i rätt form och förstå vad som var vad när man väl hade gjort det. För att inte tala om textureringen! Det är inte helt logiskt alltid, det där OpenGL Det tog ännu ett tag att förstå hur vi skulle göra med normalerna för att ljussättningen skulle fungera. Föreläsningsanteckningarna för datorspelsgrafik var till stor hjälp när vi skulle designa spelet, även om jag måste erkänna att slutprodukten inte är lika imponerande grafiskt som själva spelidén Sen är det mycket annat man har lärt sig en del om, som till exempel grunderna till ljussättning och shading, men som sagt så är det så ytliga kunkaper att jag inte skulle kunna programmera det på rak arm. 2. Interaktion och användbarhet Jag intresserade mig faktiskt mest för den här delen av kursen, även om det också var intressant med all grafikprogrammering. Nedan ges en överskådlig förståelse över hur man utvecklar användbara interagerande program och artefakter. Vad krävs egentligen för att ett dataspel eller ett program eller en artefakt överhuvudtaget ska kunna interagera bra med sin användare? En bra idé behöver inte nödvändigtvis innebära framgång, det finns snarare flera exempel genom historien på idéer som har misslyckats trots deras uppenbara fördelar. Detta kan ha sin förklaring på många håll, bland annat starka marknadskrafter som inte vill förlora mark (Microsoft), men även bristfällig interaktion med användaren och låg användbarhet. Många gånger kan detta förklaras genom just bristfällig interaktion med användaren. Ett vanligt (söndertjatat?) exempel på lyckad interaktion är Apples ipod som har slagit otroligt på marknaden. För att förstå varför måste man förstå vad användbarheten ligger i den. Vad är då användbarhet? För att en produkt ska vara användbar krävs att den uppfyller vissa användbarhetsmål. Dessa finns bestämda enligt en ISO-standard (ISO 9241-11) och innebär att produkten ska uppnå sina mål på ett ändamålsenligt, effektivt och för användaren tillfredsställande sätt. Detta kan i sin tur delas upp i sex punkter: verkansgrad (hur effektivt fungerar det?), duglighet (hur bra fungerar det?), säkerhet (hur säkert är det, hur svårt är det att göra fel?), nyttighet (utför det någon nödvändig uppgift?), lättlärdhet (hur lätt är det att lära sig att använda?) och lätt att komma ihåg (hur lätt är det att komma ihåg det man lärt sig?) (Preece, Rogers, Sharp. 2002). Utan att alla dessa punkter är uppfyllda är produkten inte användbar. Den kan vara strålande på ett par punkter, men falla igenom totalt på andra, varför den genast tappar mark hos användaren. Ta till exempel Linux, ett starkt operativsystem som trots det inte fått många anhängare i de vanliga människornas värld. Detta för att det till en början var för komplicerat för den vanliga användaren för att orka förstå sig på och för att det saknade kompatibilitet med andra vanliga operativsystem. Även om det alltså var starkt på de flesta av punkterna saknade det förmåga på punkten lättlärdhet. Endast de mest inbitna hade möjlighet och vilja att sätta sig in i det. Microsofts och Apples operativsystem var mycket mer lättlärda och intuitiva och vann därmed kunderna (trots att de hade problem med säkerheten användaren värderar lättlärdhet över säkerhet i vissa fall). På senare tid har dock Linux kommit att ta allt större plats, då det numera finns flera versioner som är väldigt lätthanterliga och lättlärda. Men det är inte bara användbarhetsmål man bör ta hänsyn till, speciellt inte i speltillverkning och dylika underhållingsprodukter. Preece m.fl. menar att man bör ta hänsyn till användarupplevelsemål också. Dessa delar de upp i 10 punkter: tillfredsställelse, njutbarhet, lekfullhet, underhållande, hjälpsamt, motiverande, estetiskt behagande, stödjandes kreativitet,
belönande samt känslomässigt fullbordande. Dessa 10 punkter spelar in till den del att ett system inte bara kan vinna på dess faktiska användbarhet, utan har mycket att tjäna på att vara vacker, roligt och motiverande på olika sätt också. Det här är också något som kan förklara varför Linux inte tog konsumentmarknaden från Microsoft och Apple. För att Linux var fult. Och Windows och Mac OS var mer estetiskt behagande. För att återkoppla till Apples ipod kan vi här se att den har det mesta som krävs för att fylla både användbarhetsmålen och användarupplevelsemålen. För att bara nämna några aspekter så är den oerhört lätt att hantera tillsammans med itunes, den är lätt att förstå och lätt att minnas hur den fungerar (det finns ju inte många knappar eller funktioner alls på den, däremot börjar de nya modellerna svälla över av funktioner, varför den faktiskt tappar lite på det här området). Den fyller också sitt syfte väl, att hantera och spela musik. Vidare är den estetiskt behagande och man har möjlighet att välja vilken färg, vilket gör den känslomässigt fullbordande den uttrycker ens personlighet. Underhållning, och framförallt datorspel, behöver inte alltid uppfylla användbarhetsmålen för att bli användbara. Det kan vara just det faktum att det är svårt att klara av en uppgift som ger den tillfredsställande känslan och som gör att spelet är användbart. Det är en tes som stöds både av Preece m.fl. och Nicole Larazzo från XEODesign som var på KTH under Medietekniksbranschdagar och talade. Hur gör man då för att designa en produkt som är användbar? Preece, Rogers och Sharp sätter upp fyra punkter: 1. Identifiera ett behov och ställ upp en kravspecifikation 2. Utveckla alternativa designer som motsvarar kravspecifikationen 3. Gör interaktiva prototyper av designerna så att de kan kommuniceras och bedömas 4. Utvärdera designerna under hela processen Det här är en väldigt förenklad bild av hur utvecklingsprocessen ser ut för att ta fram en användbar produkt, men den ramar in huvudaktiviteterna. Utöver detta kan sägas att utvärderingarna bör leda till att fel hittas i designprototypen så att man kan iterera igen och göra en ny prototyp, som sedan åter utvärderas för att, när det inte går att hitta några problem med den, färdigställas till en produkt. För att utvärdera prototyperna finns flera metoder. Man kan använda sig av expertutvärdering, där någon som är expert på användbarhet eller området i sig, utvärderar prototypen utifrån till exempel en heuristisk analys efter följande tio tumregler (framtagna av Nielsen 2001): 1. Återkoppling om systemets status 2. Naturlig dialog, med användarens ord 3. Ge användaren kontroll och frihet 4. Var konsekvent, följ standarder 5. Hindra uppkomst av fel 6. Låt användaren känna igen istället för att komma ihåg 7. Erbjud flexibilitet 8. Visa bara för sammanhanget relevant information 9. Hjälp användaren att upptäcka, diagnostisera och ta sig ur fel 10. Erbjud hjälp och dokumentation Utöver detta kan man använda REAL-modellen: Relevans, Effektivitet, Attityd och Lättlärdhet. Detta är en bra metod, som säkerligen upptäcker flera interaktionsproblem, men för att verkligen fokusera på användaren, som ju faktiskt är den slutgiltiga bedömaren av användbarheten, så bör man blanda in denne i processen. Det kan göras på flera sätt: fokusgrupper (flera olika användare får diskutera utifrån en mall), prototypworkshops (användare och utvecklare får tillsammans utveckla förslag på prototyper och utvärdera dessa), användarobservationer
(användaren får ta sig igenom ett scenario i prototypen samtidigt som en expert bevakar skedet). Det finns åtskilliga alternativ med olika för- och nackdelar. Beroende på vad det är för någonting man ska utveckla så passar olika metoder olika bra. Det viktiga är att man itererar prototyputveckling och -utvärdering flera gånger så att man kommer upp med den bästa möjliga lösningen i slutändan. Hur förhåller sig då datorspelsvärlden till användbarhet och interaktion? Jag måste påstå att det faktiskt verkar som om datorspelsvärlden har varit drivande i att utveckla användbara koncept. Datorspelstillverkarna insåg tidigt att man behöver tydlig interaktion och började med grafik redan på 50-talet. De har alltid varit snabba på att använda ny teknologi för att interagera med spelaren. Det är fortfarande speldatorerna som är de kraftigaste och använder de mest innovativa sätten för interaktion. Det senaste exemplet är nintendos nya rörelsekänsliga fjärrkontroll som kan användas till flertalet olika applikationer. Jag tror att datorspelens försprång på interaktions- och användbarhetsplanet till stor del beror på de stora pengarna som går att hämta, men också på att datorspel till sin natur bygger på att de ska uppfylla åtminstone upplevelsemålen, men också användbarhetsmålen. Det är så effekten av spelet maximeras. Eftersom spelmarknaden bara fortsätter att öka tror jag att vi även i fortsättningen kommer att se spelbolagen i framkanten av forskning kring interaktions- och användbarhetsperspektiv. 3. Datorgrafikens betydelse för film Film är ett område som har utvecklats enormt mycket i samband med datorgrafiken. Från att ha behövt framkalla och klippa för hand använder man numera avancerad utrustning som sköter det mesta. I stort sett all redigering sker numera med hjälp av datorer. Många tänker direkt på datorgrafik i filmer som 3D-animering, men det är endast ett av många områden där man använder sig av datorer. Bland annat specialeffekterna har kommit att utvecklas enormt mycket, men även mindre synliga effekter, såsom ljussättning och retuschering använder sig idag av datorer och är mycket enklare att göra än det var för bara 20 år sedan. Den största anledningen till detta är att datorkraften har utvecklats så snabbt. Nu klarar en liten bärbar dator vad en dator stor som ett hus klarade på 1980-talet. Bland de tjänster som datorgrafikföretagen erbjuder i dagsläget finns modellering, animation, rendering, kompning, samt visuella effekter. Programmen man använder är bland andra Alias Maya, Combustion och Shake. Ofta köper kunderna ett paket av tjänster för ett filmprojekt. Ett exempel är Robbie Williams musikvideo Tripping, där det Stockholmsbaserade företaget The Chimney Pot anlitades för såväl 2D- som 3D-effekter. Men många gånger är det meningen att effekterna inte ska vara synliga. Som i filmen Fyra veckor i juni. Där står Tuva Novotny och tittar in i ett skyltfönster. Man ser hennes spegelbild i fönstret, men egentligen syntes hon inte där, utan det är en visuell effekt gjord av David Wahlberg på The Chimney Pot. Under 1990-talet började helt 3D-animerade filmer dyka upp, den första var Toy Story (1995). Efter det har flertalet filmer dykt upp och grafiken har blivit bättre och bättre. Däremot är det otroligt svårt att skapa 3D-animerad film som ser verklighetstrogen ut. Det går ganska bra med oorganiska material, till exempel bilar, och natur går relativt bra att göra också och likaså fantasifoster ser väldigt verklighetstrogna ut. Men när det kommer till att 3D-animera till exempel människor finns fortfarande en gräns som är svår att passera. Just huden är väldigt svår att replikera. Det allra senaste inom filmvärldens datorgrafik kan ses i filmer som Lord of the Rings och King Kong. För att göra Gollum i Lord of the Rings har man använt sig av motion capture på en riktig skådespelare för att sedan sudda bort skådespelaren och
lägga på en 3D-modell av Gollum med skådespelarens rörelser. Resultatet är slående och det ser verkligen ut som om Gollum är med i scenen. Gollum själv är dessutom gjord så bra att man skulle kunna svära på att han är verklig. Detta har i och för sig att göra med det mänskliga psyket, det är mycket lättare att acceptera hur någonting ser ut om vi inte har sett det förut. Det är också därför det är så svårt att lura oss med animerade människor, vi vet ju hur riktiga människor ser ut. För att göra så verkliga animationer som möjligt använder man sig av algoritmer för att modellera. Avancerade algoritmer bestämmer hur många hårstrån King Kong ska ha på bröstet och hur de böjer sig mot vinden. Vatten är också väldigt svårt att animera helt klockrent, men man har kommit väldigt långt på väg där. Ett exempel som är ganska gammalt vid det här laget är Titanic, där vattnet är animerat med en algoritm som faktiskt programmerades av Medietekniker från civilingenjörsutbildningen i Norrköping. Hur ser datorgrafikens framtid ut för filmen då? Jag tror att vi med största säkerhet kommer att gå bort helt från det gamla 35-millimetersformatet i stora produktioner. När datorkraften ökar ytterligare kommer man att kunna ha så stor upplösning att det inte märks någon skillnad mellan analog och digital film. Då kommer man att spara in enorma summor på att spela in digitalt. Man spar både tid och pengar. Jag tror också att datorkraften till slut kommer att låta oss göra så bra animerade människor att vi kan lura oss själva. Men det krävs inte bara datorkraft till det, utan också att förstå hur huden och håret fungerar och reflekterar ljus. Utan algoritmer kommer man inte långt med datorer. Men det finns många fler möjligheter. När man kan rendera och spela upp en animerad film i realtid, då finns ju helt plötsligt möjligheten för publiken att påverka filmens gång. Man kan lagra olika filmslut som publiken kan få välja mellan, men man behöver inte låsa sig där. Med tillräckligt stark datorkraft kan man välja att bara lägga in en plot och sedan låta publiken interagera med filmen och på så sätt styra handligen. Om publiken väljer att inte interagera kan filmen fortgå som den skulle gjort. Det blir en slags kombination av en film och ett spel. Tänk om man till exempel kunde påverka en skådespelare till att inte öppna en dörr, eller till att gå in i en annan person. Och så finns det regler för hur skådespelarna interagerar med varandra, de kan till och med ha personligheter som bestämmer hur de reagerar. Då kan man se samma film tusentals gånger utan att se samma film. Det blir som en mycket mer avancerad version av det populära The Sims. De olika möjligheterna vi kan komma att interagera med filmerna är ju också enormt intressanta. Tänk till exempel en miljö där man själv blir en del av filmen. Man kan prata med skådespelarna och känna på dem med hjälp av taligenkänning, VR-glasögon och hand tracking. Återigen närmar vi oss spelvärlden, men det är inte alls ett otroligt scenario som jag målar upp. Både spel- och filmvärlden är stora upplevelseindustrier med stora potentialer och en kombination skulle vara en helt ny gren. Jag tror däremot inte att filmfolket kommer att ta första steget, utan att det blir datorspelen som börjar kliva in i filmens värld. Det här är mina framtidsvisioner, men det är visioner som jag tror på. De är till viss del redan genomförbara idag, det enda som saknas för att göra en fullgod film är datorkraften. Och med Moores lag fortfarande gällande så lär det inte dröja mer än fem till tio år innan vi får se den första interaktiva filmen. Gollum från Lord of the Rings. Mycket fotorealistiskt, men det beror också på att vi faktiskt inte har sett något sånt här kreatur i verkligheten. I fantareklamen är bara 2D-grafik tillagd på filmen med bilen