Interactive Space Shooter

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Der "Interactive Space Shooter" entstand als Interaktionsprojekt im Wintersemester 2015/16. Kurz gesagt handelt es sich dabei um eine Gestensteuerung für das Arcade-Spiel "Space Invaders".

ISS Spiel.jpg


Idee

Wir wollten eine Zwei-Spieler-Koop-Gestensteuerung für Space Invaders schaffen. Das heißt, zwei Spieler sollten gleichzeitig für die Steuerung der Kanone zuständig sein und diese durch Neigung nach links/rechts in die entsprechende Richtung bewegen und durch springen schießen. Damit die beiden Spieler allerdings auch wirklich zusammen und nicht gegeneinander spielen, sollte die Steuerung nur greifen, wenn beide gleichzeitig die selbe Aktion ausführen (also sich zB. beide nach links neigen).

ISS HWSW.png

Hardware

Wir benutzten einen Laptop mit integrierter Webcam, so dass es außer diesem keine weiteren Hardware Komponenten gab.

Software

Betriebssstem des Laptops: Windows 10 (mit vorinstalliertem Webcam-Treiber)

Umsetzung der Gestensteuerung: Eyesweb 3.3

Umsetzung des Spieles: Unity 5.2.2 (programmiert in C#)

Umsetzung

Für die eigentliche Spielelogik haben wir uns an einem Unity-Tutorial orientiert, so dass die Implementierung des Spieles gut von statten ging.


Die Gestenerkennung und -steuerung findet komplett über Eyesweb statt.

Patch bis zu den BRs


Zuerst spiegeln wir den Kameraeingang, so dass sich die Kanone aus Spielersicht nach links bewegt, neigen sich beide Spieler nach links. Würden wir das nicht tun, würde die Kanone immer in die "falsche", also die entgegengesetzte Richtung zur Spielerbewegung fliegen, was zu Verwirrung führen würde. Danach nutzen wir den "Split"-Patch, um den Kameraengang in zwei Hälften (in der Mitte des Bildschirms angesetzt) zu trennen. Alle anschließenden Schritte finden deswegen doppelt statt, einmal für die linke (Spieler 1) und einmal für die rechte (Spieler 2) Hälfte.

Wir arbeiten mit Hintergrundsubtraktion, Binarisierung und lassen anschließend einen Medianfilter über das Bild laufen, um Störungen abzuschwächen und teilweise sogar zu entfernen.

Erst jetzt beginnt die eigentliche Personenerkennung: Wir lassen uns von Eyesweb jeweils die Koordinaten des Knies, des rechten und linken Bounding Rectangle (umschließendes Rechteck) sowie das Center of Gravity(Schwerpunkt) ausgeben.

Patch ab den BRs


Die Kniehöhe geben wir jeweils direkt mittels OSC-Signal an das Spiel weiter - dort wird sie genutzt, um Änderungen abzufragen und damit einen Sprung/Kniebeugen zu detektieren.

Mit den restlichen Daten führen wir einige Berechnungen direkt in Eyesweb durch. So ziehen wir von den Koordinaten des Schwerpunktes die Koordinaten des linken BR ab, so dass wir die Differenz (sprich: Entfernung) erhalten. Umgekehrt müssen wir natürlich vom rechten BR die Koordinaten des Schwerpunktes abziehen, um das selbe zu erhalten. Es gibt einen Sonderfall beim linken Spieler, den wir beachten mussten: Sollte der linke Spieler über den linken Rand des Bildes hinausgehen, bzw. seinen Arm zu weit nach links strecken, wurden die Werte invalid, da sie in den negativen Bereich gekommen sind. Darum mussten wir hier noch einen InvalidHandler einfügen. Beim rechten Spieler kann dies nicht passieren, da er sich nur in positive Richtung oder ins linke Spielfeld bewegen kann - dies sorgt zwar für eine eventuell falsche Erkennung, aber dennoch für gültige Werte.


Nachdem wir nun die beiden Differenzen haben, ziehen wir die linke Dif. von der rechten ab - damit erhalten wir das Vorzeichen für die Beweung (links = negativ, rechts = positiv). Diese wandeln wir nun von einem Integer in einen Real Wert um, so dass Kommastellen zugelassen sind. Nun teilen wir sie durch 100, der bleibende Wert gibt Stärke und Richtung der Bewegung an und wird jeweils via OSC übertragen.

Anschließend wird im Programm ein Vergleich durchgeführt, ob die vom linken und vom rechten Spieler kommenden Werte zusammenpassen und entsprechend damit das Spiel gesteuert.

ISS Unity Kopie.jpg

Den Eyesweb-Patch findet ihr hier: Eyesweb-Patch Gestensteuerung


Und das Programm aus Unity: Spiel in Unity


Von Fabian Fuchs, Arthur Hilbert, Sara Fee Kraft B-ME 3, Wintersemester 2015/16