Procedurell stad Projekt i kursen TNM022 Procedurella metoder för bilder Tobias Heldring, tobhe335 2011-02-09
Sammanfattning Jag har gjort en enkel stadsgenerator med fokus på stadssiluett. Programmet är byggt med c++ och OpenGL och använder sig av GLUT för fönsterhantering. Programmet genererar upp en stad med ett regelbundet vägnät och hus av varierande höjd med en koncentration av höga hus i mitten av staden. Husen i staden innehåller dessutom variation i form av olika husfärg samt takmodeller. Dessa placeras ut dels slumpmässigt och dels med hänsyn till husen höjd.
Genomförande Programmet är utvecklat i Microsoft Visual c++ 2008 använder OpenGL för grafik samt GLUT för fönsterhantering. Programmet använder sig även av brusfunktionerna i klassen noise1234, Stefan Gustavsons implementation av Ken Perlins Improved Noise. Staden som genereras har en diameter på 38 längdenheter, husen är 1x1 i bredd och djup och deras höjd varierar från 0,3 till ca 7, där höjden avrundas till hela våningar med våningshöjden 0.3. Hushöjd Husens höjd påverkas av tre olika parametrar. Den första är brus som ger en regelbunden variation i hushöjden. Den andra är att husen får ytterligare höjd adderat beroende på hur nära centrum av staden de är belägna. Den tredje är en slumpfaktor som fördubblar höjden på vissa hus. Hus nära centrum har en större sannolikhet att få höjden dubblerad. Till sist så avrundas husens höjd till en multipel av våningshöjden som är definierad till 0.3 längdenheter. Brus Alla hus får till och börja med standardhöjden 1 längdenhet. Till det adderas ett tvådimensionellt brus för att ge husen en regelbunden variation i höjd. Inparametrarna till bruset är husets koordinater. Dessa divideras var och en med en faktor 7 för att få lagom periodicitet på bruset. buildingheight=1 noise x/7, y/7 Eftersom staden har en diameter på 38 längdenheter befinner sig x och y inom intervallen nedan. 19 x 19,19 y 19
Central höjd Till höjden som fås efter att bruset lagts på adderas ytterligare höjd beroende på hur nära centrum av staden huset befinner sig enligt formeln nedan. buildingheight=buildingheight 3 4 distancefromcenter 1 cityradius Slumpfaktor Till sist används en slumpfaktor för att i vissa fall fördubbla höjden på husen. Hus närmare centrum har större chans att påverkas. Sannolikheten att höjden fördubblas förändras linjärt mellan 0% för hus längst ut i staden till 40% för hus i stadens mitt. Operationen sker när villkoret nedan uppfylls, där randomnumber varierar mellan 0 och 1. randomnumber 0.6 0.4 distancefromcenter cityradius
Till sist avrundas husets höjd till en multipel av våningshöjden som är 0.3 längdenheter Husfärg Husen kan ha tre olika färger. Brun används för att indikera hus med tegelmaterial eller liknande och hus på 4 våningar eller mindre har en 25% chans att bli bruna. För husen som inte tilldelas färgen brun blir hälften ljusgrå och hälften mörkgrå. Färgerna ser inte speciellt naturtrogna ut då det var svårt att få en sån färg på en husmodell som är av enklast möjliga slag, en polygon för varje sida och ingen textur. Det var då svårt att förmedla känslan av en mörk färg som är starkt upplyst. Husform Husen tilldelas även tre olika typer av tak för att ge ytterligare variation till stadsbilden. Taken kan ha formen av en prisma, pyramid eller vara platta. För hus med 6 våningar eller mindre är sannolikheten 25% att få ett prismatak. Dessa tak kan vara vinklade i två olika riktningar där fördelningen mellan de två är hälften hälften. Hus på 13 våningar eller mer har 50% sannolikhet att få ett pyramidtak. Resten av husen har ett platt tak.
Resultat Resultatet kan ses som en bra början på en stadsgenerator men med ett par viktiga aspekter som saknas för att på allvar likna en riktig stadsbild. Höjdskillnaderna hos husen tycker jag på ett bra sätt skildrar innerstadsområdet i en stad av större storlek. De flesta husen är i samma höjd som grannhusen, med ett par undantag som sticker ut samt med höga hus koncentrerade till ett höghusområde. Igenkänningsfaktorn i de olika hustaken gör att tittaren snabbare förstår vad bilden föreställer samt är en början för att visa på den enorma variation som finns i byggnadskonstruktionerna i en riktig stad. De varierande husfärgerna hjälper också till med ytterligare variation även om det faktiska färgerna ser något onaturliga ut. Ett par viktiga egenskaper saknas för att på allvar likna en riktig stad och dessa skulle vara bra förslag för framtida utveckling. Det kanske mest slående är den exakta regelbundenheten i vägnätet som ju är väldigt sällsynt i riktiga städer. Här skulle man vilja har ett mer varierande vägnät. Jag lade en del tid på att försöka rita ett vägnät med hjälp av voronoidiagram och letade bland annat efter kodimplenentation av voronoi men hade svårt att hitta nån som jag kunde köra och som uppfyllde mina behov i det här fallet. Med ett mer oregelbundet vägnät blir det naturligt att införa olika storlek på husen även breddmässigt vilket även det är en bra förbättringspunkt. Till det skulle man kunna införa områden som är tomma t.ex. parkområden.