Hololens mit Unity3D: Ein Beispielprojekt

Keine Kommentare

Im vorherigen Teil der Blogserie zum Thema Augmented Reality mit der Hololens (Hololens mit Unity3D: Projektsetup) haben wir die Integration der Hololens in die Engine Unity3D erläutert. Hier wollen wir nun anhand eines Beispiels auf die elementaren Elemente von Unity3D im Umgang mit Mixed Reality und der Hololens eingehen. In diesem Projekt wollen wir eine Maschine um mögliche Wartungsanweisungen ergänzen, diese platzieren und abschließend in Form eines Hologramms anzeigen.

Ein besonderer Dank gilt an dieser Stelle der Firma Röltgen, die uns die Maschine mit ihren Wartungsanweisungen zur Verfügung stellte.

Component-Entity-System

Wie die meisten 3D-Engines setzt auch Unity auf das Entity-Component-System. Dies beschreibt einen Architekturansatz, der auch nach dem composition over inheritance Prinzip agiert. Die Basis bilden hier Entities. Diese beschreiben jegliche Art von Objekten. Dabei ist es egal, ob sie sichtbar oder unsichtbar sind, sich bewegen oder statisch sind. Die Entities können um beliebige Subelemente erweitert werden. Jedes Subelement fügt weitere Components hinzu. Components können Eigenschaften, Funktionen oder Beschreibungen sein. Components können somit auch wiederverwendet und anderen entities hinzufügt werden, ohne Abhängigkeiten zu erzeugen. Somit können komplexe Vererbungen vermieden werden.

Component-Entity-System

Dieses Beispiel zeigt einen Würfel, dem ein Rotator Component zugewiesen wurde. Dieses sorgt dafür, dass sich der Würfel dreht. Eine weitere Komponente, die jede Entity besitzt, ist das Transform. Hiermit kann jedem Element innerhalb einer Scene eine Position, eine Ausrichtung und/oder eine Skalierung gegeben werden.

Scene, Events & GameState

Die Scene beschreibt die hierarchische Anordnung der Elemente und ermöglicht so das Gruppieren und die Kapselung von Elementen. In diesem Projekt haben wir eine Scene mit den Basiselementen Licht, der HoloLensCamera ausgestattet. Zusätzlich wurden ein HUD, die animierten Wartungsschritte und Spracherkennung unter einen GameStateManager gehängt.

Scene mit GameStateManager

Der GameStateManager ist ein Singelton, das die unterschiedlichen Interaktionen mithilfe von Events steuert und zusätzlich den aktuellen State der Anwendung speichert. Triggert die Spracherkennung bei einem Signalwort den GameStateManager für einen Befehl an, dann feuert sie ein Event an alle Subelemente, die die Methode des Events implementieren.

Das folgende Beispiel zeigt das Erzeugen eines Events im GameStateManger.

Dieses Code Snippet zeigt, wie wir ein Event empfangen und verarbeiten.

Um die Interaktionen mit den 3D-Objekten ohne Hololens zu erleichtern, haben wir zusätzlich einen DebugController erstellt, der anstatt von Spracherkennung mit Hilfe von Tastatureingaben verschiedene Events auslösen kann. Dieser macht es möglich den Ablauf der Animationen testen zu können ohne die Anwendung in der Hololens deployen zu müssen.

Animationen

Um Animationen in Unity zu integrieren und abspielen zu können, müssen diese zuvor von einer 3D-Modeling-Software erstellt werden und als .fpx-Datei abgespeichert werden. Anschließend können wir diese Datei per Drag’n’Drop den Assets von Unity hinzufügen. Im Assetbrowser sind so zum einen die einzelnen Modellteile als auch die erstellten Animationen sichtbar (siehe markierte Komponente).

Animationen in einer .fpx-Datei

Um den Ablauf von Animation zu steuern, erzeugen wir einen AnimationsController, in dem wir einen Start und ein Ende definieren. Der Start und das Ende wird durch Transitions verbunden. Eine Transition beschreibt dabei den Wechsel von einer Animation zur nächsten. Diese Transition können wir noch mit einer Animation aus dem Import verknüpfen. Nachdem wir den Ablauf der einzelnen Animationen definiert haben, übergeben wir diese einer Statemachine und können diese über ein Skript steuern.

Animations-Flow

Interfaces in Mixed Reality

Während klassische 2D-Anwendungen auf diegetische oder Meta-Interfaces setzen, bieten sich für VR-Anwendungen spatiale Interfaces an. Derartige UIs bieten eine dritte Dimension mit Berücksichtigung der Kamera und werden in der Regel direkt in die Szene integriert. Zu beachten ist dabei, VR-Sickness zu vermeiden. Diese kann auftreten, wenn die körperliche Selbstwahrnehmung von der visuellen Wahrnehmung abweicht, und somit zu Schwindelgefühl führen.

AR-Anwendungen bieten die Möglichkeit, Interfaces auf unterschiedliche Art und Weise im 3D-Raum zu platzieren. Zum einen können wir das Interface an die Position eines anderen Objektes (body-locked), an eine feste Position im Weltkoordinatensystem binden (world-locked) oder dafür sorgen, dass das Interface immer im Sichtfeld des Anwenders ist (head-locked). Für Letzteres bietet Unity zwei Komponenten an, die die Erstellung eines head-locked HUDs erleichtern. Dazu wird zunächst ein GameObject erstellt und das Billboard Component von Unity hinzugefügt. Diese sorgt dafür, dass der orthogonale Vektor des Interfaces immer in Richtung der Kamera zeigt und führt somit zum gewünschten Head-locked-Effekt. Dies kann mit einem Tag-along Komponente verbessert werden. Diese passt die Bewegung des Interfaces auf eine natürliche Weise an und vermeidet bei richtiger Parametrisierung VR-Sickness.

Tagalong-Component in Unity

Voice Input

Interaktionen mit dem Hologramm erfolgen in diesem Beispiel über Spracheingaben des Anwenders. Dazu nutzen wir die integrierte Unity-Voice API. Hierzu wird ein GameObject erstellt und ein Skript angehängt, das auf die Voice API der Hololens zugreift. Dieses Skript initialisiert einen PhraseRecognizer, dem ein Array an Schlüsselwörtern übergeben wird. Durch die Verwendung der definierten Schlüsselwörter wird ein Event geworfen und die entsprechende Aktion ausgelöst.

Platzierung des Objektes

Zur Platzierung des Objektes haben wir uns das Spatial Mapping zu Nutze gemacht. Dabei wird zunächst die Geometrie des Raumes mit der Kamera der Hololens erfasst und somit ein Mesh erstellt. Dieses Mesh wollen wir nutzen, um unser Objekt zu platzieren. Dazu definieren wir eine zusätzliche Hilfsebene, die im Boden liegen soll. Unser eigentliches Objekt setzen wir über unsere virtuelle Hilfsebene mit dem originalen Abstand zwischen Boden und Maschine. Des Weiteren soll unsere virtuelle Ebene direkt an einer Wand-Boden-Kante platziert werden. Somit müssen die unterschiedlichen Ebenentypen Wand, Boden oder Decke identifiziert werden. Insgesamt teilt sich so unsere Anwendung in drei Teile auf. Im ersten Teil wird der Raum gescannt, danach erfolgt die Platzierung der virtuellen Bodenebene an der gewünschten Wand und schließlich die eigentliche Anwendung.

Dieses Vorgehen wird auch seitens des MixedRealityToolkit unterstützt. Kernelemente sind hier vor allem der Spatial Mapping Renderer und der Spatial Mapping Collider. Ersteres unterstützt die Visualisierung & Erstellung einer Raumkarte. Der Spatial Mapping Collider dient zur Interaktion mit dem Mesh. Das Labeling des richtigen Ebenentyps erfolgt automatisch nach der Erstellung des Meshes. So können wir abschließend die Hilfsebene ideal an der gewünschten Wand-Boden-Ebene platzieren.

Fazit & Ausblick

In diesem Blogpost haben wir aufgezeigt, wie man verschiedene Elemente relativ einfach in Unity zu einer Mixed-Reality-Anwendung kombinieren kann. Einen Ausschnitt aus unserem Prototyp könnt ihr hier sehen:

Animation

In Zukunft wollen wir noch einige Elemente verbessern. Zum einen wollen wir auf die vorangehenden Schritte zur Platzierung verzichten und den Raum direkt platzieren können. Hier könnte ein Marker-basierter Ansatz helfen. Zum anderen wollen wir mit unterschiedlichen Materialien experimentieren, um die Animationen besser an die reale Szene anzupassen.

Dominik Schlicher

Dominik arbeitet seit 2016 bei der codecentric in Münster. Er arbeitet als Consultant und Entwickler von Java-Enterprise-Technologien sowie modernen Webanwendungen. Dabei ist er ein Verfechter von agilen Prozessen.

Markus Höfer

Markus arbeitet als Consultant und Entwickler im Bereich Big Data, verteilter Systeme sowie Mixed- und Virtual Reality. Er unterstützt seine Kunden bei der Konzeptionierung und Implementierung von Service Architekturen.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.