Fast ein Baum im Baum..

Wie versprochen möchte ich immer mal wieder auf interessante Aspekte in Konzeption und Coding der von mir implementierten Features eingehen. Dabei geht es mir nicht so sehr um eine flächendeckende Beschreibung – ich habe nicht vor, die Doku in den Blog zu verlagern ;) – sondern darum, einzelne, aus meiner Sicht schöne oder interessante Stellen zu erläutern. Beginnen möchte ich dabei mit einer Stelle in der Simulation der Umwelt, genauer mit der Auswertungsreihenfolge der Umweltfaktoren.

Die Menge der durch Photosynthese umgewandelte und damit der Pflanze zur Verfügung stehenden Energie hängt von einer Reihe von abiotischen Faktoren ab, die sich gegenseitig beeinflussen (siehe auch Wikipedia). In der realen Welt sind dies Kohlenstoffdioxid, Licht, Wasser und Temperatur. In einer fiktiven Welt können natürlich beliebige Umweltfaktoren wie Magie, Schall oder eine andere Art Licht hinzukommen. Diese Umweltfaktoren beeinflussen sich gegenseitig und beeinflussen die Effektivität der Photosynthese, ein paar Beispiele aus der realen Welt sind: Die Menge an aufnehmbaren Kohlenstoffdioxid kann gedrosselt werden durch die Wassermenge bzw. die Luftfeuchtigkeit, die Temperatur beeinflusst die Photosyntheserate. Wenn man beliebige Kombinationen von beliebig vielen verschiedenen Umweltfaktoren zulassen möchte, stellen sich vor allem zwei Probleme:
1. In welcher Reihenfolge können die Umweltfaktoren ausgewertet werden? Im obigen Beispiel sollte die Wassermenge berechnet werden, bevor die Kohlenstoffdioxidmenge berechnet wird, da dieses Ergebnis von der aufgenommenen Wassermenge abhängt.
2. Wie bildet man alle möglichen Beeinflussungsarten wie “beeinflusst die Photosyntheserate” oder “setzt eine obere Grenze” ab?

Wir beschäftigen uns zunächst (also in diesem Beitrag) mit der ersten Frage. Da theoretisch beliebige Kombinationen von a priori nicht bekannten Umweltfaktoren möglich sein sollen, kann dem Programm keine vorher festgelegte Reihenfolge vorgegeben werden. Wie soll eine solche Reihenfolge also festgelegt werden? Dazu zunächst ein wenig Graphentheorie [1], wirklich nur ein ganz wenig. Ein gerichteter Graph G = (V, E) besteht aus einer Menge von Knoten V und eine Menge von gerichteten Kanten E, wobei jede Kante definiert ist als ein geordnetes Paar von Knoten. Ein solcher gerichteter Graph ist kreisfrei, falls es keinen Weg gibt, der aus einem Knoten heraus und später wieder in ihn hinein führt. Wenn wir unsere Problemstellung nun übersetzen in die neu gelernten Begriffe, so ist jeder Umweltfaktor ein Knoten und immer, wenn ein Umweltfaktor einen anderen Umweltfaktor beeinflusst, zeichnen wir eine Kante vom Knoten des ersten Umweltfaktors zum Knoten des zweiten Umweltfaktors. Wenn in diesem Graph ein Kreis auftritt heißt das, dass sich die Umweltfaktoren ringförmig beeinflussen, also zum Beispiel wäre “Wassermenge beeinflusst Kohlenstoffdioxidmenge beeinflusst Magie beeinflusst Wassermenge” ein Kreis. Diesen Fall wollen wir ausschließen, da man sich in der Berechnung sonst ewig im Kreis drehen könnte. Wir haben nun also einen kreisfreien, gerichteten Graphen vorliegen. Ein solcher Graph ist topologisch sortiert, wenn man eine Reihenfolge der Knoten gefunden hat, in der für jede Kante der Endknoten weiter hinten in der Reihenfolge liegt als der Anfangsknoten. Wenn man eine solche topologische Sortierung der Umweltfaktoren hat und die Umweltfaktoren in dieser Reihenfolge auswertet, dann beeinflusst jeder Umweltfaktor nur Umweltfaktoren, die später ausgewertet werden -> perfekt :)

Ist man erst einmal zu dieser Erkenntnis gelangt, dann ist der Rest kein Hexenwerk mehr – ein Algorithmus zum topologischen Sortieren von Graphen ist schnell gefunden. Man startet mit einer leeren Liste bereits sortierter Knoten und sucht in jeder Iteration im Graphen nach Knoten ohne eingehende Kanten, nimmt diese ans Ende der Liste bereits sortierter Knoten auf und entfernt den Knoten und alle ausgehenden Kanten aus dem Graphen. Am Ende ist der Graph leer und die Knoten sind topologisch sortiert. In der so ermittelten Reihenfolge werden die Umweltfaktoren dann vom Programm ausgewertet. Das obige Beispiel hat als eine mögliche topologische Sortierung Wasser -> Temperatur -> Luftfeuchtigkeit ->Kohlenstoffdioxid -> Licht.

[1] Algorithmische Graphentheorie, Volker Turau, Oldenbourg Verlag, 3. Auflage, 2009

Posted in Code-O-Matic, Theory-O-Matic. Tagged with , , .

Übung, Licht und Schatten

Das viele üben trägt langsam aber sicher Früchte.

Posted in Graphic-O-Matic. Tagged with .

Mein erster Baum :)

Baum mit erster Textur

Baum mit erster Textur

Ich.. brauche mal richtige Texturen.. Aber das gehe ich später an.. Morgen oder so :) Für jetzt bin ich glücklich, weil der generierte Baum mit einer.. *ein Adjektiv such*.. schönen? :P in Paint erstellten Sprite Texture dasteht :) How-To zum Erstellen und Texturieren von Objekten in Blender via Python Skript folgt :)

Posted in Code-O-Matic, Graphic-O-Matic. Tagged with , , , , .

Simulation der Flora

Ok, da die Veröffentlichung des ersten Videos bevorsteht ist es vielleicht an der Zeit, mal etwas zu einem Main Feature der ersten Demonstration zu erzählen: der Simulation der Umwelt. Alle Teile der Umwelt – also sowohl die nicht lebende Umwelt wie das Terrain (ist noch Zukunftsmusik) als auch Flora und Fauna – werden simuliert. Dadurch können sie sich dem Wirken der Spieler anpassen und bieten zu jeder Zeit ein realistisches Bild. In einem ersten großen Schritt haben wir uns mit der Simulation der Flora beschäftigt. Diese Simulation besteht grundlegend aus zwei Schritten:

  1. Simulation des Wachstumspotentials der Pflanze – hier wird berechnet, wie viel Energie die Pflanze zur Verfügung hat (durch Auswertung einer erweiterbaren Liste an Umweltfaktoren wie Licht, Wasser, …) und wie viel Energie davon sie jeweils in Wachstum, Fortpflanzung und Reserve steckt. Auch negative Einflüsse wie zu hohe oder zu niedrige Temperatur werden berücksichtigt und können – wie auch unzureichende Energie, um die Erhaltungskosten abzudecken – auch zum Tod der Pflanze oder zum Absterben von Teilen der Pflanze führen.
  2. Generierung der Morphologie der Pflanze – abhängig von der Pflanzenart, dem bisherigen Wuchs der Pflanze und der verfügbaren Energie wird der Wuchs der Pflanze bestimmt. Diese Information wird sowohl genutzt, um in der Engine dann ein entsprechendes Modell anzuzeigen als auch um in der nächsten Iteration die Aufnahme der Umweltfaktoren zu berechnen.

Da wir noch nicht entschieden haben, was unsere Pflanzen nachher alles können sollen (Magie aufnehmen / ausstrahlen? So groß werden, dass man Städte drauf bauen kann? Wahrscheinlich nicht, aber man will ja vorbereitet sein :P), ist das ganze Programm extrem flexibel gehalten. Momentan möchte ich gar nicht viel mehr dazu sagen, werde aber wohl zu einem späteren Zeitpunkt interessante Stellen ausführlich beschreiben :)

Posted in Code-O-Matic. Tagged with , .

Pflanzen so gut wie wahr..

Soo.. Das erste Feature, das wir euch vorstellen wollen, ist die Simulation der Umwelt, genauer gesagt zunächst die Simulation der Flora. Zwei Punkte sind mir bezüglich der Flora in Computerspielen oft negativ aufgefallen:

  • Die Flora ist statisch. Man kann mit den Pflanzen nicht interagieren und wenn man das kann, dann nur ausgewählt mit einzelnen Pflanzen und nur bestimmte Aktionen. Die Pflanzen wachsen auch nicht, Wälder ändern sich nicht. Wenn man Bäume fällen kann, dann sind es bestimmte Bäume, die dann als “Ressource” auch genau an diesem Spawnpunkt wieder nachwachsen.
  • Viele Ökosysteme, die man in Spielen sieht, sehen sehr steril aus. In einem echten Wald wachsen Bäume in den Kronen zusammen, zu ihren Wurzeln wachsen an Lichtungen Sträucher, ansonsten Kräuter. Bei kleineren Pflanzen wachsen die Pflanzen ineinander, durcheinander.

Gesucht war also eine Flora, die nicht vorher von uns festgelegt wird, sondern.. naja, einfach wächst. Und mit der im Spiel auch interagiert werden kann, die sich im Spiel auch verändert. Und damit verbunden Pflanzenmodells, die auch durcheinander wachsen können und je nach Umwelteinflüssen anders wachsen. Soweit der Plan.. :)

Posted in Inspiration-O-Matic. Tagged with .

In der Sonne stehen und chillen

Wenn auch sonst nichts geht, in der Sonne stehen und nichtstun klappt immer.

Posted in Graphic-O-Matic. Tagged with , , , .

Organische Pigmente

Da wir letztens einen sehr interessanten Vortrag über organische Farbpigmente gehört haben, wollte ich kurz auf natürliche Färbemittel in unserem Umfeld eingehen, was wir adaptieren sollten / könnten für das Umfeld des Charakters in der Spielwelt. Natürliche Färbemittel sind

  • schwarz
    • Holzkohle – einfach zu gewinnen, aber schwache Farbe
    • Ruß – einfach zu gewinnen, starke Farbe (synthetischer Ruß ist immer noch führende schwarze Farbe, auch in der heutigen Industrie)
  • weiß
    • Kalk – häufiges Gesteinsvorkommen
  • gelb
    • gelber Ocker: Erdfarbe, erkennbar daran, dass der Hügel gelb ist ;)
  • rot
    • roter Ocker: siehe gelber Ocker ;)
    • Zinnober: Mineral aus der Mineralklasse der Sulfide, verschiedene Nuancen bis leuchtend rot
    • Cochenille: Farbe aus getrockneten und zerstoßenen Läusen, sehr leuchtendes, teures Rot
  • braun / braunrot
    • gebrannte Umbra: Erdfarbe, kann durch Behandlung Farbe ändern
  • blau / türkis
    • Indigo: blau/türkis Ton, der leicht zu gewinnen ist, aber verblasst
    • Lapis Lazuli: teures Mineralgemisch, das ein leuchtendes Blau ermöglicht
  • diverse Pflanzenfarbstoffe: diverse Farben möglich, aber alle verblassen (schöner Effekt?)
Posted in Inspiration-O-Matic. Tagged with , .