MarbleRun

Ein analog-digital Kugelbahn Converter und Simulator.

Trailer

Konzept

Idee

Die grundsätzliche Idee war es die reale Welt des Zeichens mit einer digitalen physikalischen Simulation zu verbinden.

Der/die Benutzer/in zeichnet auf ein Blatt Papier oder einem Whiteboard mit vorher festgelegten Farben eine Murmelbahn, eine Webcam nimmt ein Bild von dieser Bahn auf, interpretiert die gezeichneten Formen und konstruiert eine digitale Version davon. Anschließend werden auf dem Monitor Murmeln generiert, die der Murmelbahn physikalisch korrekt folgen.

Farben

Blau – Die Farbe Blau wird als sogenannter Spawnpunkt, also Geburtsort für Murmeln, interpretiert. Jeder Spawnpunkt generiert im gleichen Moment eine neue Murmel. Die vorgebende Spawnrate kann von dem/der Benutzer/in variiert werden. Die Größe der Murmeln ist abhängig von der Größe des Spawnpunkts.

Grün – Plattformen mit einem Grünton werden als Trampolin interpretiert. Aufprallende Murmeln verlieren keine Geschwindigkeit und ändern lediglich ihre Richtung nach den Gesetzen der Reflexion.

Rot – Die Geschwindigkeit einer Murmel die sich auf einem roten Objekt befinden wird stätig um einen Faktor von 3 erhöht.

Lila – Die Teleportfähigkeit eines lila Objekts wird erst aktiviert, wenn mindestens zwei lila Objekte erkannt werden.
Eintretende Murmeln werden zu einem anderen, zufällig ausgewählten, lila Portal teleportiert und nach einem Cooldown von 30 Frames, kann das Austritts-Portal wiederverwendet werden. Diese Einschränkung ist notwendig um das sofortige zurück-teleportieren zu verhindern.

Programming

Als IDE und Programmiersprache wurde Processing verwendet (https://processing.org/), für die Bilderkennung und Bildverarbeitung die Library „OpenCV“ von Greg Borenstein (https://github.com/atduskgreg/opencv-processing) und für die Physik Simulation der Murmeln und der Plattformen wurde die Library „Box2D for Processing“ von Daniel Shiffman verwendet (https://github.com/shiffman/Box2D-for-Processing).

OpenCV

OpenCV bietet viele Möglichkeiten um Bildmaterial einer Webcam zu Verarbeiten. Für Marble Run wurden folgende Schritte benötigt:

Ein Frame vom Videomaterial wird hergenommen und in Graustufen umgewandelt. Anschließend wird ein Schwellenwert genommen, die der/die Benutzer/in nach Belieben anpassen kann. Das entstandene Schwarz-Weiß Bild wird nun mit Hilfe der .findContours() Funktion analysiert und alle gefundenen Konturen werden in eine Liste gespeichert. Diese Konturen werden noch approximiert und gegebenenfalls aussortiert.

Schlussendlich werden diese Konturen, bzw. die Punkte die diese ausmachen, an Box2D übergeben, um physikalische Objekte zu generieren.

Box2D

Mit Box2D kann man diverse Objekte generieren, die alle miteinander auf physikalische Ereignisse, wie Schwerkraft und Kollisionen, reagieren. Diese Objekte verfügen selbst über keine sichtbare Präsenz, können aber leicht mit Processing nachgezeichnet werden.

In Marble Run haben alle Murmeln einen dynamischen Körper und reagieren auf alle anderen Körper, egal ob Plattform oder andere Murmel.

Zu Beginn des Programms muss eine Box2D World kreiert werden und jedes Festkörper benötigt Informationen wie er sich benehmen soll. Einige dieser Parameter sind z.B. Reibung, Dichte und Abprallstärke.

Arduino

Für dieses Projekt dient das Arduino ausschließlich als dezidierte Steuereinheit. Für die Kernfunktionen wird es nicht benötigt, allerdings bieten die Potentiometer genauere und intuitivere Einstellungsmöglichkeiten.

Bauteile

Für MarbleRun wurden folgende Bauteile verwendet:

1x Arduino Uno
1x Steckplatine mit 400 Kontakten
2x Drucktaster 12mm
2x 10kΩ Widerstand
2x Trimpotentiometer
1x Grüne LED
Diverse Kabel

Schaltplan

Schaltplan Zeichnung wurde mit Fritzing angefertigt.
(http://fritzing.org/home/)

Firmata

Auf dem Arduino selber läuft die Firmata Library. Diese erlaubt es direkt in Processing ein Objekt vom Typ Arduino zu erzeugen und die verschiedenen Funktionen wie analogRead() oder digitalWrite() direkt in Processing aufzurufen.