Intro 3D Start

Intro

Det bästa sättet att lära sig 3D-grafik på är att öva. Annars blir det lite som att lära sig cykla genom att läsa en bok. Denna föreläsning kommer att gå igenom lite av den teori och systematik som ligger i grunden för skapandet.

Värt att nämna är att 3D-grafik hanteras på olika sätt i olika programvaror, dessa avsnitt försöker hantera hur det generellt ser ut, men ni ska vara medvetna om att det finns undantag där olika system löser saker på annorlunda sätt.

Vad används 3D grafik till?

Film
Inom film så används 3D grafik till nästan allt, dels på grund av att det är billigare än många andra lösningar, samt att det kan vara svårt att få till de effekter man vill ha utan att använda digitala hjälpmedel. Som exempel så kan vi istället för att använda flera hundratals statister skapa dessa karaktärer med hjälp av mjukvara. Detta är ofta mer ekonomiskt gångbart och gör att vi enkelt kan iterera fram precis det vi vill ha utan att behöva göra om allt från början.

Spel
När man tänker på 3D-grafik så är det ofta spel man kommer att tänka på. 3D-spel har funnits ett bra tag och populäriserades av framgångarna hos ett av de första 3D spel som nådde konsumenter. Wolfenstein 3D.

Sjukvård
Inom sjukvården så används 3D grafik bland annat för att skapa 3D modeller av organ.

Arkitektur
Man skapar ofta 3D modeller av byggnader för att kunna se hur det kommer att se ut på platsen dom ska byggas på innan dom är klara.

3D Printing
Den senaste tiden så har 3D-printing blivit mycket populärt. Detta innebär att man skapar en 3D-modell som skrivs ut, vanligtvis i plast men ibland metall eller andra material, av en maskin som bygger lager på lager underifrån tills dess att objektet är klart.



intro.jpg

Planering

När man skapar 3d grafik utifrån koncept art, som man gör i många fall främst inom spel och film, så brukar man börja med att strukturera sitt arbete. TIll höger så har vi ett koncept på ett tempel. Om vi ska skapa en scen utifrån denna så börjar vi med en så kallad "color paintover".

Detta gör man ofta för att lätt se vilka objekt som behöver skapas och hur man kan återanvända dessa inom scenen. När "color paintover" delen är klart så är nästa uppgift att blocka ut scenen i valfri mjukvara. Detta innebär att man tar enkla geometriska former, ofta kallade för primitiver, och placerar ut dessa i scenen med mål att försöka efterlikna konceptet. Detta gör man för att få en känsla för storlek och proportionerna i scenen.

Ofta brukar man redan nu lägga ut lampor, även detta för att få en känsla av hur scenen kommer se ut när den är klar.

planering.jpg

3D Vy

I de flesta mjukvaror som hanterar 3D-grafik så har vi en 3D viewport. I detta fönster så flyttar vi omkring en kamera och kan på så sätt navigera i en 3D-rymd på ett 2D-plan (skärmen).

I en 3D vy så har vi tre stycken axlar och ett rutnät. Rutnätet är placerat på X och Y axeln och agerar ofta "Golv", då dess position på Z axeln ofta är noll.

En av de mest användbara sakerna med att jobba i en viewport är att vi kan manipulera kameran efter behov och med detta pratar jag inte bara om förflyttning av kameran, vi kan även ändra på hur den visar 3D-rymden. Ofta när man jobbar med 3D-grafik så jobbar man i Perspektiv kombinerat med Ortografisk vy. Den översta bilden till höger visar 16 pelare i ortografisk vy och den undre med perspektiv vy aktiverat.

rymd.jpg

Objekt

Vad är då ett objekt?
Ett objekt innehåller vertices som bygger upp en mesh. En vertex är en punkt med XYZ position. Två vertices skapar en edge och tre vertices skapar en face. Faces kan bestå av hur många vertices som helst men inte färre än 3. Av praktiska skäl, samt hur grafikkort jobbar, så brukar man jobba med tris (en face med tre sidor) och quads (en face med fyra sidor). Ett objekt kan innehålla av hur många vertices som helst (med vissa begränsningar för olika filformat).

Ett objekt har även en mittpunkt, även kallad origin, objekt center eller helt enkelt "pivot point".

Ett objekt kan även innehålla annan data. Bland annat UV-koordinater, Animationer och/eller Material (som i sin tur kan länka till texturer). Mer om detta senare.

Exemplet till höger innehåller en kub. Denna kub består av 8 vertices, som skapar 12 edges som skapar 6 quads. Detta innebär att olika faces kan dela på edges och vertices.

I den gråa rutan på bilden ser vi hur ett objekt kan se ut i en 3D-modellerings mjukvaras outliner. EN outliner är en lista på alla objekt i en scen som vad objektet använder för material etc.

objekt.jpg

Transformering

Objekt går att "Transformera", ofta med hjälp av translering (flytta), rotering, och skalning. Denna transformation gör vi genom att ändra på "origin". Roterar vi vårt objekt så kommer hela objektet rotera kring origin, skalar vi så kommer vi att skala utifrån origin ec. Att göra dessa ändringar på hela objektet kallas för att jobba i "objekt läge".

transformering.jpg

Polygonmodellering

Hur skapar vi då polygonbaserad grafik?
Vi kan börja med att gå igenom de primitiver som ofta finns med i 3D-modelleringsmjukvaror. Kub, Cylinder, Sphere, Torus och Kon. Det är ganska lätt att själv skapa dessa former men dom brukar finns med för att snabba upp arbetsflödet.

Skapar vi till exempel en kub så har vi (oftast) skapat ett nytt objekt. Vi har även möjligheten att gå in i objektet och transformera, skapa nya eller ta bort vertices, edges och faces. Detta arbetet kallas lite olika i olika program men ofta beskrivs det som att jobba i "editerings läge".

Translering, rotering och skalning fungerar inte bara på objektnivå, utan också när i ska manipulera vertices, edges och faces.

Här till höger så har vi några primitiver. Alla dessa är i olika objekt. Vi är inne i "editeringsläge" för sfären och kan då manipulera dess vertices.

polygonmodellering.jpg

Polygonmodellering

Det finns olika verktyg för att skapa mer vertices att jobba med.
Extrudering, skapa nya edge loops och subdivision är nog de tre vanligaste verktyg man använder för att skapa ny geometri.

Extrudering är ett av de enklaste och mest kraftfulla sätt att skapa geometri. Verktyget fungerar så att man markerar det man vill extrudera och använder verktyget. Detta kommer att skapa nya vertices som förflyttas ut från markeringens normal. Det går även att själv definera vilken axel som extruderingen ska ske efter.

Först så hittar algoritmen de yttersta edgarna runt det markerade området, algoritmen tar även hänsyn till edges som är inuti det markerade området och vet att dessa kommer vara på insidan. EFter detta så görs alla de yttersta edgearna om till en face. Algoritmen tar även hänsyn till en mängd specialfall men dessa kan vi ignorera för tillfället.

Skapa nya edge loops. Först och främst ska vi ta och definiera vad en edge loop är. En edge loop är löst definerat som en serie sammankopplade edges över en yta. Oftast så är den första verticen i kedjan sammanlänkad med den sista. Som exempel kan vi tänka oss ett hål. Alla vertices runt om hålet är en edgeloop(oftast). Att skapa nya edge loops innebär att vi skapar nya edge loops bredvid en redan existerande edge loop. Om vi till exemple har en cylinder som är uppbyggd av massa edge loops på rad så kan vi lägga in ytterligare edge loops med hjälp av detta verktyg.

Subdivision används till många olika saker, i början ofta för att skapa mera vertices att manipulera och i slutet för att få en kantig mesh att bli rund med hjälp av att sätta in flera faces för att mjuka upp kanter och ytor. Det finns två olika sätt att använda subdivision på. Med eller utan smoothing. Om vi till exempel använder subdivision på en kub bestående av 6 quads så skulle resultatet bli utan smoothing att modellen skulle se likadan ut men varje sida skulle bestå av fyra faces istället för av bara en. Hade vi använt smoothing så hade kuben blivit en kantig sfär.



polygonmodellering2.jpg

Normaler

Ett objekt innehåller även normalinformation. Inom geometri så är normalen "en linje som är vinkelrät mot en annan linje." Detta innebär att, inom 3D grafik, en faces normal är åt det håll en face pekar. Detta blir relevant i och med att en polygon bara kan ses från ett håll, åt det håll som dess normal pekar åt. Det är inte bara faces som har en normal, även vertices har normaler, så kallad vertex-normal.

Här under så har vi exporterat en kub, med 6 faces, till en obj fil och öppnat upp den i notepad.

v -2.000000 0.000000 0.000000
v -2.000000 0.000000 -2.000000
v 0.000000 0.000000 -2.000000
v 0.000000 0.000000 0.000000
v -2.000000 2.000000 0.000000
v -2.000000 2.000000 -2.000000
v 0.000000 2.000000 -2.000000
v 0.000000 2.000000 0.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
s off
f 5//1 6//1 2//1 1//1
f 6//2 7//2 3//2 2//2
f 7//3 8//3 4//3 3//3
f 8//4 5//4 1//4 4//4
f 1//5 2//5 3//5 4//5
f 8//6 7//6 6//6 5//6


Första raderna, som börjar med "v" följt av tre siffror (xyz koordinaterna) är de vertices som finns i modellen.
De rader som börjar med "vn" är vertex normaler. Dessa visar vilken håll varje vertex pekar.
De sista raderna, som börjar med "f" är alla faces. De nästkommande fyra "blocken" är varje vertex och vilken vertex-normal den vertexen använder.


normaler.jpg

Shading

Flat Shading.
Flat shading är en shading teknik som skuggar en face beroende på vinkeln mellan facens normal och ljuskällan. Detta innbär att hela facen kommer att skuggas lika mycket. Denna teknik är väldigt snabb att rendera men har effekten av att varje vertex kommer att behöva ha flera normaler. Har vi till exempel en kub som använder flat shading så kommer varje av de åtta verticerna ha en normal som pekar utåt åt två håll samt uppåt eller neråt.

Smooth Shading.
Till skillnad från flat shading så försöker smooth shading att skugga ytorna, beroende på vertex normalen, genom att använda en interpoleringsteknik som räknar ut skuggningsvärdet på pixelar mellan varje vertex på facen. Det finns olika typer av smooth shading som inkluderar bland andra gouraud och phong shading.

Ofta, speciellt i 3D-grafik för spel, så används en blandning av flat och smooth shading då de lämpar sig olika bra för olika ytor. Flat shading går snabbare att rendera men ökar antalet vertices som behöver hanteras, smooth shading är tyngre att rendera men skapar inget ytterligare vertex-data.

Om vi kollar på exemplet längst till höger på bilden så har vi två så kallade "Smooth Groups". Både överdelen och sidan är mjuka, men verticerna på kanten är uppdelade så att vertex-normalerna pekar både upp och åt sidan. Ofta kaller man edgarna på den kanten för en "hard edge".

shading.jpg

Ljus

Point Light.
En Point Light skickar ut ljus, åt alla håll, utifrån sin mittpunkt.

Spot Light
En Spot Light skickar ut ljus åt ett specifikt håll, i en tydlig kon. Ljuset är oftast starkare i mitten av konen och blir svagare och svagare ju närmre kanten man kommer. Denna sänkning av intensitet kallas ljusets "falloff". Fortfarande i många spelmotorer är Spot Lights de enda ljuskällorna som kan skapa skuggor i realtid.

Directional Light
En Directional Light är en ljuskälla som har en tydlig riktning, men ingen klar källa. Denna typ av lampa simulerar ljuset från en sol och skickar ut parallella ljustrålar åt en och samma riktning, utan att ljustyrkan avtar med avstådet.

Area Light
En Area Light fungerar som en blandning mellan en Point och en Spot Light. Denna ljuskälla fungerar så att den skickar ut ljus utifrån ett plans normal. Detta är ett mer naturnära ljus och anpassar sig bra som ljuskällor utanför fönster där det inte lämpar sig att använda till exempel en Point Light.

Emissive
Ofta så vill man inte ha en punkt i världen som skickar ut ljus, utan ett helt objekt. Har vi till exempel en scen med en stor fyrkantig lampa så vill vi att hela detta objekt ska skicka ut ljus istället för bara en point light i mitten av den, då vi slipper hålla på med transparans och liknande effekter. Emissive är ingen lampa utan ett värde vi kan ställa in i materialet på varje objekt. Mer om material senare.

ljus.jpg

Rendering

Rendering som inte sker i realtid kan delas in i två olika typer.

Unbiased Rendering
Unbiased renderare kallas ofta för fysiskt korrekta renderare. Även om denna beskrivning inte är helt sann, då inget inom datorgrafik är helt fysiskt korrekt, så innebär detta att dessa renderare kalkylerar ljusets gång så statistiskt träffsäkert som dess algoritm tillåter. Detta innebär att vi det inte kan skapas systematiska fel (bias) på grund av till exempel användarens inställningar. Renderingen pågår ofta utan slut men kan avbrytas när användaren har blivit nöjd.

Biased Rendering
Biased renderare kräver mycket mera av användaren, men kan ge ett väldigt bra resultat mycket snabbare. Istället för att rendera tills att acceptabelt resultat blivit nått så renderas en "enkel" bild ut som sedan med hälp av utsuddning och interpolering skapar en bild. Detta innebär att bilden kanske inte blir helt fysiskt korrekt men ändå se visuellt bra ut.

Allt detta innebär också att en Unbiased renderar sällan är väl anpassad för rendering av flera frames på rad (som behövs vid video) utan är mer anpassade för rendering av enstaka bilder av tex vid visualisering av byggnader.



rendering.jpg

Settings

Physical Sun and Sky (maya specifik)
I maya finns det i mental ray renderaren en preset som heter "Physical Sun and Sky". Denna skapar ljusinställningar som simulerar dagsljus.

IBL
Image Based Lightning är en teknik som skapar nästintill foto-realistiska ljus-scenarion. Med denna aktiverad så laddar man in en egen bitmapsbild som används för att sprida ljus i scenen. Ofta så är bitmapsbilden ett fotografi av en riktig miljö, i panorama eller genom att ta bilder av en chrome-boll(som reflekterar den omgivande miljön).

GI
Global Illumination tar hänsyn till att ljus studsar tills dess att det har blivit helt absorberat.

Caustics
Ljuseffekten av hur ljus blänker och bryts i till exepel botten på en pool fylld med vatten.

Final Gathering
Ett system för att optimera och förbättra bland annat global illumination. Istället för att kräva att varje potentiell ljusståle ska renderas så tar den några få och interpolerar mellan dessa, samt att ljuset inte behöver studsa mer än en gång, snabbar upp renderingstiden avsevärd utan att skapa dåliga renderingar.

Ambient Occlusion
Ambient Occlusion finns igentligen inte i den riktiga världen, men i 3D så brukar man använda systemet då det är relavtivt snabbat att rendera (går även att göra i realtid). Ambient Occlusion refererar till att objekt hindrar varandra, som olika delar av sig själva, från att träffas av indirekt diffust ljus. Som exempel så kan man få sprickor och liknande geometri att synas mycket tydligare med hjälp av AO.

Till höger så har vi tre stycken renderingar med Physical Sun and Sky. Den översta har inget ljus som studsar, mitten har GI och FG igång. På den understa har vi även aktiverat så att vår Directional Light (sol) skickar ut ljus som studsar (Photons). I denna scen så kanske det hade varit tillräckligt att strunta i GI, FG och istället lägga in en svagt lysande lampa inomhus för att få en likande effekt som inte tar lika lång tid att rendera.

settings.jpg

Material

Ett objekt kan även så kallade materials (shaders) på sig. En shader är en funktion som tar hand om hur ett objekt ska visas på skärmen. Detta genom att beskriva egenskaper hos en vertex eller pixel. Skillanderna mellan en vertex shader och en pixelshader är att en vertex shader beskriver egenskaperna hos en vertex (position, uw-koordianter, färg etc) medans en pixelshader beskriver egenskaperna (färg, z-djup och genomskinliget etc) hos en pixel.

Det finns även en nyare typ av shader, kallad geometri-shader. Denna shader kan, förenklat, skapa ytterligare geometri efter att grundgeometrin redan har laddas in.

Det finns en uppsjö av olika parametrar som kan finnas i en shader och många av dessa kan styras med hjälp av en bitmapsbild. De parametrar som ni kan att komma i kontakt med är bland andra:

Color - Sätter färg på faces.
Diffuse Map - Färg med hjälp av en bitmapsbild.
Diffuse - Kontrollerar hur ljus sprids efter interaktion med en yta.
Specular Color - Intensitet och ibland färg på blänk.
Specular Gloss - Storlek på blänk.
Normal Map - Används för att simulera komplex geometri på mindre komplexa ytor. Detta genom att beskriva normalinformation genom RGB kanalerna i en bitmapsbild.
Transparancy - Genomskinlighet.
Emissive - En paramaterer som hanterar om ett objekt inte ska påverkas av ljus. Detta genom att visa alla pixlar med full intensitet. Kan i vissa renderare även agera som en ljuskälla.
Height Map - Används för att procedurellt flytta vertices. Kan även användas i samband med tesselering för att skapa ny geometri.


material.jpg

Texturer

I och med att ytan på ett objekt ofta har olika visuella element så behövs det ett system som vi enkelt kan implementera och använda som hanterar sådan information. Detta system kallas för Texture Mapping och innebär att vi applicerar 2D-bilder på 3D objekt. Som ett exempel kan vi ta en trävägg. Istället för att manuellt modellera in varje träplanka så kan vi använda ett fotografi på en trävägg och lägga denna på en plan yta. Detta kommer i många fall att räcka för att ge den visuella information vi behöver för att övertyga betraktaren att väggen faktiskt består av träplankor.

Proceduren att applicera 2D bilder på ett 3D objekt innefattar att man måste vika ut 3D meshen på ett 2D plan. Detta kallas att UV-mapping och mer om detta i nästa stycke.

Här till höger har vi olika bitmapsbilder som används till olika parametrar i en shader. Överst har vi Diffuse och Normal Map. Underst har vi Height Map, Gloss map och till sista Specular Map.

texturer.jpg

UV

När man texturerar ett objekt så behöver man för bästa resultat "unwrappa" objektet. Det här kan liknas vid att man klipper upp objektet längs utvalda kanter och lägger det på en platt yta så att man kan lägga en bild ovanpå.

Det är lite som papercraft, fast baklänges.

Den resulterande 2-dimensionella bilden kallas för en UV-map. Anledningen till att den heter så är teknisk - man mappar 3-dimensionella koordinater (x,y,z) till 2-dimensionella, som man då ger namnen u respektive v.

Det finns flera olika sätt att skapa den här UV-mappen, men det sätt vi ska använda är det mest grundläggande och precisa sättet, nämligen att definera kanter att skära längs själv och sedan vika upp modellen enligt dem.

Börja med att välja de kanter som vi ska skära längs. Resultatet bör bestå av så få separerade delar som möjligt, så när det gäller en kub så vill vi alltså sätta ut sömmar på ett sådant sätt att hela kuben kan läggas platt i ett stycke.

uv.jpg