Ballpit VR

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Umsetzung eines Virtuellen Bällebads mittels Oculus Rift und Kinect in der Unity-Engine.


Systemstruktur

Ballpit systemstruktur.PNG

Vorwort

Wer hat, beim Anblick eine Bällebads, nicht schon mal daran gedacht seine Kindheit wieder aufleben zu lassen. Reinspringen, die Bälle umherwerfen, darin abtauchen und einfach mal versuchen das unbeschwerte Spaßgefühl, das man in der Form zuletzt als 4- oder 5- Jähriger hatte, zurückzuholen. Leider wird dieser Gedanke immer entweder von der Gesellschaft, dem eigenen Schamgefühl, oder einem Altersbegrenzungsschild unterbrochen. Nach dem „Crazy Plastic Ball Prank“-Video des YouTubers Roman Atwood hatte auch uns der Hype gepackt. Aber ohne mehrere tausend euro in der Tasche um sich abertausende an Plastikbällen zu kaufen, wollten wir mit diesem Projekt eine andere Möglichkeit finden, den Spaß eines Bällebads nachzuerleben. Um vollständig darin abtauchen zu können, und weil wir damit unbedingt mal arbeiten wollten, brauchten wir eine VR-Brille: Die Oculus Rift. Die Steuerung dieses Simulators sollte am besten vollständig durch Eigenbewegung des Körpers funktionieren, um möglichst nah an die Realität zu kommen. Desshalb entschieden wir uns nach Abwägen von anderen Möglichkeiten, wie Webcam, Wii-Fernbedienung, u.a., für die Kinect. Die Kinect bietet den Vorteil, dass wir gleichzeitig sowohl Tiefenkoordinaten für das Bewegen unserer Spielerfigur, als auch Personen und Bewegungserkennung zur verfügung haben. Wir beschlossen außerdem eine Engine zu benutzen, da das Schreiben einer eigenen Physik für die Bälle für in der kurzen Zeit zu aufwändig gewesen wäre, und wählten nach einiger Recherche die Unity Engine.

Erstellen der Scene mit Blender

Ballpit blender screen.png

Generieren und platzieren gleichartiger Objekte

Ballpit Ballspawn.png

Ansatz: Klonen eines vorher definierten Objektes zur Laufzeit. Dabei sollen die Attribute der Klone (Größe, Position, Farbe) durch ein Script gesteuert werden. Herangehensweise: Neues GameObject definieren. Dabei nehmen wir das Standard-mesh “lowPolySphere”, um hardwarelast zu minimieren. Dann werden dem Objekt die gewünschten eigenschaften verliehen, damit es sich wie ein Ball in einem Bällebad verhält. Zum Beispiel bekommt das Objekt die Komponenten SphereCollider und RigidBody. Damit wird die Kugel als starrer Körper beschrieben, der für andere Objekte nicht durchlässig sein soll. Dadurch häufen sich die Bälle individuell auf dem Boden an. Hinzu kommt ein Material mit einer einfachen Textur, die später per Script geändert wird. Das Script ist von außen parametrierbar (größe, anzahl, farben...). Zum erzeugen der Bälle wird nun eine neue Koordinate in der Scene erstellt, an der die Objekte erscheinen sollen. Dieser wird das Script zugewiesen und angepasst. Sobald das Programm gestartet wird, wird das Script ausgeführt und die Scene mit bunten Bällchen gefüllt.

float float

Einbinden der Kinect (V1)

Verwendetes Asset: “Kinect with MS-SDK” (zum einbinden der Kinect SDK in Unity) Das Script KinectManager bietet die Schnittstelle zur Kinect. Es muss als Script der MainCamera hinzugefügt werden. Über die Skelett Koordinaten soll der Spieler-Avatar bewegt werden und die Position im Raum bestimmt werden. Der Avatar besteht aus einer hierarchisch angelegten Struktur von Joints, den Gelenkpunkten. Diese werden durch ein AvatarController-Script mit Echtzeit-Informationen aus den Skelet Punkten manipuliert. Die Struktur dieses Join-Graphen ist sehr komplex, daher haben wir nach anfänglichen Versuchen, unseren eigenen Avatar zu verwenden, auf den Standard-Avatar aus dem Asset-Pack zurückgegriffen.

Known Bugs

Leider gab es zum Zeitpunkt unserer Projektarbeit einen bekannten Bug in Unity, der dafür gesorgt hat, dass die Verbindung zur Kinect in manchen Situation nicht klappt oder nach einigen Minuten verloren geht.

Verhalten des Avatars im Raum

Ballpit skeletthierarchie.png

Bewegungsgeschwindigkeit anpassen: Verdopplung der Geschwind1igkeit um die Szene schnell und dynamisch passierbar zu machen. Gewünschtes physikalisches Verhalten: bleibt auf dem Boden durch Boxcollider unter den Füßen. Glaubhafte Kollision mit den Objekten: Person durch Masse an Gegenkollision gehindert, Bälle durch Verringerung der Masse an das Verhalten von Plastikbällen angenähert. Drehung und Neigung des Kopfes auf die First-Person-Kamera übertragen. Kopf +Hals auf 0 Skaliert, Kamera an Hals geparented.

Oculus (DK2)

Die Oculus Rift hat uns von anfang an Probleme gemacht, die aber eigentlich recht einfach zu lösen gewesen wären. Die Oculus hat sehr hohe Hardware anforderungen, vor allem an die Grafikkarte und die möglichkeiten des aktuell von uns benutzten Laptops sind immer noch zu gering. Durch installation eines eigentlich falschen Grafik-Tribers konnten wir jedoch das Gerät zum funktionieren bringen. In Unity 5.2, mit welcher wir gearbeitet haben ist die VR-Unterstützung bereits in der Engine verbaut, so dass das einbinden der Brille nur das setzen eines Hakens erforderte. Allerdings funktionieren die Kamera der Oculus und die Kinect nach dem selben Prinzip und stören sich gegenseitig. Um das zu umgehen haben wir die Kamera der Oculus deaktiviert, und das von der Kinect kontrollierte Skelett als zentrales Steuerelement verwendet. Die Position der virtuellen VR Kamera wurde nach diesem ausgerichtet, indem wir sie statt des Kopfes des Spielercharakters eingesetzt haben.

Herausforderungen

Ballpit Bob.PNG
  • Koordinaten aus OR stören die Kinect
  • Import der Szene mit Texturen (ungelöst)
  • First person Perspektive aus dem Inneren der Figur
  • Speicher- und Ressourcenbedarf (ungelöst)
  • Fehler bei der Kollisionsabfrage
  • Figur fiel durch den Boden, wurde durch die Szene katapultiert

davon behoben:

  • OR Kamera aus System entfernt -> Position der Kamera auf Position des Kopfes zurück gesetzt
  • Kopf der Figur entfernt, Kamera strategisch ausgerichtet
  • Ein flacher Box Collider verhinderte das Treten auf die Bälle
  • Der Mesh Collider des Bodens benötigte eine Textur um richtig zu funktionieren

Ausblick

Zur Weiterentwicklung des Bällebad-Simulators stehen einige Möglichkeiten offen, da es bis jetzt nur eine Sandbox darstellt. Es baut eine Welt auf, deren einziger Zweck es im Moment ist sich dem Spieler zu Präsentieren und einige Minuten Entdeckungs- und Spielspaß zu bereiten. Eine logische Weiterentwicklung wäre es, dem Spieler die Möglichkeit zu geben via Gestensteuerung Bälle zu greifen, aufzuheben und zu werfen. Daraus ergeben sich wiederum Ideen für unterschiedliche Minispiele und Aufgaben, wie Zielwerfen, Basketball, ein Objektsuchspiel nach dem Nadel-im-Heuhaufen-Prinzip, oder auch ein Multiplayer shooter, in dem man sich gegenseitig abwerfen muss.

Weblinks