Simulering och rendering av gräs och vind i realtid Linköpings universitet, ITN, TNM085, VT2010 Carl Claesson, 850508-1672, carcl268@student.liu.se Lucas Correia, 870325-7496, lucco863@student.liu.se David Jonsson, 870214-7557, davjo025@student.liu.se Martin Jönsson, 870720-4015, marjo424@student.liu.se 14 mars 2010
Sammanfattning Inom dagens datorgrafik spenderar man sällan tid med att modellera och simulera naturens mindre beståndsdelar på ett detaljerat sätt. En av dessa delar är gräs, vilket detta projekt inriktar sig på. Istället för att använda sig av enkla texturer, simuleras gräset med fysikaliska modeller och renderas som geometriska objekt. Detta leder till ett realistiskt bidrag till en miljö. I framtiden kommer denna typ av detaljerade miljöer bli allt vanligare på grund av kraftfullare datorer.
Innehållsförteckning 1 Inledning 1 1.1 Bakgrund..................................... 1 1.2 Syfte........................................ 1 2 Utvecklingsmiljö 2 3 Fysik 3 3.1 Gräsmodell.................................... 3 3.2 Fysik i två dimensioner.............................. 4 3.3 Fysik i tre dimensioner.............................. 4 4 Numerisk simulering 6 5 Vindsimulering 7 5.1 Areaindelning................................... 7 5.2 Vindtyper..................................... 7 6 Rendering 9 6.1 Modellering.................................... 9 6.2 Ljussättning.................................... 9 6.3 Texturering.................................... 10 6.4 Heightmap och densitymap............................ 10 7 Körinstruktioner och systemkrav 11 8 Resultat och diskussion 13 8.1 Resultat...................................... 13 8.2 Diskussion..................................... 13 8.2.1 Förslag på förbättringar.......................... 13 8.2.2 Svårigheter................................ 14 Litteraturförteckning 15
Figurer 3.1 Gräsets uppbyggnad................................ 3 4.1 Jämförelse av numeriska metoder. Bildkälla: [1]................. 6 6.1 Modellerat grässtrå................................ 9 6.2 Textur med alfakanal............................... 10 6.3 Renderad terräng................................. 10 7.1 Renderad miljö med vind av typ tornado applicerad................ 12
Tabeller 7.1 Kontroller..................................... 11 7.2 Rekommenderat system.............................. 12 8.1 Uppdateringsfrekvens (FPS)........................... 13
Kapitel 1 Inledning 1.1 Bakgrund Det görs inte många realtidssimuleringar av de mindre beståndsdelarna i naturen, som till exempel gräs. Att implementera denna typ av simulering skulle bidra till en mer realistisk återgivning av verkligheten. I dagsläget läggs inte resurser på det här, då det kräver för mycket prestanda. I och med att beräkningar allt oftare flyttas från datorns processor till grafikkortet, kommer den här typen av simuleringar att öka. 1.2 Syfte Målet är att simulera ett realistiskt system bestående av gräs som påverkas av vind och gravitation. Simuleringen skall utföras i realtid och vindens parametrar ändras interaktivt. Parametrarna som justeras är bland annat vindens riktning och styrka. 1
Kapitel 2 Utvecklingsmiljö Systemet är skapat med hjälp av OpenGL (Open Graphics Library) och GLUT (OpenGL Utility Toolkit) då dessa är platsformsoberoende. Det senare är ett tilläggsbibliotek till OpenGL som sköter fönsterhantering samt in- och utmatning från mus och tangentbord. Till alla komponenter finns API:n för C++, vilket bidragit till att projektet utvecklats i C++. För att hantera olika versioner av programmet under utvecklingsperioden används git som är ett versionshanteringssystem. Projektets utveckling kan följas på hemsidan GitHub [2]. För att underlätta arbetet har färdiga funktioner använts, som är licensierade under fri licens. Till exempel vid inladdning av texturer samt vid terrängrendering. Funktionerna har dock modifierats för att passa in i projektet. 2
Kapitel 3 Fysik 3.1 Gräsmodell Uppbyggnaden av gräset är gjort i flera steg, se figur 3.1, där ett grässtrå består av ett antal segment. De fysikaliska beräkningarna utförs på varje enskilt segment med hänsyn till föregående segment. Kollisioner mellan grässtrån bortses, då ett enskilt grässtrås inverkan på ett annat är minimal i jämförelse med vindens inverkan. I varje grässtrå sparas en grundposition och en grundvinkel, därefter beräknas segmentens vinklar och positioner utifrån dessa. Denna beräkning sker utifrån en extern kraft, F, bestående av vind och gravitation. Segmenten innehåller en längd, r, och en massa, m, som används för att beräkna ett tröghetsmoment, I, enligt ekvation 3.1. I = mr2 3 (3.1) Figur 3.1: Gräsets uppbyggnad 3
3.2 Fysik i två dimensioner Först beräknas kraftens riktning för segmentet enligt ekvation 3.2, resultatet blir en vektor, u, med längden 1 som är ortogonal mot segmentet. u.x = cos α u.y = sin α (3.2) u.z = 0 Därefter beräknas styrkan på kraften, F r, längs med u enligt ekvation 3.3. F r = F u (3.3) Vridmomentet som påverkar segmentet fås genom ekvation 3.4, där r är segmentets längd och k fjader är en fjäderkonstant som approximerar segmentets spänst. Skillnaden mellan nuvarandeoch grundvinkeln, α och α 0, gör så att vridmomentet drar tillbaka segmentet till sitt ursprungsläge. τ = r 2 F r k fjader (α α 0 ) (3.4) Med hjälp av vridmomentet, τ, kan vinkelhastigheten, ω, beräknas med ekvation 3.5. Konstanten k friktion motsvarar luftmotstånd och styvhet i grässtrået. ω = k friktion τ dt (3.5) I Segmentets vinkel kan till slut beräknas genom att integrera vinkelhastigheten, ekvation 3.6. α = ω dt (3.6) Ekvationerna 3.5-3.6 kan istället beskrivas som en dubbelintegral enligt ekvation 3.7 α = k friktion τ dtdt (3.7) I Vinkeln, samt föregående segmentets position, x n 1, används därefter i ekvation 3.8 för att uppdatera segmentets position x n. x n = x n 1 + rcos(α) y n = y n 1 + rsin(α) (3.8) z n = z n 1 3.3 Fysik i tre dimensioner En naturlig utökning till den tvådimensionella fysiken är att låta gräset röra sig i tre dimensioner. Detta görs genom att gräsets vridning i XZ-planet, β, approximeras som att den rör sig mot vindens riktning i XZ-planet, θ v. Beräkningen för detta visas i ekvation 3.9. Konstanten k vrid approximerar friktionen då gräset vrider sig mot vinden. β = β + k vrid (θ v β); (3.9) 4
Den nya positionen för segmentet beräknas sedan med hjälp av ekvation 3.10, som utgår från ekvation 3.8 och utökar ekvationen med vinkeln i XZ-planet. x n = x n 1 + rcos(α)sin(β) y n = y n 1 + rsin(α) (3.10) z n = z n 1 + rcos(α)cos(β) 5
Kapitel 4 Numerisk simulering Till en början gjordes simuleringen med Eulers stegmetod, eftersom det är den enklaste av de numeriska metoderna. Metoden visas i ekvation 4.1 där värdet i nästa tidssteg, y k+1, beräknas med hjälp av värdet på det nuvarande tidssteget, y k, derivatans värde, f(t k, y k ), samt steglängden h k. y k+1 = y k + f(t k, y k )h k (4.1) För att minska eventuella numeriska problem används istället ekvation 4.2 som är en förbättrad Euler-metod. Denna tar hänsyn till värden i två tidssteg vilket leder till en bättre anpassning till den exakta lösningen, vilket visas i figur 4.1. Den förbättrade metoden är dock mer beräkningstung än sin föregångare. k 1 k 2 = f(t k, y k )h k = f(t k+1, y k+k1 )h k y k+1 = y k + k 1+k 2 2 (4.2) Eulers stegmetod är en numerisk metod av första ordningen och den förbättrade metoden är av andra ordningen. För att ytterligare förbättra de numeriska beräkningarna kan metoder av högre ordning användas. Runge-Kutta är en sådan metod, där fler derivator ingår i beräkningen. Eftersom inga numeriska problem uppstod, implementerades ingen metod av högre ordning då dessa är mer beräkningstunga än metoder av andra ordningen. Figur 4.1: Jämförelse av numeriska metoder. Bildkälla: [1] 6
Kapitel 5 Vindsimulering Implementationen av vindsimulering representerades från början av en kraftvektor för varje grässtrå. Denna metod är dock inte optimal då det verkliga systemet är svårsimulerat i sfäriska koordinater, vridning i horisontell led ser felaktig ut. En lättare form av vindrepresentation är att beskriva vinden som en vinkel och en styrka, detta används istället i beräkningarna. Vid större simulationer krävs mycket processorkraft för att beräkna vinddatan, därför behövs någon form av areaindelning där vinden beräknas för en yta istället för enskilda grässtrån. 5.1 Areaindelning För att spara processorkraft delas terrängen upp i areaytor. Beräkningen av vinden sker antingen en gång för varje yta eller för varje grässtrå på ytan. Detta bestäms med hjälp av olika avståndsbedömningar. Vid ytor nära kameran där skillnaden i rörelse är stor mellan närliggande grässtrån beräknas vinden enskilt för varje grässtrå. För ytor som ligger långt bort från kameran eller vindcentrum beräknas vinddatan endast en gång per yta. Storleken på ytorna bestäms av användaren, datorer med låg prestanda bör använda större ytor. 5.2 Vindtyper För att testa de dynamiska egenskaperna i simuleringen krävs olika typer av vind. I detta system testas lugn vindbris, vind från ovan så som orsakad av en helikopter, tornado samt riktad vind där parametrarna ändras interaktivt. Vindstyrka och vinkel beräknas som en funktion av gräsets baskoordinater samt avståndet, L, från vindcentrum. Beräkningen för styrka och vinkel vid vind från ovan ser ut som i ekvation 5.1 och 5.2, i ekvation 5.2 används avståndet, L, samt en konstant, C, för att reglera förändringen i vindstyrka. arctan( z ) om x > 0 och z 0 x arctan( z ) + 2π om x > 0 och z < 0 x arctan( z θ V = ) + π om x < 0 x π om x = 0 och z > 0 2 3π om x = 0 och z < 0 2 0 om x = 0 och z = 0 (5.1) 7
F V = C( 1 L ) (5.2) Vindberäkningarna för tornado görs på liknande sätt, skillnaden är att vinkeln beräknas som tangent mot vindcentrum. 8
Kapitel 6 Rendering Trots att fysiken fungerar bra krävs det ytterligare metoder för att göra resultatet trovärdigt. Något som förstärker trovärdigheten är till exempel ljussättning, texturering och rätt modellering. Gräset måste även placeras med olika täthet i en naturtrogen miljö med höjdskillnader. All rendering sker med hjälp av OpenGL, fönsterhanteringen sköts via GLUT. 6.1 Modellering Gräset består, som nämnts tidigare, av segment. Varje segment renderas som en rektangulär yta med en grundbredd. Hela gräset är alltså rektangulärt men genom texturering justeras gräsets form. Figur 6.1: Modellerat grässtrå 6.2 Ljussättning OpenGL har färdiga ljusfunktioner för att ljussätta en scen. I denna simulering används ett spot-ljus med inställd placering, riktning och styrka. 9
6.3 Texturering Textureringen som används är en bitmapstextur med alfakanal. För att ladda in en textur används en extern inladdningsmetod [3]. Från början hanterade metoden endast 24/8/4/1 bitars bitmapsbilder. Eftersom en alfakanal tar åtta bitar extra i utrymme har denna metod modifierats för att kunna ta in 32 bitars bitmapsfiler. OpenGL har funktioner för att använda inladdade texturer och placera ut dessa på objekt. Textureringen sker med så kallad MIP mapping (MIP från latinska multum in parvo). Denna metod går ut på att använda olika upplösningar på texturerna beroende på objektens storlek i scenen. Figur 6.2: Textur med alfakanal 6.4 Heightmap och densitymap För att modellera terrängen används en heightmap. Det vill säga en gråskalebild där mörka partier representerar låg höjd i terrängen och ljusa partier representerar hög höjd. Gråskalebilden stegas igenom, punkterna lagras och används för att rita upp en terräng bestående av triangulära polygoner. Terrängrenderingen utgår från öppen källkod [4] men har modifierats för att passa in i projektet. På liknande sätt som i Rendering Grass in Real Time with Dynamic Lighting [5] används en gråskalebild som densitymap, där mörkare partier representerar mindre täthet av grässtråna. Ur denna fås ett täthetsvärde över ett visst område. Detta värde multiplicerat med ett maxvärde bestämmer hur många grässtrån som ska placeras ut över respektive område. Figur 6.3: Renderad terräng 10
Kapitel 7 Körinstruktioner och systemkrav För att navigera i rymden används tangentbord och mus. Vinden styrs av tangentbordet. En full lista av kontroller följer i tabell 7.1. Tabell 7.1: Kontroller Kontroller Kommando Kamerastyrning W Flytta framåt A Flytta sidled vänster S Flytta bakåt D Flytta sidled höger Musklick + dra Rotera i rymden Vindstyrning T Tornado B Bris H Helikopter N Riktad 8 Öka vindstyrka 2 Minska vindstyrka 4 Ändra vindrotation motsols 6 Ändra vindrotation medsols 7 Flytta vindcentrum negativ z-led 9 Flytta vindcentrum positiv z-led 1 Flytta vindcentrum negativ x-led 3 Flytta vindcentrum positiv x-led 0 Nollställ vindcentrum För att programmet ska köras så bra som möjligt, rekommenderas systemet i tabell 7.2. Programmet fungerar även för system med sämre prestanda men justering av antal grässtrån måste göras och där med minskar den upplevda kvaliteten. 11
CPU Grafikkort Minne Hårddiskutrymme OS Tangentbort och Mus Tabell 7.2: Rekommenderat system 2.67 GHz GeForce GTS 250 1024 MB 3072 MB 1.5 MB Windows, Mac OS, Linux Figur 7.1: Renderad miljö med vind av typ tornado applicerad. 12
Kapitel 8 Resultat och diskussion 8.1 Resultat Projektetets resultat är ett körbart program där man i realtid kan se ett gräsfält som rör sig i vinden. Tanken med resultatet är att det ska kunna användas i ett spel som en del av miljön och därigenom ge ett mer verkligt intryck. I simuleringen påverkas gräset av gravitation och vind. Där kan vinden manipuleras genom att välja olika vindtyper samt dess styrka och riktning. Gräsfältet växer på en kuperad terräng som är indelad i 1024 delar. Varje del innehåller mellan 0 och 15 grässtrån som i sin tur består av tre segement. Dessa inställningar är baserade på utförda tester redovisade i tabell 8.1. Inställningarna är inte optimala ur beräkningssynpunkt men ger ett estetiskt tilltalande resultat som kan ses i figur 7.1. Tabell 8.1: Uppdateringsfrekvens (FPS) FPS Antal grässtrån Texturer Vindtyp Segment 49 6 750 På Helikopter 3 25 13 500 På Helikopter 3 19 18 000 På Helikopter 3 20 18 000 Av Helikopter 3 29 18 000 På Riktad 3 20 18 000 På Tornado 3 24 18 000 På Bris 3 44 18 000 På Helikopter 1 26 18 000 På Helikopter 2 19 18 000 På Helikopter 3 14 18 000 På Helikopter 4 12 18 000 På Helikopter 5 8.2 Diskussion 8.2.1 Förslag på förbättringar För att kunna utöka antalet grässtrån och storleken på terrängen krävs det ytterligare optimering av koden. Detta kan till exempel göras genom att flytta beräkningar från datorns processor till grafikkortets processenhet genom att använda CUDA (Compute Unified Device Architecture) 13
eller OpenCL (Open Computing Language). Vidare optimering av prestanda kan göras genom att införa grader av detaljnivåer (eng: Level of detail). Beroende på avståndet från betraktaren används olika modeller och vid långa avstånd ritas endast ett texturplan ut. För att visuellt förbättra utseendet av gräsfältet kan till exempel skuggor, himmel eller andra objekt läggas till i scenen. Detta kan dock påverka prestandan negativt. 8.2.2 Svårigheter Det som har varit svårast var att implementera fysiken i tre dimensioner. Dels på grund av att olika koordinatsystem används i ekvationer för polära koordinater och i OpenGL, dels på grund av att det var svårt att modellera systemet så att det stämde överens med verkligheten. Ett genomgående problem har varit att få vinklarna i systemet att motsvara vinklar i verkligheten. Speciellt när vinklar har befunnit sig runt noll grader. Det var även några svårigheter vid textureringen, till exempel att ladda in texturen med en alfakanal från en bildfil. 14
Litteraturförteckning [1] Alexandrov O. Numerical integration illustration; 2007. http://en.wikipedia. org/wiki/file:numerical_integration_illustration,_h%3d1.png. Hämtad: 10 mars, 2010. [2] 3 G. Versionshantering av projektet martnu/grass; 2010. http://github.com/ martnu/grass. Skapad: 20 januari, 2010. [3] Backhouse C. BMP Loader. Chris s Page: OpenGL, GLUT, C++, my Bitmap Loader. and more!; 2006. http://users.ox.ac.uk/~orie1330/bmploader.html. Hämtad: 20 februari, 2010. Hemsida. [4] Sempe L. Terrain Rendering using Heightmaps. Datorgrafik. 2002;http://www. spheregames.com/download.php?name=terrain_pdf. Hämtad: 28 februari, 2010. [5] Kevin Boulanger KB Sumanta N Pattanaik. Rendering Grass in Real Time with Dynamic Lighting. Datorgrafik. 2009 januari/februari;p. 37. 15