Unity MoCap Dokumentation

// Abstract

Unser Projekt hat an sich keinen direkten Zusammenhang mit dem Motion Bank Projekt. Da wir (Steve und Florian) sehr technik-affin sind, haben wir uns der anderen möglichen Aufgabenstellung gewidmet – der Entwicklung einer alternativen Möglichkeit zum Aufzeichnen von Bewegungsdaten.

IMG_0107

Die Idee für unser Konzept entstand aus einem einfachen Gedanken: Gewöhnliche Motion Capturing Verfahren sind extrem teuer. Aufgrund des massiven Setups, das benötigt wird (Kameras, Marker-Suits, spezielle Software) ist das Motion Capturing ein technischer Luxus, den sich im Moment noch leider nur die großen Spiel- und Filmstudios leisten können. Wir wollten ein neues Verfahren erschaffen, das auch Indie Studios diesen Luxus zum Standard macht.

Bei unserer Recherche fanden wir heraus, dass es solche Verfahren bereits gibt. Firmen wie Xsens oder Synertial stellen beispielsweise Anzüge mit Beschleunigungssensoren her, die für Motion Capturing verwendet werden. Allerdings sind diese Anzüge fast genauso teuer wie ein gewöhnliches Setup mit Kameras und Markern. Wir wollten ein System entwickeln, das so kostengünstig wie möglich ist. So kamen wir letztenendes auf die Idee Sensoren zu verwenden, die fast jeder zu Hause herumliegen hat: Beschleunigungssensoren in Smartphones.

// Entwicklungsumgebung

Aufgrund der Tatsache, dass es ja genau für die Entwicklung von 3D-Spielen gedacht ist und auch direkt Unterstützung für Mobilgeräte bereithält, fiel die Wahl schnell auf Unity als Engine für unsere Tracking Software. Das Auslesen der Sensordaten über WiFi war überraschend schnell geschafft und wir hatten direkt eine Live-Verbindung zum Smartphone. Nun mussten wir die Daten in Bewegung umwandeln.

// Entwicklung des Tracking – Steve

Das Umwandeln der Tracking-Daten in Bewegung hat uns aufgrund eines Denkfehlers Anfangs starke Probleme bereitet. Die ersten Wochen versuchte ich qualhaft aus den Daten des Accelerometers die absolute Position des Phones zu berechnen. Das heißt, wenn das Phone 2cm nach links und dann wieder 2cm nach rechts bewegt würde, sollte sich eine Differenz von 0 ergeben. Das Problem hierbei war leider, dass, im Gegensatz zur Winkelbeschleunigung, lineare Beschleunigung nur sehr schwer gemessen werden kann. Als ich kurz davor waren aufzugeben und wir uns bereits Gedanken über ein alternatives Projekt machten, fiel mir beim Herumspielen mit einer Ragdoll auf, dass wir nicht die Position der einzelnen Gelenke brauchten, sondern die Rotation. Schließlich kann man seinen Arm ja auch nicht weiter vom Körper wegbewegen, als er ist – man kann ihn nur drehen. Nachdem der Code nun umgeschrieben war um den Gyro zu verwenden, kam eine Grauenhafte Wahrheit ans Licht: Der Gyro gibt Rotation in 4 Dimensionen aus.

// Die Sache mit den Quaternionen – Steve

Quaternionen sind vierdimensionale Ungeheuer, die vom Teufel auf die Erde gesandt wurden um allen das Leben zur Hölle zu machen, die sich wagen sich mit ihnen anzulegen.

Quelle: http://upload.wikimedia.org/wikipedia/commons/5/55/8-cell-simple.gif

Der gemeine Hyperwürfel, wie er in jedem vierdimensionalen Mensch Ärger Dich Nicht vorkommt.

In Wirklichkeit sind Quaternionen extrem nützlich um Rotationen im dreidimensionalen Raum zu berechnen, da sie kardanische Blockaden verhindern, aber nicht-kommutative Algebra ist dann doch ein Schritt zu weit.
Das Problem war, dass die Koordinatensysteme der Phones auf das Koordinatensystem des 3D-Models angepasst werden mussten. Und da die Geräte nicht alle in der gleichen Ausrichtung an den einzelnen Körperteilen befestigt werden können, muss für jedes Körperteil ein anderes Koordinatensystem errechnet werden. Mittels Trial and Error konnten 4 Tage später alle Gelenke korrekt kalibriert werden und ich konnte ein Studium in weiterführender Mathematik umgehen.

// UI Design – Steve

Nachdem wir uns einig geworden sind, welche Features wir in der finalen Version unserer Tracking-Software alles integrieren wollten, war es langsam Zeit für ein GUI, das den Endnutzer (zwar hauptsächlich Programmierer, aber trotzdem will man ja was für’s Auge haben) anspricht und alle Features geordnet unterbringt. Folgende Features muss das UI beherbergen:

Mobile Ansicht:

  • IP-Adresse des Servers eintragen
  • Master Server Raumnamen eintragen
  • Server-Passwort eintragen
  • Verbindungsmethode zum Server auswählen
  • Gelenk auswählen
  • Mit Server verbinden
  • Gerät neu kalibrieren

joint_select settings

PC-Ansicht:

  • Eigene IP-Adresse anzeigen
  • Master Server Raumnamen festlegen
  • Server Passwort festlegen
  • Verbindungsmethode festlegen
  • Server starten
  • Anzeigen, welche Gelenke verbunden sind
  • Bewegungsablauf aufnehmen
  • Bewegungsablauf abspeichern
  • 3D-Model zurücksetzen auf Anfangsposition (Rekalibrierung)

server_ui ServerUI_create

// Probleme mit dem Master Server – Flo

Mitten beim Implementieren des UIs ging Unity’s Master Server down und war für satte 2 Wochen unerreichbar. Also musste eine neue Lösung her, da P2P nicht in allen Netzwerken problemlos möglich ist (…Uni *ähem*). Ich fand heraus, dass Unity die Möglichkeit bietet den Master Server selbst zu hosten. Der Quellcode dafür steht auf der Unity-Website kostenlos zur Verfügung. Nach einem Tag Arbeit (u.a. weil der Code schon etwas älter ist und neuere Compiler ihre Probleme damit haben) lief der Server endlich. Bis sich sowohl Server- als auch Client-App damit verbinden konnten vergingen zwar nochmal 2 Tage (und Großteil der Nächte), aber unsere MoCap-Software bietet nun 3 Möglichkeiten zur Verbindung an: Unity Master Server, Eigener Master Server und P2P.

// Befestigung am Körper – Flo

Da die Geräte ja genau auf die Lage kalibriert werden müssen, die sie während des Trackings einnehmen werden, musste festgelegt werden wie die Geräte am Körper befestigt werden. Dieses Schema muss später eingehalten werden damit das Motion Capturing funktioniert.

phoneplacement

  • Kopf: Screen nach hinten, Home-Button nach unten
  • Schultern, Arme & Hände: Screen nach oben, Home-Button in Richtung Finger
  • Torso & Hüfte: Screen nach vorne, Home-Button nach rechts*
  • Beine: Screen nach Vorne, Home-Button in Richtung Füße
  • Füße: Screen nach oben, Home-Button in Richtung Zehen

*Smartphones werden an Torso und Hüfte nicht vertikal befestigt um die Beweglichkeit beim Beugen nicht unnötig einzuschränken.

// Animation aufnehmen – Flo

Nach anfänglichen Schwierigkeiten, fand ich heraus, dass Unity freundlicherweise die Möglichkeit bietet Animationen per Code zu erstellen. Hierzu generiert unser Code eine List von zweidimensionalen Arrays, die die Rotation jedes Gelenks in jeder Frame speichert. Daraus wird dann eine .anim-Datei erstellt, die in Unity verwendet werden kann. Leider ist das Abspeichern von Dateien nur im Unity-Editor selbst möglich. Daher ist diese Option in der exportierten MacApp ausgegraut.

// Zusammenfassung

Nach anfänglichen Schwierigkeiten ist es uns am Ende gelungen ein funktionierendes Motion Capturing Verfahren zu entwickeln, das nur Smartphones verwendet. Das sollte ein enormes Plus für Indie Studios sein, da man einfach die Smartphones seiner Mitarbeiter einsammeln und zum Tracken verwenden kann. Das Anschaffen teurer Ausrüstung fällt also weg. Wir werden unser System im Unity AssetStore zur Verfügung stellen und hoffen damit den Graben zwischen AAA / Hollywood und Indie ein bisschen kleiner zu machen. Eventuell werden wir vorher ein IndieGoGo Projekt starten um die kleinen Ecken und Kanten im Code noch auszumerzen, bevor das System an die Öffentlichkeit geht.