Eprobots JS Matter

Ich bin auf matter.js gestoßen und bin davon begeistert, weil es sich auf den Aspekt 2D-Physikengine konzentriert, performant ist und eine einfache API hat. Demzufolge wollte ich umsatteln, bzw. die Engine wenigstens für Eprobots einmal ausprobieren. Das hat gut funktioniert. Hier kann das Ergebnis auf Codepen angesehen werden: https://codepen.io/setreset/pen/pLBmPq

Eine Veränderung gegenüber den vorherigen Versionen ist die Tatsache, dass es wieder getrennte Programm- und Datenspeicher gibt. Dadurch kann der Datenspeicher wesentlich kleiner als der Programmspeicher gehalten werden. Das führt dazu, dass die Wahrscheinlichkeit größer ist, dass die Ausgabezellen durch OISC-Operationen zufällig adressiert werden. Dies gilt sowohl für das Initalisieren der OISC-Programme beim Erzeugen der ersten Eprobots-Generation, als auch für Mutationen während der Fortpflanzung. Subjektiv betrachtet, sind die Eprobots so von anfang an agiler, bzw. fitter.

Matter.js lässt sich auch um Features erweitern, wie zum Beispiel ein auto-wrap. Gemeint ist damit der Fall dass ein Objekt den Rand überschreitet und am gegenüberliegenden Rand wieder auftaucht.

Zusätzlich habe ich auch eine Möglichkeit gefunden mit „Sensors“ Input aus der Umgebung in die Eprobots zurückzuführen. Das kann man sich vorstellen wie eine „Unterlegscheibe“, welche die Kollisionen anders verarbeitet als der Eprobot. Die Kollisionsevents der „Unterlegscheibe“ werden so verarbeitet, dass der Eprobot sie wahrnehmen kann, führen aber zu keiner Gegenreaktion in der Physikengine, im Gegensatz zum eigentlichen Eprobots-Körper. Dies ist für mich aber noch experimentell und verbraucht auch mehr CPU-Leistung, weswegen es in der Demo vorerst noch deaktiviert ist.

Eprobots JS Phaser – Erste Demo

Ich habe es jetzt nach längerer Zeit geschafft, mich erneut mit der Javascript-Gameengine Phaser zu beschäftigen. Die Bibliothek hat sich deutlich weiterentwickelt und mein Ziel war es mein damaliges Beispiel mit der aktuellen Version neu umzusetzen und dann auch eine Fullscreen-Funktion einzubauen und das ganze zu einer „richtigen“ Eprobots-Simulation auszubauen. Dazu musste ich mich mit der neuen Physikengine beschäftigen. In der aktuellen Phaser-Version gibt es verschiedene Physik-Systeme: Arcade Physics, P2 Physics, Ninja Physics usw. Ich habe mich auf P2 Physics konzentriert. Das war die Pflicht. Die Performance der Simulation ist erstaunlich gut, auch mit mehreren hundert Objekten.

Die Kür war dann für mich persönlich also endlich meine OISC-Verhaltenssteuerung in die Agenten dieser Simulation einzubauen. Zuerst dachte ich, dass man Berechnung und Verwendung der Steuerwerte nicht in jedem einzelnen Frame machen sollte/bräuchte, aber die Bewegungen sehen so besser und natürlicher aus und die Performance ist trotzdem noch erstaunlich gut. Im Detail läuft es so ab, das die letzten beiden Speicherstellen zur Steuerung des Winkels und der Geschwindigkeit verwendet werden. Aus diesen beiden Werten wird der Impulsvektor berechnet der zur absoluten Geschwindigkeit addiert wird. Die Werte aus den Speicherzellen werden wieder mit Modulo in einen gültigen Bereich gemappt, um in jedem Fall einen verwendbaren Wert zu erhalten (Geschwindigkeit 0 bis 100, Winkel 0 bis 360). Die absolute Geschwindigkeit begrenze ich auch auf 450 Pixel/Sekunde, da es sich gezeigt hat, dass die Individueen sonst schneller umherrasen, als man es mitverfolgen kann, denn umso schneller ein Individuum ist, umso besser kann es sich fortpflanzen.

In dieser Eprobots-Simulation kann erstmals auch ein Körperparameter mitevolviert werden: Die Größe. Ich habe aber auch hier die Maximalgröße beschränkt, weil es sonst schnell aus dem Ruder läuft (große Individuen können sich besser vermehren). Zusätzlich habe ich eingebaut, dass sich der Maximalimpuls verringert, umso größer das Objekt ist, so dass größere Individuen träger sind.

Grundprinzip von Eprobots

Hier nochmal ein paar Sätze zum Grundprinzip. Genaueres kann der Dokumentation zu den zellenbasierten Eprobots entnommen werden. Es werden zufällige Indivuduen erzeugt und kontinuierlich Nahrung verteilt. Stößt ein Individuum gegen ein Nahrungsobjekt, wird das Nahrungobjekt entfernt und in der Nähe ein neues Individuum erzeugt, was die Eigenschaften des Elternobjektes erbt, aber auch einem Mutationsschritt unterworfen ist. Entstehen zufällig Eprobots die umherwandern, wird sich dieses erfolgreiche Verhalten durchsetzen. Nach einer gewissen Lebenszeit erstarren die Eprobots (rote Objekte oder „Fossilien“) und sind nur noch Hindernisse für die lebenden Eprobots, wodurch eine Art Umwelt entsteht.

Wichtig: Es gibt eine Maximalanzahl an Individuen, damit es nicht zu Performanceproblemen kommt.

 

Zur Demo auf Codepen

Nicht-Spiele mit Unity

Hier eine Galerie von ernsthaften Anwendungen, welche mit der Spiele-Engine Unity umgesetzt wurden. Dabei ist auch Universe Sandbox, was ich schon immer faszinierend fand. Universe Sandbox ist erstmal eine 3D-Weltraum-Simulation. Mit einem intuitiven Interface kann man dann navigieren und Experimente durchführen. Zum Beispiel kann man sich ansehen, was passiert, wenn plötzlich die Sonne verschwindet oder ihre Masse verdoppelt wird.

Galerie der Anwendungen: http://unity3d.com/showcase/gallery/non-games

JS-Demo: ColorWorm

colorworm5

Ich habe das Buch „The Nature of Code“ von Daniel Shiffman entdeckt, was ich absolut empfehlen kann. Aus den Samples und Erkenntnissen ist auch schon eine kleine Demo von mir entstanden. In der Demo folgt ein Kreis dem Mauszeiger. Die Stärke der Anziehung ist immer konstant, bzw. hat keine Abhängigkeit zur Entfernung. Der Kreis ändert fortlaufend seine Farbe und das Canvas wird nicht zurückgesetzt. Dadurch kann man schöne Kurven „zeichnen“. Mit einem Linksklick wird das Zeichnen angehalten oder gestartet.

Demo auf CodePen

BoxCar2D

Super Idee im Grunde. Bei BoxCard2D kann man dabei zusehen, wie durch einen genetischen Algorithmus bekannte und ungewöhnliche Automobil-Konstrukte entstehen bzw. evolvieren. Die Wagen bestehen aus verschiedenen Rädern mit Antrieben die mit einer oder mehreren Formen verbunden sind. Die Verbindungen halten nicht unendlich große Kräfte aus und können auch brechen. Die Physik wird mit dem allseits bekannten Box2DFlash simuliert.

Screenshot:
boxcar2d_screenshot

Evo On Phaser

Es gibt ja mittlerweile einige Spieleengines für JavaScript, unter anderem Phaser. Phaser hat neben der Kollisionserkennung auch eine Physikengine an Board. Damit habe ich eine kleine Demo geschrieben, welche wieder einmal „Tiere“ simuliert, welche sich von zufällig verstreuten „Pflanzen“ ernähren. Die „Tiere“ haben einen Aktivitätsrate und streben mit einer bestimmten Geschwindigkeit in eine zufällige Richtung. Außerdem haben sie einen Lebenszyklus und können sich fortpflanzen. Es gibt bestimmte Startparameter, welche mutiert und an die Nachkommen weitergegeben werden. Die Parameter sind dabei: Größe, Geschwindigkeit, Aktivitätsrate und Rückprallfähigkeit (bounce).

Ich habe die Demo auf CodePen veröffentlicht. Dort kann man direkt mit den Parametern experimentieren.

evo_on_phaser

Tear-able Cloth

Ziemlich interessante Javascript-Demo auf CodePen von suffick, wobei CodePen schon interessant genug ist. In der Physik-Demo wird ein Netz realisitisch simuliert. Es kann bewegt und teilweise zerrissen werden. Macht Spass damit rumzuspielen. Der JS-Code ist 276 Zeilen lang, was ich unglaublich finde.

tearable_clothInteressant ist auch wie die Canvas-basierte Demo in den unterschiedlichen Browsern läuft. Habe aktuelle Versionen von Firefox/Chrome und IE getestet und wie zu erwarten ist Chrome am schnellsten. Mittlerweile geht die Javascript-Geschwindigkeit von Chrome meiner Meinung nach in Richtung nativer Anwendungen mit C++. Firefox ist ok und im IE läuft es zumindest schon mal…