ARKit-Demo: Filmemachen mit Augmented Reality

Veröffentlicht: 2022-03-11

AR und VR werden zum Mainstream, und alle großen Hightech-Unternehmen verfolgen sie: Apple hat ARKit, Google hat ARCore und Microsoft hat seine eigene HoloLens (und dann gibt es natürlich noch Unity). Und da einige Anwendungen viel öffentliche Aufmerksamkeit erhalten, wird die Entwicklung von Augmented-Reality-Apps zu einer sehr wünschenswerten Fähigkeit für mobile Entwickler.

In diesem Artikel möchte ich eine einfache, aber sinnvolle kleine App demonstrieren, die mehr kann als nur einen rotierenden Würfel. Wer braucht schon rotierende Würfel? Lass uns die Matrix machen.

Einführung in ARKit

ARKit ist ein Apple-Framework zum Erstellen von AR-Apps für iOS-Geräte. Mehrere Renderer können damit verwendet werden: SpriteKit für 2D-Objekte, SceneKit für 3D und Metal, wenn wir einen benutzerdefinierten Renderer implementieren möchten.

Für diese Demo verwenden wir SceneKit, um vollständig gerenderte 3D-Objekte (Messer) zu rendern und zu platzieren.

Bild: Unterscheidung zwischen Renderern

Ab ARKit v2 werden in ARKit fünf Konfigurationstypen unterstützt:

AROrientationTrackingConfiguration – Wenn Sie nur die Ausrichtung des Geräts verfolgen möchten (z. B. für eine Sternkonstellationsanwendung). Bei dieser Konfiguration werden physische Bewegungen wie das Ausweichen zur Seite nicht verfolgt und wirken sich nicht auf die Position oder Richtung der Objekte in der Szene aus.

ARWorldTrackingConfiguration – Dies ist wahrscheinlich die am häufigsten verwendete Konfiguration für AR, da sie das unterstützt, was die meisten Menschen als Augmented Reality bezeichnen würden. Beispiele sind virtuelle Haustier- oder Pokemon-Jagdanwendungen.

ARFaceTrackingConfiguration – Diese Konfiguration wird derzeit nur vom iPhone X unterstützt, da sie eine TrueDepth-Kamera (wie Face ID) erfordert. Diese Konfiguration verfolgt Merkmale auf dem Gesicht und seinen relativen Abstand von einem neutralen Gesichtsausdruck (z. B. eine Anwendung, bei der Benutzer modische Sonnenbrillen ausprobieren können, bevor sie sie bestellen).

ARImageTrackingConfiguration – Wenn Sie eine Reihe von Markierungen haben und Tiere zeigen möchten, die aus der Markierung herausspringen, dann ist diese Konfiguration genau das Richtige für Sie. Das müssen keine kartenähnlichen Markierungen sein, sondern ein beliebiges 2D-Bild. Du könntest deine Kamera auf die Mona Lisa richten, und sie würde ihren Kopf drehen und dir etwas sagen. Ein Nachteil ist, dass Sie vorher sagen müssen, wie groß die physische Größe des Bildmarkers ist.

ARObjectScanningConfiguration – Diese Konfiguration ist die 3D-Version von ARImageTrackingConfiguration.

In dieser Demo fügen wir der Szene Messer und Kugeln hinzu, und wir möchten sechs Freiheitsgrade haben, also ist ARWorldTrackingConfiguration das geeignete Werkzeug.

Das App-Konzept

Jeder, der „Matrix“ gesehen hat, kann sich daran erinnern, wie Neo (Keanu Reeves) Kugeln auswich und sie mitten in der Luft stoppte. Unsere Anwendung hilft uns, diese Szene aus einem Live-Kamera-Feed nachzubilden. So können wir benutzerdefinierte Videos erstellen, die Neo-ähnliche Kräfte demonstrieren.

Unsere App wird 3D-Modelle von Kugeln und Messern haben. Es ist dem Benutzer überlassen, wie viele Kugeln oder Messer er in seinem Film haben möchte. Wenn Sie etwas Zeit investieren und andere Modelle hinzufügen möchten, ist der App-Code Open Source und auf GitHub (https://github.com/altaibayar/toptal_ar_video_maker) verfügbar. Obwohl dies kein vollständiges AR-Tutorial ist, sollten die Demo und die Quelle eine wertvolle Ressource sein, wenn Sie versuchen, in die Entwicklung von AR-Apps auf iOS einzusteigen.

Das beabsichtigte Anwendungsfall-Szenario sieht wie folgt aus:

  1. Lassen Sie einen Freund sich als Neo verkleiden (nicht unbedingt notwendig für das Funktionieren der Anwendung, könnte aber genauso gut dabei gut aussehen).
  2. Bitten Sie „Neo“, etwa 10 Meter von Ihnen entfernt zu stehen.
  3. Starten Sie die Anwendung und scannen Sie die Masseebene.
  4. Fügen Sie Kugeln und Messer hinzu, die auf „Neo“ fliegen.
  5. Halten Sie die Aufnahmetaste gedrückt, um das Video aufzunehmen, während „Neo“ einige coole Moves ausführt, um den Kugeln auszuweichen oder sie zu stoppen
  6. Lassen Sie die Aufnahmetaste los und speichern Sie das Video in Ihrer Bibliothek.

Erstellen der App

Wie bereits erwähnt, möchten wir uns frei bewegen können, während wir die gesamte 360-Grad-Aufnahme der Szene machen, und die Kugeln und Messer die Kamerabewegung angemessen verfolgen lassen.

Zu Demonstrationszwecken haben wir nur zwei Arten von virtuellen Objekten: Messer und Schrotflintenkugeln.

Messer sind detaillierte Objekte und ich verwende das kostenlose Modell von https://poly.google.com/view/3TnnfzKfHrq (Danke Andrew).

Schrotflintenkugeln sind jedoch einfache kugelförmige Objekte, und wir können sie einfach codieren. Wir werden sie zur Abwechslung metallisch und glühend heiß machen. Da wir eine Schrotflinte emulieren, generieren wir sie auch als gruppierte Cluster. Damit das Clustering ohne allzu großen Aufwand Sinn macht, können wir den Gaußschen Zufallszahlengenerator aus dem GamplayKit verwenden.

GameplayKit ist ein nützliches Tool, das immer dann nützlich ist, wenn Sie zufällige Rauschgenerierung, Zustandsmaschinen, KI oder wahrscheinlichkeitsbasierte Entscheidungsfindung benötigen.

 override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }

Eine ähnliche Zufallsversatzlogik kann für die Messer verwendet werden, aber da sie sich nicht wie Cluster verhalten, kann eine einfache Zufallsverteilung verwendet werden.

App-Architektur

Es würde den Rahmen dieser Demo sprengen, sich mit Diskussionen darüber zu befassen, welches Architekturparadigma das beste ist. Es gibt viele Artikel, die sich mit diesem Thema befassen.

Stattdessen werde ich nur die Struktur des Projekts als Leitfaden darlegen, um sich im verlinkten GitHub-Projekt zurechtzufinden: was die Hauptkomponenten sind, wie sie verbunden sind und warum sie ausgewählt wurden.

Die Anwendung hat nur drei Bildschirme:

PermissionViewController – Der Bildschirm, auf dem wir den Benutzer auffordern, der Anwendung Zugriff auf die erforderlichen mobilen Funktionen zu gewähren.

  • Kamera – Offensichtlich
  • Galerie – Zum Speichern aufgezeichneter Video- und Mikrofoneingaben
  • Mikrofon – Die Erlaubnis einer Bibliothek, die ich zum Erstellen des Videos verwende, ist erforderlich (standardmäßig wird der Ton vom Mikrofon als Quelle für eine Audiospur verwendet).

ExportViewController – Dieser Bildschirm zeigt ein aufgezeichnetes Video und bietet die Optionen zum Teilen oder Speichern des Videos.

MainViewController – Hier passiert die ganze Magie.

Meiner Erfahrung nach ist es am besten, alle erforderlichen ARKit-Klassen wie ARSession, ARConfiguration und alle eindeutigen Typen von SCNNode zu verpacken. Auf diese Weise ist der Code selbsterklärend.

ARSession wird in ToptalARSession vererbt, und die neue Sitzungsklasse hat nur drei Methoden: den Klassenkonstruktor, in dem wir alles Erforderliche einrichten, und die Methoden resetTracking und pauseTracking.

Die Anwendung erkennt vier eindeutige Arten von SCNNodes:

  • KnifeNode – Stellt ein Messer-3D-Objekt dar und lädt automatisch ein 3D-Messer als seine Geometrie.
  • BulletsNode – Dieser Knoten repräsentiert eine Reihe von Schrotpatronen. Zufälliges Gaußsches Rauschen, Farben und physikalischer Beleuchtungsmodus werden automatisch eingerichtet.

    In den Klassen, die KnifeNode oder BulletsNode verwenden, ist keine besondere oder zusätzliche Arbeit erforderlich, und sie können als Vorlagen zum Anpassen der Anwendung verwendet werden, um weitere Arten von 3D-Objekten hinzuzufügen.

  • ReticleNode – Umschließt ein 3D-Modell, das in der Szene über dem Boden erscheint, um anzuzeigen, wo Messer oder Kugeln hinzugefügt werden.
  • DirectionalLightNode – Dies ist ein Knoten, der ein vertikales Licht darstellt, das nach unten zeigt.

Referenzen und Credits

Messermodell: https://poly.google.com/view/3TnnfzKfHrq

Aufnahme von SCNScene: https://github.com/svtek/SceneKitVideoRecorder

Schaltflächensymbole, ARKit-Demoanwendung: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality