Procedural Cute Planet Generator (PCPG)

Gemaakt door Jeroen Officier, 500822999


Hoe zou jij het vinden om jou eigen planeet te kunnen genereren?

Dit project gaat het genereren van cartoonish style low poly persoonlijke planeten realiseren. Deze planeten genereren met een texturemap die meerdere biomes bevatten waarvan de totale opmaak van deze biomes gebaseerd is op de antwoorden uit een vragenlijst die de gebruiker zelf beantwoord. De vragenlijst heeft controle over het percentage van aanwezige biomes, de planeet geografie (bergen en oceanen) en welke biomes er aanwezig zijn in de texuremap of niet

Gif 1: Gegenereerde planeet
Plaatje 1, voorbeeld banner van een gegenereerde planeet

Inhoud

  1. Introductie
  2. Project voorwaarden
  3. Onderzoeksmethode
  4. Mesh generatie
    1. Vooronderzoek
    2. Sfeer mesh
    3. heightmap generatie
  5. Texture maps
    1. Texturemap generatie
    2. Texture veranderingen gebaseerd op heightmap
    3. Alternatieve textures
  6. Questionnaire
    1. Questionnaire onderzoek
    2. Questionnaire systeem
  7. Extra’s
  8. Resultaat
  9. Bronnen

Introductie en Inspiratie

Dit project genereert een low poly planneet uit een vragenlijst die de gebruiker zelf invult voor het genereren. Deze planeet genereert met een biome kaart die vier verschillende biomes weergeeft, elk van deze biomes hebben een eigen schaal over hoe veel zij voorkomen op die planneet. Elke planeet heeft ook een hoogte kaart die de wereld indeelt in bergen, vlakke stukken land en oceanen.
Elke planeet heeft wel dezelfde cartoonish textures voor de biomes.

De inspiratie voor dit project komt voornamelijk uit een basis concept/visualisatie die ik zelf heb bedacht. Ik heb wel hiervoor vergelijkbare foto’s/voorbeelden gevonden om het eind doel wat beter te visualiseren. Hier volgt wat voorbeelden waarvan sommige onderdelen belangrijk zijn voor dit concept.

Het plaatje van Dubovik is een goed voorbeeld die veel integrale elementen bevat voor dit project. Zoals te zien is heeft deze planeet een low poly look door dat de meeste oppervlakken uit driehoeken (ook hoe wel polygonen genoemd) bestaan. Daarnaast zijn er ook verschillende biomes die kunnen worden geïdentificeerd aan hun kleuren. Als laatste zie je dat de bergen in de achtergrond zijn gemaakt van pieken. Al deze benoemde onderdelen zijn belangrijk voor het concept van dit project.

In het plaatje van Shramek zijn vergelijkbare dingen te zien. Hierin zie je duidelijk de verschillen in de biomes door het gebruik van verschillende kleuren. Je ziet ook hoe het oppervlak van de planneet is gemaakt uit strakke driehoeken (naast de decoratieve objecten). Dit soort onderdelen worden in dit project procedureel gegenereerd. Deze voorbeelden schetsen het basis concept van het idee dat ik zelf heb bedacht

Plaatje 2, (Dubovik, z.d.)
Plaatje 3, (Shramek, z.d.)

Project voorwaarden

Dit project moet aan de volgende punten houden:

  • De gebruiker moet een persoonlijkheidsvragenlijst kunnen invullen voor dat de planeet
  • gegenereerd wordt.
  • De vragenlijst moet minstens drie vragen hebben die de persoonlijkheid kan gokken van een gebruiker, deze vragen moet gebaseerd zijn op onderzoek.
  • De planeet oppervlakte opmaak moet een mix van vier mogelijke biomes gebaseerd op waardes uit de vragenlijst.
  • Oceanen moeten een eigen texture/kleur hebben.
  • Biome textures op bergen moeten een donkerder versie van die biome texture zijn.
  • Random (tussen twee of meerdere randwaardes) gegenereerde geografische opmaak (bergen en oceanen) gebaseerd op waardes uit de vragenlijst. Deze geografie moet er uit zien als pieken en dalen door middel van polygons/vertex te verplaatsen.
  • De planeet moet een low poly look hebben. De planeet moet opgemaakt zijn van zichtbare polygons.
  • De planneet mesh mag geen scheuren hebben.
  • (Extra) Natuur verschijnselen (bomen/rotsen) die veranderen gebaseerd op de biome waar zij op staan
  • (Extra) bloomy cartoon shader om de planeet leuker te laten lijken.

Onderzoeksmethoden

Om alle technologische aspecten die benodigd zijn voor dit project te verkrijgen is er voornamelijk desk research gedaan. Alles waar informatie/code van in verkregen kan terug gevonden worden onder het kopje ‘Bronnen’.

Onze Guildgenoten ‘Pastel bomb autonomy’ hebben elke week elkaars projecten laten zien om elkaar wat tips te geven en of om elkaar te helpen. Deze kleine ‘showrooms’ elke week hebben enorm geholpen door de feedback en technologische hulp die wij elkaar hebben gegeven.


Mesh Generation

Volgens de project voorwaarden moet de planeet een low poly sfeer zijn. Vervolgens moet op deze sfeer de geografie/hoogte verschil worden aangepast aan de hand van een heightmap. Dat beteken dat de planeet ter plekke kan worden gegenereerd of dat er gebruik wordt gemaakt van een al bestaande mesh die vervolgens wordt aangepast. Gezien de tijdslimiet van dit project wordt er gezocht naar een voor gegenereerde planeet waar aanpassingen op kunnen worden gedaan.

Voor onderzoek

In dit project wil ik gebruik maken van een low poly sfeer. Met low poly wordt een mesh gemaakt uit driehoeken bedoel, hiermee zou ik gemakkelijk punten omlaag en omhoog kunnen trekken om zo pieken te kunnen maken voor bergen en dalen kan maken voor oceanen. Als eerste keek ik of de default Unity sfeer een mogelijkheid is maar helaas is deze sfeer te rond/gedetailleerd en gebruikt vier vertices per zichtbaar oppervlak, daardoor ontstaan er vierkanten op het oppervlak van de default Unity sfeer en dit is iets dat niet gewenst is bij dit project. Deze sfeer kan ik dus niet gebruiken voor mijn project.
Ik zocht naar belangrijke informatie voor de basis van het onderzoek over deze sferen door naar vergelijkbare GameLab projecten te kijken. Hierbij heb ik een interessant onderzoek gevonden die mij de volgende informatie voor schotelde.

Ik vond dat de Icosahedron de beste sfeer is volgens de project voorwaarden, visueel gezien ziet het er meest uit naar wat het originele concept verstaat onder ‘low poly’. De icosahedron maakt gebruik van voornamelijk even groten driehoeken, dit geeft het de ‘low poly’ style die beschreven staat in de project voorwaarden. Nu dat ik wat meer begreep over verschillende sfeer structuren kon verder door een sfeer generator te zoeken die het best bij dit project past.

Plaatje 4, (Source: Cajaraville, 2019)

Sphere mesh

Nu dat ik wist wat welk soort sfeer het beste bij dit project past heb ik als eerste geprobeerd of ik een Icosahedron zelf zou kunnen maken in blender. Dit heb ik uiteindelijk niet gedaan omdat ik deze sfeer niet zou kunnen vergroten/meer polygons zou kunnen toevoegen in Unity, het zou altijd hetzelfde aantal . Daarom zocht ik op het internet naar code snippets en of generators die mij zouden kunnen helpen een basis te leggen voor een mesh.

Hierbij zocht ik een mesh generator en of stukken code die een sfeer zou maken van alleen gelijke groten polygons. Deze polygons moeten vervolgens ook nog allemaal verbonden zijn met hun ‘buren’ om te voorkomen dat er scheuren ontstaan in de sfeer.

Plaatje 5, test sfeer met Binpress code
Plaatje 6, dezelfde testsfeer maar dan met zichtbare triangles en vertices

Als eerste keek ik naar een code documentatie van Binpress. Deze code snippets leken goed te werken maar het bleek toch wat cruciale problemen te veroorzaken. Volgens deze code zou de sfeer uit aparte onderdelen bestaan, dit beteken dat deze onderdelen niet met elkaar verbonden staan. Zodra ik hier vertex displacement op uitoefen zou deze sfeer helemaal zichzelf uit elkaar trekken.
Daarnaast was deze tutorial erg langdradig en overbodig gecompliceerd, aangezien ik hier ongeveer een week aan wou besteden wou ik mijn tijd steken in iets waar ik wat meer van zou kunnen leren. (Creating an Octahedron Sphere in Unity, 2018).

Hierna bleef ik doorzoeken ik tot dat ik een tutorial had gevonden van Peter Winslow (2021). Dit leek ontzettend goed maar uit maar uiteindelijk was deze mesh generation niet helemaal wat ik nodig had.

Deze mesh generation zou te veel vertices creëren die op elkaar ‘gelaagd’ waren. In deze asset voorbeeld kan je zien dat stukken land uit de planeet worden ‘getrokken’ waardoor er een rechte hoek ontstaat met de stukken land en het water. Dit is helaas niet iets dat ik kan gebruiken aangezien de mesh generation die beschreven staat in de project voorwaarden verteld dat de mesh uit pieken en dalen moet bestaan. Hiermee wordt bedoeld dat de bergketens en oceanen moeten worden gegenereerd aan de hand van het verplaatsen van vertices, dit zou dus niet kunnen met deze asset doordat het gelaagde vertices heeft.

Plaatje 8, (Source: Alexisgae, 2018)
Plaatje 7, (Source: Peter Winslow, 2021)

Als laatste heb ik een project gevonden van Alexisgae op GitHub (2018). Deze generator is precies het gene wat ik nodig heb voor dit project. Hiermee kan ik de grootte van de sfeer en de polygon dichtheid aanpassen naar wil.

Ik heb voor de opstelling die hiernaast te zien is gekozen omdat ik hiermee toch een grote planeet heb maar toch zit er wat afstand tussen de vertices. Nu dat er een sterke basis is voor het project kan ik hierop aanpassingen toepassen zoals textureblendmaps en heightmaps. Dit gaat gebeuren door middel van PCG tactieken.

Heightmap generation

Plaatje 9, concept schets doorsnede van een planeet deel

Voor de noisemap generation wou ik een map maken die de planeet zou verdelen in drie verschillende hoogtes; berg ketens, oceanen en vlakke landstukken.
Hiernaast staat een schets van hoe een doorsnede van een stuk land er uit zou moeten zien na de vertex manipulation.

Hiervoor heb ik dus vertex manipulation nodig en een heightmap generation, het eerste ben ik van plan te doen via een shader en het tweede ben ik van plan te doen met een script zodat ik de gegenereerde noisemap kan opslaan.

Voor de heightmap heb ik de volgende code gemaakt, ik maak hierbij gebruik van een standaard Perlin noise functie om een 2D array van floats waardes te geven. Vervolgens worden deze waardes gecheckt en een kleur gegeven.
Wit voor bergen, grijs voor vlak land en zwart voor oceanen.

Plaatje 10, code die heightmap genereert
Plaatje 11, een gegenereerde heightmap

Hierbij heb ik een aantal variabelen die de minimum en maximum van de oceanen en bergen bepalen, deze zou ik gemakkelijk later kunnen aanpassen aan de hand van een seed.

Plaatje 12, variabelen die de uitkomst van een planeet bepalen

Om de noisemap te kunnen zien en gebruiken moest ik deze opslaan in het project. Dit heb ik gelukkig terug kunnen vinden in de Unity Documentation (z.d.). aan de hand van de volgende code wordt de noisemap opgeslagen en verstuurd naar de planeet material.

Plaatje 13, code voor het opslaan van de heightmap

Hierna moest ik deze noisemap op een shader toepassen, dit vond ik aardig lastig en duurde best lang om goed voor elkaar te krijgen. Ik was voornamelijk aan het zoeken naar voorbeelden/uitleg over hoe ik zoiets zou kunnen bereiken. Uit eindelijk heb ik wat goeie recommandaties gekregen van mijn Guild leden die mij leiden tot Flick (2016)’s meerdelige tutorials over shaders en een shader verslag van een oud student. De Flick tutorials leggen enorm veel uit over hoe shaders werken en wat je er allemaal mee kan doen in twintig verschillende blogposts. Ik heb niet alles hiervan natuurlijk kunnen gebruiken, ik heb de ‘Bumpiness’ tutorial helemaal doorgelezen zodat ik meer begrijp hoe ik hoogtes kan instellen in mijn projecten.
Vervolgens heb ik ook het verslag over vertex manipulation van een klasgenoot gelezen voor een net wat meer begrijpelijk niveau en omdat het ‘up to date’ code heeft aangezien de tutorials iets wat verouderd zijn.

Hieronder staat de culminatie van beide deze sources voor de vertex manipulation.

Plaatje 14, vertex displacement code in de planeet shader
Plaatje 15, een planeet met vertex displacement die gebaseerd is op de heightmap.

Deze shader plus de noise map genereert het volgende resultaat elke keer wanneer het project wordt opgestart.

Als laatste heb ik er ook voor gezorgd dat de bovenste en onderste lijn aan pixels altijd grijs zijn, dit zorgt er voor dat die vertices altijd op hetzelfde level zitten waardoor zij niet los van elkaar komen. Als zij los van elkaar komen te staan ontstaan er scheuren in de mesh.

Plaatje 16, code snippet in map generatie code om mesh scheuren te voorkomen.

Texture maps

Hier wordt het maken en toepassen van de verschillende texture maps gemaakt. Er wordt beschreven hoe deze maps worden gemaakt en hoe de juiste textures over de juiste kleuren worden getekend.

Texturemap generation

Voor de textureblendmap gebruik ik hetzelfde concept als de heightmap maar hier komen er meerdere Perlin noise maps over elkaar te liggen, dit is gedaan om een soort random biome effect te genereren.

Plaatje 17, base texture wordt hier gezet

Als eerste moet de planeet bedekt worden met één enkele biome, anders zou er één of meerdere legen gaten ontstaan op de planeet. Daarna wordt daar weer andere biome lagen overheen gelegd.

Vervolgens gebruik ik een forloop om er voor te zorgen dat er x aantal extra noisemaps over de groene texture map worden gelegd aan de hand van deze code.

Plaatje 18, texturemap generatie
Plaatje 19, een gegenereerde Texturemap
Plaatje 20, een gegenereerde texturemap met een hoge dichtheid aan sneeuw
Plaatje 21, een versimpelde gegenereerde texturemap

Terwijl deze noisemap er mooi uit ziet kan ik deze niet goed gebruiken als mask texture in een shader. Dit systeem is aardig problematisch. Wanneer de noisemap wordt gegenereerd dan wordt de laatste kleur altijd de meest dominanten kleur, terwijl het zo kan zijn dat die kleur de minst gewilde biome kan zijn. Daarom heb ik dit systeem veranderen naar een prioriteit systeem. Aan de hand van de vragen lijst wordt er een prioriteit lijst geordend op de meest gewilde biome onderaan en de minst gewilde biome als eerste.

Plaatje 22, code die het biome prioriteit hanteert tijdens het genereren van de texturemaps
Plaatje 23, een gegenereerde planeet met verschillende biomes

Texture verandering gebaseerd op de heightmap

Vervolgens moet de oceanen en bergen in de planeet worden verwerkt aan de hand van de heightmap, hiervoor moet volgens de project voorwaarden de laag liggende gedeeltes vervangen worden met een zand texture en de hoog gelegen gedeeltes moeten een donkerder versie van de originele texture zijn.

Plaatje 24, code die de oceanen delen onderscheid en vervangt met een zand texture

Door het volgende toe te passen op de planeet shader wordt alleen de laag liggende pixels uit de heightmap gefilterd en in een nieuwe mask texture gestopt. Op deze nieuwe mask texture wordt alleen op de gefilterde pixels een zand texture getekend.

Plaatje 25, maskers van elkaar verwijderen zodat textures niet op elkaar worden getekend

Vervolgens wordt de nieuwe mask texture van de main texture afgehaald zodat de shader geen textures over elkaar heen tekent. Uiteindelijk heeft dat het volgende resultaat.

Plaatje 26, progressie van de planeet generatie tot nu toe

Daarna wordt er iets vergelijkbaars gedaan met de heightmap voor de bergen, maar in plaats van een nieuwe texture toe te passen maken wij gebruik van de kleur waardes om de kleuren van de biome textures aan te passen. Zoals er in de project voorwaarden staan moeten de bergen een iets wat donkerder tint hebben. Dit kan makkelijk worden gedaan door gebruik te maken van de heigthmap.

Door eerst de heightmap te inverteren zorgen wij er voor dat alle bergen een zwarte pixel krijgen en alle oceanen witten pixels, de vlakken stukken land blijven grijs. Vervolgens scheiden wij de kleuren zodat er alleen nog maar zwart en wit over blijft.

Plaatje 27, standaard planeet met zichtbare heightmap
Plaatje 28, planeet waar de bergen zijn uit gefilterd
Plaatje 29, geïnverteerd planeet van plaatje 28.

Daarna wordt de heightmap opnieuw geïnverteerd zodat de bergen worden uitgelicht met een witte kleur. Deze kleurwaardes worden vervolgens gebruikt om de biome texture wat donkerder te maken door een deel van deze kleurwaardes van de biome op diezelfde positie af te trekken.

Plaatje 30, code die de visuele effecten van plaatjes 27 tot 29 creëren.
Plaatje 31, code die het donkere effect toepast op de bergen

Uiteindelijk verkleuren de bergen met een net iets donkerder kleur dan de basis biome texture die daar op zit aan de hand van de heightmap. Dat ziet er zo uit.

Plaatje 32, voortgang van planeet generatie

Alternatieve textures

Volgens het advies van de docenten ben ik gaan kijken of er de textures kunnen worden vervangen met iets beters. De huidige textures zien er nu wat doffig en blokkerig uit door de lage kwaliteit. Daarom ben ik gaan experimenteren door de textures te vervangen met kleuren, het doel hiervan was om de planneet een meer cartoonish feel te geven door basic kleuren toe te voegen in plaats van textures.

Plaatje 33, de lijst met verschillende texture ‘sets’

Door dit simpele systeem kan de planeet worden gegenereerd met de eerste vier textures of de laatste vier standaard kleur textures.

Het gevolg hiervan is te zien in het plaatje hiernaast, deze planeet is aardig vel maar heeft zijn eigen.
Gezien de tijdslimiet van dit project blijft dit concept voor hoe het nu is en is het mogelijk voor de gebruiker om zelf de textures aan en uit te zetten. Dit zou een interessant vervolg onderzoek zijn voor als ik meer wil weten over het maken/ontwerpen van textures.

Plaatje 34, een gegenereerde planeet met de simple texture set

Questionnaire

Zoals er in de project voorwaarden beschreven staat moet dit project een soort questionnaire hebben om de gegenereerde planneet meer te personaliseren. Aan de hand van deze persoonlijkheidsvragenlijst zal er een set aan waardes aangepast worden waaruit een planeet gegenereerd wordt. Om deze questionnaire te maken wordt er onderzoek gedaan naar basis van persoonlijkheidstests en persoonlijkheidskarakteristieken. Hiermee wordt de basis van de vragenlijst ingevuld en hoop ik een rechtvaardige resultaten te verkrijgen om te gebruiken in de planeer generatie.

Questionnaire onderzoek

Volgens een onderzoek van Owens (2019) moet een test/vragenlijst als eerste zijn ‘constructs’ identificeren, constructs wordt het volgende mee bedoeld: ’constructs—specific characteristics or phenomena that we can define and measure’ (Source: Owens (2019)).

Daarnaast zijn de volgende dingen belangrijk bij een test maken, tests moeten betrouwbaar zijn. Wanneer iemand de test meerdere keren neemt over een lange periode dan mag de resultaten van deze tests niet enorm afwijken van elkaar. Vervolgens moet een test ook accuraat of geldig zijn. Voor dit project geld dat minder zo aangezien de planeet die wordt gegenereerd persoonlijk moet aanvoelen, het hoeft niet een één op één representatie van een persoon te weergeven
(daar zou je beter een cirkel of staaf diagram voor kunnen gebruiken).

Volgens de Myers & Briggs personality theorie (Author, 2020) zijn er vier ‘constructs’. Deze constructs werken als assen, een persoon kan meer of minder in lijn zijn met één van de uiterste eindes van de as. De vier assen gaan als volgt:

  • Extraversion vs. Introversion: Hoe verkrijg je energie? Extroverts vinden het leuk om onder andere te zijn en krijgen daar een boost van. Introverts verkrijgen energie van alleen zijn en hebben ‘alone-time’ nodig om te kunnen reflecteren door de dag heen.
  • Sensing vs. Intuition: Hoe verzamel jij informatie? Sensing is wanneer iemand informatie verzameld door te kijken naar de omgeving zoals patronen, zij hangen af aan hun zintuigen. Intuïtie kijkt meer naar de context en neemt dat in zich op. Zij kijken naar wat die context betekend en of er verbanden kunnen gelegd worden.
  • Thinking vs. Feeling: Hoe maak jij keuzes? Denkers pakken de meest logische optie om zo een correct resultaat te verkrijgen. Andere mensen vragen hun emoties wat de beste keuze is. Daarbij denken zij ook aan de wil en nood van anderen.
  • Judging vs. Perceiving: Hoe organiseer jij je omgeving? Oordeelaars prefereren structuur en wanneer dingen gereguleerd worden. Waarnemers vinden het leuk als dingen flexibel zijn en geen vaste verplichtingen hebben.

Maar er zijn nog meer mensen die onderzoek hebben gedaan naar de menselijke persoonlijkheid. In een artikel over een korte geschiedenis over persoonlijkheidstesten (A Brief History of Personality Tests, 2021) worden er twee andere vormen van persoonlijkheidstest theorieën vernoemd, de ‘Five-Factor Model’ en de ‘Strengthsfinder’. De Strengthsfinder is voornamelijk gefocust op het in kaart brengen van iemand zijn skillset. Deze vorm van testen is meer bedoeld in een bedrijfssituatie, daarom past deze theorie niet bij dit project en gebruiken wij het niet. De Five-Factor model aan de andere hand wordt gebruikt door academici als ‘de gouden standaard’. Deze theorie lijkt ook meer op de Myers & Briggs theorie.

Volgens de Wikipedia contributors (2022) kijkt de Five-Factor model naar de volgende punten:

  • ‘openness to experience’: inventief/nieuwsgierig vs. consistent/voorzichtig
  • ‘conscientiousness’: efficiënt/georganiseerd vs. Extravagant/onzorgvuldig
  • ‘extraversion’: uitgaand/energiek vs. kluizenaar/terughoudend
  • ‘agreeableness’: vriendelijk/medelijdend vs. kritisch/rationeel
  • ‘neuroticism’: gevoelig/nerveus vs. Veerkrachtig/zelfverzekerd

Beide Myers & Briggs en de Five-Factor model delen sommige concepten zoals extrovert vs introvert en hoe mensen informatie organiseren (Sensing vs. Intuition en conscientiousness). Omdat deze concepten zo universeel zijn dat zij in meerdere theorieën over de menselijke personaliteit voorkomen gebruiken wij die in de personaliteit test van dit project.


Hier onder staat een lijst van vragen die in de vragenlijst komen te staan.

Voorbeeld Naam:
               Descriptie vraag?

               Antwoord1 – gevolg
               Antwoord 2 – gevolg

Redenatie vraag + link aan onderzoek

Sociaal/Alleen:
               Welke van de volgende opties vind jij het leukste om te doen?

               Samen met een grote groep vrienden op stap gaan. – Meer drukke bergen.
               Zelf een film kijken. – Minder drukke bergen.

Deze vraag stelt de gebruiker als extrovert of introvert. Hierbij krijgen extroverten personen een ‘drukkere’ planneer door een grotere dichtheid aan bergketens en minder stukken water. Dit wordt gedaan zodat de planeet meer met hun energieke aard in lijn te staan. Het omgekeerde geld voor een meer introvert antwoord.

Nervositeit:
               Hoe vaak ben jij nerveus?

               Aardig snel – Meer grasland.
               Niet altijd – Iets meer grasland.
               Heel soms – Niks
               Niet, ik ben vaak zelfverzekerd – Minder grasland. //Dit zorgt er voor dat andere biomes
               makkelijker de grasland biome kunnen ‘overnemen’.

Deze vraag ontdekt hoe wel of niet nerveus de gebruiker is. Hiermee wordt hun level van ‘neuroticisme’ bepaald. Mensen met een hoog neuroticisme zijn vaak gevoeliger en nerveuser, daarom moet de planeet niet al te sterke mix van verschillende biomes hebben. Daarom wordt de main biome sterker gemaakt.

Nieuwe ervaringen:
               Hoe vaak ondervind jij nieuwe een nieuwe ervaring?

               één keer in het jaar – Veel hogere dichtheid aan biomes.
               één keer in de maand – Hogere dichtheid aan biomes.
               één keer in de week – Iets hogere dichtheid aan biomes.
               Bijna nooit – Geen effect.

Met deze vraag wordt gekeken naar hoe nieuwsgierig of consistent de gebruiker is. Bij een hoger level aan ‘openness to experience’ gaat de planeet meer verschillende biomes dichter bij elkaar genereren. Dit zorgt er voor dat deze planeten meer kans hebben om alle biomes te verkrijgen.

Rationaliteit:
               Hoe decoreer jij je kamer?

               Uitgeplant en opgeschreven – Meer sneeuw biome
               Inrichten met wat ik leuk vind – Meer woestijn biome

Bij deze vraag onderscheiden wij de ‘Thinkers’ en de ‘Feelers’ zoals die beschreven staan in de Myers & Briggs test. De denkers bedenken de meest logische opstelling/antwoord, zij doen alles recht toe en rechts aan met vrijwel weinig tot geen emotie. Daarom wordt bij hun de sneeuw biome dominanter dan de andere biomes. Het tegenover gestelde telt voor de mensen die uit gaan op gevoelens en volgen hun hart. Bij hun wordt de warmere biomes (de woestijn dus) meer dominanter.

Flexibel vs gestructureerde activiteiten:
               Welke van de volgende activiteiten vind jij het leukst om te doen?

               Voetballen – De schaal waarop bergen en oceanen voorkomen worden dichter bij elkaar
               getrokken.
               Basketballen – Hetzelfde als ‘Voetballen’.
               Een andere vergelijkbare sport – Hetzelfde als ‘Voetballen’.
               Tekenen – De schaal waarop bergen en oceanen voorkomen worden verder van elkaar   gedreven.
               Wandelen – Hetzelfde als ‘Tekenen’.
               Een andere vergelijkbare activiteit – Hetzelfde als ‘Tekenen’.

Deze vraag geeft de gebruiker de mogelijkheid om te kiezen tussen gestructureerde of wat meer flexibele activiteiten. Bij sport activiteiten heb je vaak gestructureerde regels waar je aan kunt houden. De andere beschreven activiteiten zijn flexibeler en daarbij kan iemand zelf bepalen hoe zij dat willen doen.


Questionnaire systeem

Voor de questionnaire die ik nodig ga hebben moet ik een systeem opzetten die kopjes, beschrijvingen en antwoorden die waardes aanpassen maken. Om deze wensen te krijgen in Unity moet ik mijn eigen systeem ontwerpen. Dit systeem bestaat uit een lijst van vragen die meerdere soorten tekst bevat en een lijst van antwoorden bevat. Hiermee kan ik gemakkelijk vragen maken en door de vragenlijst sturen.

Als eerste moeten er natuurlijk vragen in een vragenlijst. Aan de hand van een public class kan ik vraag objecten maken waarbij elke vraag de benodigde informatie heeft.
Terwijl dit voor de titel en beschrijving goed werkte moest ik iets anders.

verzinnen voor de antwoorden, als ik zelf wou opschrijven wat de antwoord beschrijving zou zijn dan moest ik hier ook een publieke klasse van maken. later wou ik ook de integratie met de planeet waardes toevoegen, hiervoor heb ik meerdere ‘waarde types’ gemaakt en een waarde. Het type waarde kon berg, oceaan, grasland, sneeuw en nog meer zijn. Dit type zou bepalen welke waarde van de planeet generate zou aangepast worden met ‘value’.

Plaatje 35, de verschillende onderdelen waar één vraag uit bestaat
Plaatje 36, een geupdate en meer uitgebreide vraag
Plaatje 37, dit is hoe een vraag in de vragenlijst er uit ziet in de Unity editor

Met dit systeem kon ik het volgende zelf invullen. Ik kan oneindig vragen maken met oneindig antwoorden die allemaal een specifieke waarde zouden aanpassen.

Terwijl het invoeren van de tekst makkelijk is zijn de knoppen wat moeilijker. Aangezien ik oneindig knoppen zou kunnen maken voor één vraag en voor de volgende vraag maar twee antwoorden kan geven moet dit systeem dus dynamisch zijn.

Plaatje 38, code die een dynamisch aantal antwoorden met elke vraag kan inladen

Hierbij heb ik een basic button prefab gemaakt. Deze prefab wordt X aantal keer gecreëerd gebaseerd op hoeveel antwoorden er nodig zijn, vervolgens wordt de tekst verandert en de ‘OnClick()’ event van de button.

Alle buttons verwijzen altijd naar deze functie maar gebaseerd op wat het antwoord is verandert er een andere waarde.

Plaatje 39, dit is hoe de waardes worden aangepast na dat een antwoord is geselecteerd

Door tijdens het maken van de knop zijn de referentie van zijn eigen antwoord mee te geven naar het ‘OnClick()’ event van zijn eigen knop wordt de aanhangende waardes aangepast. Dit betekent dat elk antwoord die wordt aangemaakt een altijd een waarde kan aanpassen via hetzelfde systeem.

Vervolgens worden de waardes doorgevoerd aan de planeet generation script en wordt terplekken de planeet gegenereerd.

Extra’s

Plaatje 40, een planeet met een ‘oceaan’

Als laatste om de planeet wat mooier/realistischer te maken is er een object net wat onder de planeet toe gevoegd met een half doorzichtig ‘water’ materiaal om een soort oceaan te simuleren zodat de planeet er wat beter uit ziet.

Vervolgens heb ik ook de resolutie van de texturemap en heightmap verhoogt voor een meer gedetailleerde opmaak van de planneet. Dit was voor het testen op een lage resolutie gezet zodat het programma makkelijker meerdere planeten achter elkaar zou kunnen creëren.

Daarna is er ook een gratis skybox asset gebruikt om de achtergrond wat lichter aan te laten voelen. Dit is voornamelijk gedaan omdat de standaard Unity skybox niet mooi ging met de planeet (Skybox Series Free | 2D Sky, 2017).

Ook moeten de gebruikers alle hoeken van de planeet kunnen zien, daarom en omdat het natuurlijk een planeet is moet deze wel kunnen roteren. Hiervoor is er een kort rotatie script gemaakt die er zo uit ziet.

Ik heb ook een houder gemaakt die de planeet bij de polen ‘vast’ houdt. Dit is gedaan omdat het bij het thema van ‘planeten’ past, het lijkt nu meer op een wereld bol.

Als echt aller laatste heb ik een custom edit modus gemaakt waarmee de gebruiker zelf met alle waardes kan rondspelen. Dit wou ik toevoegen omdat ik het zelf enorm leuk vond om met alle waardes rond te spelen en kijken wat er uit kwam. Ik vond het zo leuk dat ik de gebruiker ook de mogelijkheid wil geven om dit te kunnen doen.

Plaatje 43, code die dynamisch alle sliders inlaad

Deze custom edit mode is op een vergelijkbare manier opgezet zoals de knoppen in de questionnaire. De sliders worden in start ingeladen en ingevuld met waardes uit een voorgemaakte lijst voor alle onderdelen die mogen worden aangepast.

Plaatje 44, dit is hoe nieuwe sliders worden toegevoegd in de Unity Editor
Plaatje 45, hetzelfde als plaatje 44
Plaatje 46, een voorbeeld over hoe iemand het custom edit menu kan bereiken
Plaatje 47, het custom edit menu

Hiervoor moest er een paar aanpassingen worden gedaan in het start scherm waaronder een knop om naar het custom menu heen te gaan. En een knop in het custom menu om terug te gaan naar de vragenlijst. Zoals te zien is staat er ook een ‘GO’ knop. Deze knop update alle ingevoerde waardes en start de planeet generatie proces.

Plaatje 48, dit is hoe de waardes uit de custom edit menu worden toegepast
Gif 2, een custom gegenereerde planeet in ‘actie’

Ik ben helaas niet toe gekomen aan de cartoon shader of de decoratieve objecten gebaseerd op de biome. De cartoon shader was voornamelijk bedoeld als extra om de planeet er mooier uit te laten zien, ik heb er voor gekozen om deze shader niet te implementeren en te maken omdat het huidige eindresultaat er goed uit ziet.
Het toevoegen van de decoratieve objecten gebaseerd op de biome waar zij op staan is uiteindelijk niet mogelijk in dit project. Door voornamelijk de tijdslimiet van het project en op de manier waarop de biomes worden gegenereerd kunnen er geen decoratieve objecten worden toe gevoegd op de planeet.


Resultaat

Dit is een mogelijke planeet die de generator kan maken.

Gif 3, een voorbeeld resultaat van een gegenereerde planeet

Hier volgen een paar vragen uit de vragenlijst:

Plaatje 49, een voorbeeld vraag uit de vragenlijst
Plaatje 50, hetzelfde als plaatje 49

Ik raad enorm aan om het project zelf te proberen. U kunt hier het project zelf ophalen voor Windows, Mac en Linux:
https://github.com/Omega-The-III/Procedural-Cute-Planet-Generator/releases/tag/v1.0.0


Bronnen

Cajaraville, O. S. (2019, 19 mei). Four Ways to Create a Mesh for a Sphere – Oscar Sebio Cajaraville. Medium. Geraadpleegd op 10 maart 2022, van https://medium.com/@oscarsc/four-ways-to-create-a-mesh-for-a-sphere-d7956b825db4

Creating an Octahedron Sphere in Unity. (2018, 20 september). binPress. Geraadpleegd op 17 maart 2022, van https://www.binpress.com/creating-octahedron-sphere-unity/

Winslow, P. (2021, 26 januari). Creating Procedural Planets in Unity — Part 1 – Peter
Winslow
. Medium. Geraadpleegd op 16 maart 2022, van https://peter-winslow.medium.com/creating-procedural-planets-in-unity-part-1-df83ecb12e91

A. (2018, 22 oktober). GitHub – alexisgea/sphere_generator: Create Icosahedron Sphere and UV Sphere in one click in Unity. GitHub. Geraadpleegd op 19 maart 2022, van https://github.com/alexisgea/sphere_generator

Flick, J. (2016, 31 juli). Rendering 6. Catlikecoding. Geraadpleegd op 23 maart 2022, van https://catlikecoding.com/unity/tutorials/rendering/part-6/

Technologies, U. (z.d.). Unity – Scripting API: Windows.File.WriteAllBytes. UnityDocumentation. Geraadpleegd op 23 maart 2022, van https://docs.unity3d.com/ScriptReference/Windows.File.WriteAllBytes.html

A Brief History of Personality Tests. (2021, 14 juli). Harvard Business Review. Geraadpleegd op 3 april 2022, van https://hbr.org/2017/03/a-brief-history-of-personality-tests

Owens, M. (2019, 16 december). How A Personality Test is Made. Truity. Geraadpleegd op 3 april 2022, van https://www.truity.com/blog/how-personality-test-made

Author, A. T. (2020, 1 juli). Myers & Briggs’ Personality Typing, Explained. Truity. Geraadpleegd op 3 april 2022, van https://www.truity.com/myers-briggs/about-myers-briggs-personality-typing

Wikipedia contributors. (2022, 27 maart). Big Five personality traits. Wikipedia. Geraadpleegd op 6 april 2022, van https://en.wikipedia.org/wiki/Big_Five_personality_traits

Skybox Series Free | 2D Sky. (2017, 1 december). Unity Asset Store. Geraadpleegd op 7 april 2022, van https://assetstore.unity.com/packages/2d/textures-materials/sky/skybox-series-free-103633

Dubovik, A. (z.d.). Low poly planet | Low poly art, Low poly, Low poly games. Pinterest. Geraadpleegd op 9 april 2022, van https://nl.pinterest.com/pin/464081936581196391/

Shramek, N. (z.d.). Low Poly Planet Template – 3D design by Vectary templates Jun 19, 2019 | Cute art, Game art, 3d design. Pinterest. Geraadpleegd op 9 april 2022, van https://nl.pinterest.com/pin/830562356270519575/

Related Posts