Procedurele spinnenwebben
Proof of concept workflow
Om een idee te krijgen hoe een workflow zou kunnen werken die procedurele 3D vertaald naar 2D textures die kunnen gebruikt worden in een realtime 3D omgeving werkten we een kleine proof of concept uit rond spinnenwebben. We creĆ«erden hiervoor met Houdini eerst een relatief eenvoudig procedureel opgebouwd en configureerbaar spinnenweb. Daarna plaatsten we op een procedurele manier een aantal spinnenwebben in een 3D omgeving. Vervolgens worden de spinnenwebben gesimuleerd met zwaartekracht en dan ‘gebaked’ op 2D planes. Deze textures herwerkten we aan de hand van een Substance Designer graph om tot slot te gebruiken als materialen in een Unity.
Opbouw procedureel spinnenweb
Om het web te creeren starten we met een punt en een richting. Hieruit doen we een raycast loodrecht op de richting naar boven toe.
Vanop deze lijn doen we op een random afstand 2 raycasts loodrecht op de richting naar links en rechts toe. Dit levert de eerste twee aanhechtingspunten van het web op. Vervolgens doen we ook een raycast vanuit het originele punt naar beneden toe om het derde aanhechtingspunt te bekomen. Deze 3 punten komen min of meer overeen met hoe een spin te werk gaat.
Op de zijden van de driehoek tussen de 3 aanhechtingspunten worden een variabel aantal extra aanhechtingspunten gecreeerd. De aanhechtingspunten vormen dan een veelhoek waarbij de hoekpunten ook een variabele afstand naar binnen worden geduwd. Elk hoekpunt van de veelhoek wordt ook verbonden met het overeenkomstige aanhechtingspunt.
Op de zijden van de veelhoek worden nog een in te stellen hoeveelheid extra punten gecreerd. Tussen het originele center punt en al deze punten wordt een lijn getekend.
Tot slot creerd een algoritme vanuit het middenpunt lijnstukken tussen deze lijnen naar het centrum om een spiraal te verkrijgen.


Ruimte opvullen met spinnenwebben
De volgende stap was om op een procedurele manier spinnenwebben te plaatsen op logische plaatsen in eender welke input omgeving. Hiervoor starten we met het genereren van een in te stellen hoeveelheid punten op de oppervlakte van de omgevings mesh. Al deze punten verplaatsen we vervolgens een random afstand naar binnen toe. We doen dan voor elk punt in 6 richtingen een raycast met de omgeving. Hieruit bepalen we waar de dichtsbijzijnde zijdes van de omgeving zijn en kunnen we het punt aan de hand van een aantal random waardes richting de hoeken verplaatsen. uit de afstanden tot de 3 dichtsbijzijnde zijdes leiden we de richting weg van de hoek af. Als we spinnenwebben genereren op de locaties en in de richting van deze punten komen deze dus min of meer op logische plaatsen terecht.

Simuleren van webben
Om de spinnenwebben realistischer te maken simuleren we deze met Vellum. Hiervoor verdelen we al de lijnen op in een hogere hoeveelheid segmenten of punten. Daarna voegen we dicht bij elkaar liggende punten samen zodat alle lijnen van de spinnenweb op de logische plaatsen aan elkaar gehecht is. In de simulatie pinnen we enkel de originele aanhechtingspunten met de muren vast zodat deze niet mee simuleren. We de lijnen of wires ook een kortere restlenght scale, wat wilt zeggen dat het spinnenweb wat zal samentrekken in de simulatie zodat het web wat spanning heeft.

Genereren van textures op basis van gesimuleerde spinnenwebben

Om de gesimuleerde webben op een efficiente manier weer te geven in een game engine kunnen we deze weergeven als textures op een eenvoudig rechthoek mesh of quad. Hiervoor moeten we de geometrie van de gesimuleerde lijnen ‘baken’ op een quad die dezelfde grootte en richting van het web heeft. Omdat we het gehele process zonder iteratief manueel werk willen kunnen doen en de hoeveelheid spinnen webben variabel kan zijn doen we dit in Houdini aan de hand van PDG. Met een wedge node itereren we over elk spinnenweb en baken we een texture. Deze kunnen we voor de gemakkelijkheid laten wegschrijven in een folder in het game project. Naast de textures exporteren we ook een fbx met de quads, waarbij de naam van de quads een nummer bevat die overeenkomt met de nummer van de bijhorende texture.
Processen van textures met substance designer
Omdat de texture die uit de bake komt niet duidelijk leesbaar genoeg is en noise bevat kunnen we deze op een procedurele manier opkuisen en eventueel styleren aan de hand van een substance designer graph. De substance graph neemt een texture als input en dan wordt ondermeer door een threshold node een cleanere zwart-wit output gegenereerd die als opacity map dient zodat uiteindelijk enkel de lijnen van het spinnenweb zichtbaar zijn op de quad.

Koppelen materialen in engine (Unity)
In de engine creerde we een script dat de gebakete textures inleest en voor elke texture een variatie van de substance graph aanmaakt waarbij de texture als input ingesteld wordt. Daarna wordt aan de hand van naamgeving het juiste materiaal toegekend aan de juiste quad in de ingeladen fbx.
