Augmented Reality für die Unreal Engine – jetzt als echtes Plugin

Vor nicht allzu langer Zeit haben wir darüber berichtet wie man Unreal, eine super coole 3D-Engine, reif für Augmented Reality macht. Aber nicht allzu lange Zeit ist in unserer Welt der „Kaffee-zu-Software-Konvertierer“ eine Ewigkeit und es hat sich in der Zwischenzeit viel getan. Wie wir das jetzt noch besser gemacht haben, zeige ich dir jetzt.

 

vuforia4unreal engine by codefluegel

einfache Demo mit minimalem Licht und Texturen

*UPDATE: In der Zwischenzeit haben wir das Plugin als Open Source Projekt veröffentlicht! Die aktuellsten Infos gibt es hier!

Im Zuge unserer Xcite3d Eigenentwicklung bei der es darum ging, Augmented Reality (AR) in der Welt der Architektur zu verbreiten, haben wir einen Patch für die Unreal Engine entwickelt, um diese AR-fähig zu machen. Und da wir alle wissen, dass in dieser Welt Aussehen alles ist, haben wir uns damals für Unreal entschieden. Laut unserer Recherche, war bis dato Unreal die fortschrittlichste mobile 3D-Engine mit der wir Effekte wie dynamische Belichtung, Transparenzen und jede Menge Partikelsysteme einfach umsetzen und damit selbst die Architekten ins Staunen versetzen konnten. Das AR Framework unserer Wahl war damals Metaio. Und wie unsere Welt eben so ist, wurde Metaio von Apple gekauft und vom Markt genommen. Ein herber Rückschlag für unser Projekt.

Rückschlag oder Glück im Unglück?

Naja, mit Rückschlägen können wir umgehen, und verstauben lassen wir schon gar nichts. Außerdem sind wir nun ein Jahr älter und haben eine Menge dazugelernt. Auch Unreal hat sich weiterentwickelt und Metaio ist nicht alles. Also haben wir unser angesammeltes Wissen genutzt und kurzerhand Vuforia mit Unreal in Form eines hammer-coolen AR-Plugins für zukünftige Projekte verknüpft. Und ja, ihr habt gerade schon richtig gehört: es ist ein echtes Plugin. Wir haben es hingekriegt, AR in Unreal zu integrieren ohne den Engine Code anzurühren. Wer Vuforia für Unity3D kennt, dem wird jetzt die Kinnlade runter fallen, denn unser Plugin funktioniert ganz genau gleich nur eben mit Unreal und allen Features die Unreal so zu bieten hat.

Interessiert? Na hoffentlich! Nach der kleinen Geschichte zum wieso und warum werde ich euch jetzt auch erzählen wie wir das so hin bekommen haben. Dazu muss ich aber kurz ausholen.

Die technische Grundlage

Augmented Reality ist die dreidimensionale Registrierung von virtuellen Objekten in der physikalischen Welt, interaktiv in Echzeit [Azuma et. al]. Wir brauchen also: eine Echtzeitdarstellung der Realität ( = der Kamerastream für handheld AR am Smartphone), eine äußerst gute Echtzeit Engine zum Rendern der virtuellen Objekte (= Unreal) und zur richtigen Positionierung und Orientierung (Pose) der 3D Objekte viel Computer Vision und Mathe (also ein AR-SDK = Vuforia).

Die erste Herausforderung war also die Verbindung der Vuforia Library mit Unreal. Was vor einem Jahr noch mühsam über einem Enigne Patch funktioniert hat, kann jetzt ganz einfach mit Unreal Bordmitteln gemacht werden. Mithilfe der Native-API von Vuforia hatten wir somit auch schon alles erledigt und AR in Unreal integriert. Dazu kann man einfach unseren Initialisierungscode als Unreal Objekt in die gewünschte Szene setzen. Naja, zumindest in unserer Welt, für die meisten Benutzer reicht ein Logeintrag einer Matrix mit Pixel- und Posewerten nicht aus. Als nächstes heißt es also rendern, darstellen und hübsch machen.

Und jetzt hübsch machen

Die Vuforia Kamerapixelmatrix  wird in jedem Frame auf die Textur einer „dynamicMaterialInstance“ kopiert. Während des Kopierens wird das Seitenverhältnis der Kamerapixelmatrix auf das Seitenverhältnis des Bildschirmes angepasst. Niemand will schließlich einen verzerrten Kamerastream. Das dynamische Material weisen wir einer Ebene zu, die aus zwei Dreiecken und entsprechenden Texturkoordinaten besteht. Die Ebene skalieren wir mithilfe der Projektionsmatrix der Szenenkamera, die wir später anhand der Vuforia Posematrix synchron zu unserer physikalischen Smartphonekamera bewegen. Das Seitenverhältnis dieser Szenenkamera, die ja sozusagen unsere AR-Kamera ist, entspricht dem des Bildschirmes und der Öffnungswinkel dem der Smartphonekamera. Die richtig skalierte Kamerastream-Ebene hängen wir zum Abschluss noch an den Szenengraph der AR-Kamera, so bewegt sie sich schön mit der Kamera und ist immer bildschirmfüllend zu sehen. Und dann ist alles fertig? Nein, ganz am Ende sind wir leider noch nicht, da war ja noch dieses Pose Problem.

Das verflixte Pose Problem

Also mit Pose Problem meine ich, das Setzen der AR-Kamera synchron zur physikalischen Kamera, quasi die Essenz von AR – die Verbindung von real und virtuell. Und mit dieser Pose ist es oft etwas knifflig, aber auch das kriegen wir hin. Von Vuforia bekommen wir eine rechts-händige, column-major, OpenGl Model-Matrix (das ist im Prinzip Nerd-Sprache für „verkehrt herum“). Aber kein Problem, zumindest kein unlösbares. Von rechts nach links konvertieren, transponieren und wir haben eine row-major Matrix. Dann noch nachrotieren und invertieren und wir haben eine Tranformationsmatrix für unsere AR-Kamera im Koordinatensystem von Unreal. Die Kamera bewegt sich nun relativ zu einem definierbaren bildbasierten Tracking Target, synchron zu unserer Smartphonekamera. Sie rendert eine beliebige Unreal Szene, mit laufendem Kamerastream im Hintergrund. Voilá — unser AR Pulgin Vuforia4Unreal.

Das war jetzt echt eine ganze Menge an Technikvoodoo, aber so ein AR-Plugin ist halt auch keine ganz triviale Sache, und nicht umsonst gibt es nach unserem Wissensstand noch kein zweites Vuforia Plugin für Unreal. Zum Abschluss ist hier noch ein kleines Erklärvideo, mit Infos wie man unser Plugin verwendet und anschließender Demo. Kinderleicht und mit super Effekten, nicht?