Table of Contents

Benutzerdefinierte Kameraimplementierung in Unity – Externe Frame-Datenquelle

Mit der externen Frame-Datenquelle (ExternalFrameSource) können Entwickler eine benutzerdefinierte Kameraimplementierung für EasyAR Sense erweitern, um bestimmte Head-Mounted-Displays oder andere Eingabegeräte zu unterstützen. Der folgende Inhalt beschreibt die Typenstruktur und Schnittstellendefinition der externen Frame-Datenquelle.

Bevor sie beginnen

Typen von externen frame-datenquellen

---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
  class FrameSource {
    <<abstract>>
  }
  class ExternalFrameSource {
    <<abstract>>
  }
  class ExternalDeviceFrameSource  {
    <<abstract>>
  }
  class ExternalDeviceMotionFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalDeviceRotationFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalImageStreamFrameSource:::EasyAR {
    <<abstract>>
  }

  ExternalFrameSource --|> FrameSource
  ExternalDeviceFrameSource --|> ExternalFrameSource
  ExternalDeviceMotionFrameSource --|> ExternalDeviceFrameSource
  ExternalDeviceRotationFrameSource --|> ExternalDeviceFrameSource
  ExternalImageStreamFrameSource --|> ExternalFrameSource
  
  classDef EasyAR fill:#6e6ce6,stroke:#333,color:#fff

Die obige Abbildung zeigt die Typstruktur externer Frame-Datenquellen.

Basierend auf den Eingabedaten können externe Frame-Datenquellen in zwei Hauptkategorien unterteilt werden:

  • Erweiterung für Bild- und Gerätebewegungsdaten-Eingabe
    • Implementiert durch Vererbung von ExternalDeviceMotionFrameSource: Das Gerät und das Geräte-SDK bieten 6DoF-Bewegungsverfolgung. Die Transformation der virtuellen Kamera und andere Steuerungen werden vom Geräte-SDK übernommen.
    • Implementiert durch Vererbung von ExternalDeviceRotationFrameSource: Das Gerät und das Geräte-SDK bieten 3DoF-Rotationsverfolgung. Die Transformation der virtuellen Kamera und andere Steuerungen werden vom Geräte-SDK übernommen.
  • Erweiterung für Bildeingabe
    • Implementiert durch Vererbung von ExternalImageStreamFrameSource: Bietet nur Bildeingabe. Die Transformation der virtuellen Kamera und andere Steuerungen werden von EasyAR übernommen.

Bei der Verwendung dieser externen Frame-Datenquellen stehen unterschiedliche AR-Funktionen zur Verfügung:

  • Erweiterung für Bild- und Gerätebewegungsdaten-Eingabe ExternalDeviceMotionFrameSource
    • Mega
    • Bewegungsverfolgung (vom Gerät selbst bereitgestellt)
    • Sparse Spatial Map
    • Dense Spatial Map
    • Bildverfolgung (unterstützt Bewegungsfusion)
    • Cloud-Erkennung von Bildern
    • Objektverfolgung (unterstützt Bewegungsfusion)
  • Erweiterung für Bild- und Gerätebewegungsdaten-Eingabe ExternalDeviceRotationFrameSource
    • Mega
    • Bildverfolgung (unterstützt keine Bewegungsfusion)
    • Cloud-Erkennung von Bildern
    • Objektverfolgung (unterstützt keine Bewegungsfusion)
  • Erweiterung für Bildeingabe ExternalImageStreamFrameSource
    • Bildverfolgung (unterstützt keine Bewegungsfusion)
    • Cloud-Erkennung von Bildern
    • Objektverfolgung (unterstützt keine Bewegungsfusion)

Externe frame-datenquelle schnittstellen-definition

Beim erstellen einer externen frame-datenquelle müssen die relevanten schnittstellen implementiert werden. Im folgenden werden die definition und verwendung dieser schnittstellen beschrieben.

Gerätedefinition

  • FrameSource.IsHMD: Definiert, ob es sich um ein Head-Mounted-Display handelt
    Nur auf Head-Mounted-Display-Geräten auf true gesetzt.
    Wenn das Gerät ein Head-Mounted-Display ist, werden Diagnoseinformationen auf einer 3D-Platine vor der Kamera statt auf dem Bildschirm angezeigt. Einige AR-Funktionen arbeiten auf Head-Mounted-Display-Geräten leicht unterschiedlich.

  • FrameSource.Display: Definiert das Anzeigesystem
    Stellt Informationen wie die aktuelle Anzeigerotation bereit.
    Kann Display.DefaultSystemDisplay oder Display.DefaultHMDDisplay verwenden, um Standardanzeigeinformationen abzurufen. Normalerweise kann Display.DefaultHMDDisplay auf Head-Mounted-Displays verwendet werden.

Keine zusätzlichen Einstellungen.

Verfügbarkeit

  • FrameSource.IsAvailable: Verfügbarkeit (Availability)
    Dient zur Überprüfung, ob die Frame-Source verwendet werden kann.
    Wenn eine Frame-Source auf dem aktuellen Gerät oder in der aktuellen Laufzeitumgebung nicht verfügbar ist, sollte dieser Wert false sein.
    Wenn dieser Wert gleich Optional<bool>.Empty ist, wird die FrameSource.CheckAvailability()-Coroutine aufgerufen. FrameSource.IsAvailable sollte aktualisiert werden, bevor die Coroutine endet.
    Die Verfügbarkeitsschnittstelle wird während der Session-Zusammenstellung verwendet; nicht verfügbare Komponenten werden nicht ausgewählt und ihre Methoden werden während des Session-Betriebs nicht aufgerufen.
  • FrameSource.CheckAvailability() (optional): Coroutine zum Überprüfen der Verfügbarkeit der Frame-Source
    Wird aufgerufen, wenn FrameSource.IsAvailable gleich Optional<bool>.Empty ist. Der Prozess der Session-Zusammenstellung wird blockiert, bis diese Coroutine endet.

Session-Ursprung

  • ExternalDeviceFrameSource.OriginType: Ursprungstyp

    • XROrigin: Das Geräte-SDK verwendet Unity.XR.CoreUtils.XROrigin als Ursprung.
    • Custom: Das Geräte-SDK verwendet einen benutzerdefinierten Ursprung.
      ExternalDeviceFrameSource.Origin muss angegeben werden.
    • None: Das Geräte-SDK definiert keinen Ursprung.
      Der Ursprung wird dann automatisch aus der Szene ausgewählt oder erstellt, bewegt sich jedoch nicht.
      Die Session unterstützt nur den SessionOrigin-Zentrumsmodus. Anwendungsentwickler müssen sehr vorsichtig sein, wie sie virtuelle Objekte platzieren, da alle Ziele und darunterliegende Inhalte sich stets im Unity-Koordinatensystem bewegen. Bestandteile wie das Physiksystem funktionieren nicht korrekt. Alle Objekte, die im Unity-Weltkoordinatensystem platziert werden, können unter keiner Konfiguration korrekt angezeigt werden.
  • ExternalDeviceFrameSource.Origin: Ursprungsobjekt
    Nur definieren, wenn ExternalDeviceFrameSource.OriginType auf Custom gesetzt ist. In anderen Fällen nicht erforderlich.

Virtuelle Kamera

  • FrameSource.Camera: Virtuelle Kamera
    Die Kamera wird nicht von der Session gesteuert. Die transform und Projektionsmatrix der Kamera sowie das Rendering des Bildhintergrunds sollten durch externen Code gesteuert werden.
    Nur auf Head-Mounted Displays wird diese Kamera verwendet, um einige Diagnosetext vor den Augen anzuzeigen.
    Bei ExternalDeviceFrameSource.OriginType als XROrigin ist keine Definition erforderlich. EasyAR verwendet automatisch die in Unity XR Framework definierte Kamera.

Physikalische Kamera

  • FrameSource.DeviceCamerasPhysikalische Kamera-Parameter
    Liefert die physikalische(n) Kamera(s), die Kamerabilddaten liefern. Wenn die Daten von mehreren Kameras stammen, muss die Liste alle physikalischen Kameras enthalten.
    Es muss sichergestellt werden, dass die korrekten physikalischen Kamera-Parameter abrufbar sind, wenn FrameSource.CameraFrameStarted true ist.
  • FrameSource.CameraFrameStartedKamerabild-Eingabe gestartet
    Gibt true zurück, nachdem die physikalische Kamera bereit ist und Daten an EasyAR liefern kann. Gibt false zurück, nachdem die physikalische Kamera gestoppt wurde. Wenn FrameSource.CameraFrameStarted false ist, arbeitet EasyAR nicht. Wenn FrameSource.CameraFrameStarted true ist, muss sichergestellt werden, dass auf FrameSource.DeviceCameras zugegriffen werden kann und kontinuierlich Kamerabilddaten an EasyAR gesendet werden. Wenn EasyAR feststellt, dass über einen längeren Zeitraum keine Kamerabilddaten eingehen, wird eine Warnung ausgegeben, um dem Benutzer bei der Problemdiagnose zu helfen.

Die physikalischen Kamera-Parameter müssen mit denen der echten Gerätekamera übereinstimmen.

Session start und stop

  • FrameSource.OnSessionStart(ARSession)Verarbeitet das Session-Start-Ereignis
    Wirksam, wenn diese Frame-Quelle während der Session-Initialisierung ausgewählt wurde.
    Kann für verzögerte Initialisierung verwendet werden; führt AR-spezifische Initialisierungsarbeiten in dieser Methode durch.
  • FrameSource.OnSessionStop()Verarbeitet das Session-Stop-Ereignis
    Wirksam, wenn diese Frame-Quelle während der Session-Initialisierung ausgewählt wurde.
    Kann verwendet werden, um in FrameSource.OnSessionStart(ARSession) erstellte Ressourcen sowie während der Session-Laufzeit erstellte Ressourcen zu zerstören und den internen Status wiederherzustellen. Diese Methode wird garantiert aufgerufen, bevor die Session zerstört wird. Wenn die Frame-Quelle vor der Session zerstört wird, wird sie nicht aufgerufen, und die Session wechselt in den Zustand Broken.

Eingaberahmen

  • ExternalFrameSource.TryAcquireBuffer(int): Versuch, einen speicherblock aus dem speicherpool zu erhalten
    Dieser speicherblock wird typischerweise zum speichern von bilddaten des kamerarahmens verwendet, die an easyar übergeben werden.
  • ExternalFrameSource.ReceivedFrameCount: Anzahl der von easyar empfangenen kamerarahmen
    Easyar nutzt dies, um die gesundheit der kamerarahmeneingabe vom gerät zu überprüfen. Kann beim debugging verwendet werden; wenn dieser wert nicht mehr ansteigt, deutet dies normalerweise darauf hin, dass das gerät die dateneingabe an easyar gestoppt hat.

Unity nachrichten

In skripten müssen bei verwendung der folgenden nachrichten die basisklassenimplementierungen aufgerufen werden:

Nächste Schritte

Verwandte themen