HumanBlobbyVolley

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

BlobbyVolley2 mit Steuerung über OSC

BlobbyImage.JPG

 


Human Blobby Volley
Das Blobby Team: Brunner Franziska
Zerwes Marcus
Gerlach Tobias
Hocheder Stefan


Kurzbeschreibung

Als Grundlage unserer Arbeit dient das Open Source Game "Blobby Volley 2". Das Ziel ist es die standartmäßige Steuerung welche mit Tasten funktioniert in eine interaktive Anwendung mit Hilfe von Positionsbestimmung über WebCams umzuwandeln. Um das zu erreichen wurde mittels "EyesWeb" die nötigen Positionsberechnungen durchgeführt und über eine OSC Schnittstelle in den Source Code von Blobby Volley 2 eingebunden.

Vorbereitung

  1. Einarbeitung in die Software Eyesweb
  2. Einarbeitung in den Blobby Volley 2 Source Code
  3. Verknüpfung der einzelnen Komponenten mittels OSC Schnittstelle
  4. Einarbeitung in die Software Blender zur möglichen Nutzung dessen Game-Engine

Eyes Web

Anforderungen:

  • Den Spieler durch Web-Cam aufnehmen
  • Die Position (X/Y-Koordinate) des Spielers bestimmen
  • Position über OSC-Schnittstelle an das Spiel schicken
  • Eventuelle Störungen im Bild reduzieren


EyesWeb Patch:

Eyesweb patch alles.JPG


Hintergrundsubtraktion und Filter

Eyesweb patch hintergrund u filter.JPG

Subtraktions-Block:

  • Umwandlung in Grauwertbild
  • Hintergrundsubtraktion
  • Binarisierung (Schwellwert automatisch nachgeregelt)


Opening:

  • Kleinere Störungen werden herausgefiltert


Median:

  • Kanten der Region werden geglättet

Schwerpunktberechnung und Ausgabe über OSC

Eyesweb patch schwerpunkt.JPG

Schwerpunktbestimmung:

  • Wird über Block berechnet
  • Darstellung als Punkt im Display


Koordinate für OSC Nachricht:

  • Koordinaten werden Modifizeirt (Anpassung der Koordinatensysteme von EyesWeb-Koordinaten zu den Spiel-Koordinaten)
  • Koordinaten werden über OSC-Protokoll an den OSC Empfänger im Spiel (Port 7000) übergeben.




SourceCode

Um die gewünschten Anpassungen an der Spielsteuerung vornehmen zu können müssen wir die Sourcen des Spiels modifizieren. Die ersten Schwierigkeiten zeigten sich bereits im Vorfeld beim Versuch das Spiel das erste mal zu kompilieren. Benötigte Libraries waren (natürlich) nicht enthalten, diese mussten zunächst zusammengesucht werden. Zudem wurden bestimmte Build-Umgebungen und Tools vorausgesetzt (make, CMake, MinGW, MSYS). Diese mussten noch installiert werden, eine kurze Einarbeitung war ebenfalls nötig. Bei SDL musste zwingend die Reihenfolge der Linkerflags beachtet werden.

Blobby Volley 2 Sourcen

Die Sources vom Spiel "Blobby Volley 2" (ca. 20MB, Stand 07-2012) können von Sourceforge heruntergeladen werden: http://blobby.svn.sourceforge.net/viewvc/blobby/

Alternativ ist die Einbindung über SVN möglich, URL: https://blobby.svn.sourceforge.net/svnroot/blobby

Notwendige Libraries

Letzendlich ergaben sich zum kompilieren folgende zu inkludierende Libraries: -lmingw32 -lphysfs -lSDLmain -lSDL -loscreceiver -lWs2_32 -lwinmm -lboost_thread-mgw44-mt-d-1_49.dll

Die resultierenden zur Laufzeit benötigten DLLs werden einfach dem Spielverzeichnis hinzugefügt. (SDL.dll, libphysfs.dll, mingwm10.dll, libboost_thread-mgw44-mt-d-1_49.dll)

Im nachfolgenden eine kurze Beschreibung der benötigten Libraries (ohne System-Libraries).

Boost

http://boost.org

Eine der bekanntesten C++ Libraries, welche einige Schwächen der STL durch verbesserte Klassen kompensiert. Bei den meisten Klassen reicht das inkludieren der Header, dies erfolgt am einfachsten über eine symbolische Verknüpfung im trunk\src Ordner, z.B. mittels "mklink /J boost C:\include\boost_1_49_0\boost" (Verzeichnisverbindung).

Die von uns verwendete Thread-Library musste allerdings als dll kompiliert werden.

PhysicFS

http://icculus.org/physfs

Emulation eines virtuellen Filesystems auf das die skriptbasierte Spielengine kontrolliert zugreifen kann.

libSDL

http://www.libsdl.org

Simple Directmedia Layer - zum Ansprechen der Peripherie und Bildausgabe

oscpack

http://code.google.com/p/oscpack

Zur Verwendung von OSC über Netzwerksockets. In unserem Fall: Erstellung eines OSC Receivers im Spiel.


Implementierung

Anpassung des Hintergrundes

Um einen eigenen Hintergrund in das Spiel zu bekommen muss zunächst ein geeignetes Bild erstellt werden:

- Abmessung: 800*600 Pixel

- Format: .BMP, indizierte Farben (8bit)

Dieses Bild wird in den Ordner data/backgrounds kopiert, beim nächsten kompilieren wird das Bild dann zum backgrounds.zip Archiv hinzugefügt. Um das Bild direkt als Hintergrund zu setzen kann dies in der config.xml entsprechend angegeben werden z.B.

<var name="background" value="nbg_beach" /> .

Alternativ ist auch im Menue des Spiels ein Wechsel zwischen den vorhandenen Hintergründen möglich.

Anmerkung: Es war eine weitere Anpassung im Quelltext des Spiels nötig, damit die Hintergrundbilder im Menue gewechselt werden konnten. (Im Original konnte das Bild nicht gewechselt werden, weil die Endung ".bmp" nicht mit angegeben war - OptionsState.cpp)

OSC Empfänger als Eingabegerät

  • Zum Empfang von OSC Nachrichten nutzen wir OSCPack mittels Vererbung und ergänzen notwendige Variablen und den Netzwerksocket:
class MouseInputDevice : public InputDevice, 
 osc::OscPacketListener {
private: 
 ...
 float posX;   //x-position
 float posY;   //y-position
 float posY0;  //zero-position for jumping
 float lastY;  //holds previous y-position
 bool oscinit; //when received first packet
 UdpListeningReceiveSocket* s; //socket
  • Netzwerksocket wird im Konstruktor auf Port 7000 erstellt (im Destruktor wieder gelöscht):
s = new UdpListeningReceiveSocket(
IpEndpointName( IpEndpointName::ANY_ADDRESS,   
7000 ), (osc::OscPacketListener*)this );
  • Funktion zum Auswerten der empfangenen Koordinaten ist in Elternklasse abstrakt deklariert (d.h. von uns zu implementieren):
virtual void ProcessMessage( 
 const osc:: ReceiveMessage& m,
 const IpEndpointName& remoteEndpoint) = 0;
  • Kernfunktion von ProcessMessage:
if( strcmp( m.AddressPattern(), "/p1" ) == 0 ){
oscinit = true; //make osc active (instead mouse)
osc::ReceivedMessageArgumentStream args =   
  m.ArgumentStream(); //parse stream
args >> posX >> posY >> osc::EndMessage;
//set posY0 when 6 times near previous position
if (((posY>=lastY-2 && posY<=lastY) || 
  (posY>=lastY && posY<=lastY+2)) && ++cnt==6){
cnt=0;
posY0=posY; }
else cnt=0; //reset counter
lastY = posY; //store value for next compare
}
  • Übernahme der Werte durch das Spiel:
void MouseInputDevice::transferInput(PlayerInput& input){
input = PlayerInput();
...
int mouseState = SDL_GetMouseState(&mMouseXPos,  
                                 NULL);
//additions for OSC
if (oscinit){
//XPos: 200...600 (both sides! offset -+200)
mMouseXPos = 200 + (4*posX); //posX: 0...100(r)
if (posY > posY0 + dY) //posY: 0...100(top)
  input.up = true;
}

Integration in den InputManager

Beim Starten eines Spiels wird das ausgewählte Device durch den InputManager initialisiert.

Dieser muss die für OSC notwendigen Parameter mit übergeben (zunächst fest: Port 7000, Address "/p1").

Anpassung der GUI-Texte

Die Implementierung neuer Auswahlmöglichkeiten im Steuerungsmenue wird unter anderem durch das editieren der TextManager.cpp Datei erreicht.

z.B.

mStrings[OP_MOUSE] = "mouse/osc(p1)";

Auslagern der Parameter ins inputconfig.xml

Gegen Ende der Projektdurchführung wurden zunächst fest kodierte Parameter noch in ein XML ausgelagert. Dies hat den Vorteil, dass kleinere Anpassungen ohne neu kompilieren des Spiels möglich sind (z.B. Verwendung anderer Eingabegeräte/EyesWeb-Patches). Einzige Anforderung ist dass x- und y- Koordinate als Float-Wert zwischen 0 und 100 (Prozentwert) übergeben werden, mit Koordinatenursprung in der linken unteren Ecke.

<var name="osc_p1_address_pattern" value="/p1"/>
<var name="osc_p1_listening_port" value="7000"/>
<var name="osc_p1_jump_offset_dy" value="1"/>
<var name="osc_p1_reset_tolerance_dy" value="2"/>
<var name="osc_p1_reset_counter_dy" value="6"/>

Bedeutung der (ganzzahligen) Parameter fürs Zurücksetzen der Y0-Position:

  • jump_offset_dy: Wertänderung ab der ein Sprung angenommen wird.
  • reset_tolerance_dy: Schwellwert (+/-) für Reset der Y0-Position
  • reset_counter_dy: Anzahl notwendiger Y-Werte (innerhalb tolerance) für Reset der Y0-Position

Mit obigen Werten wird auf Port 7000 nach OSC-Messages mit Adresse /p1 gehört. Die Y0-Position ("Boden") wird nach 6 aufeinanderfolgenen Y-Positionen im Bereich +/-2 um den vorherigen Wert neu gesetzt. (Sinngemäß: Ruhetriggerung)


Spielablauf

Das Spielprinzip ist sehr simpel. Zwei Spieler spielen gegeneinander Volleyball. Schafft man es nicht binnen drei Ballkontakten den Ball in die gegnerische Hälfte des Spielfeldes zurück zu schlagen erhält der andere Spieler einen Punkt. Standartmäßig wird bis 15 Punkte gespielt. Es gibt zwei verschiedene Game Modi, nämlich Singleplayer und Multiplayer.

Singleplayer

  • Man spielt eine Runde Volleyball gegen einen Computergegner, die KI des Computergegners ist im Menue beliebig einstellbar.

Die Configuration des Spiels erfolgt wie unten bei Multiplayer beschrieben. Der dedicated server ist hier aber nicht notwendig, Spielstart erfolgt direkt über den Menüpunkt "Start".

Multiplayer

  • Die Steuerung beider Spielfiguten wird von Menschen übernommen.
  • Es ist möglich über ein LAN-Game ein Spiel als Host zu erstellen oder einem bereits bestehenden Spiel beizutreten.

Configuration eines Multiplayer-Spiels

  • An einem der PCs: blobby-server.exe (dedicated server) starten
  • An PC1:
    • EyesWeb Patch starten (OSC: /p1, Port 7000)
    • In Blobby Optionen anpassen:
      • Eigenen Namen festlegen, “Human” auswählen
      • Misc Options: Network side auswählen (left/right)
      • Input Options: Mouse/OSC(P1) auswählen
  • An PC2:
    • Durchführung wie oben, aber bei Misc Options die "andere" Netzwerkseite auswählen

Starten des Spiels

  • In Blobby: LAN Game auswählen
  • Server “Blobby Volley 2 Interaktion” (Name konfigurierbar in server.xml) auswählen
  • OSC Position wird unter dem Blob angezeigt
  • Zur Angabe unter den Ball stellen und springen
  • Anmerkung: Eine Änderung der Position zur Kamera hin löst ggf. auch einen Sprung aus. Die “Nullposition” der Y-Koordinate wird deshalb während des Spiels dynamisch nachgeregelt. (Parameter in data/inputconfig.xml anpassbar!)


Systemübersicht

Build-Umgebung

Wir nutzen Windows7 mit Eclipse als IDE und den Tools: MinGW, make, CMake, MSYS

Libraries: Boost, PhysicsFS, SDL, oscpack

Webcam

Automatische Regelungen müssen für Hintergrundsubtraktion abgeschaltet werden!

EyesWeb

Zur Bildverarbeitung, Webseite: http://www.infomus.org/eyesweb_eng.php

Eyesweb-Patches: noch anfügen

Netzwerk

Für Multiplayer-Spiele ist ein Netzwerk erforderlich, in dem die Kommunikation zwischen den Rechnern gestattet ist. (Nicht gegeben z.B. im Labor im Postbank-Gebäude!)

Download

Den Programmcode sowie den EyesWeb Patch und das fertige Spiel gibts hier zum Download.