Table of Contents

Benutzerdefinierte Kamera in Unity - Externe Frame-Datenquelle

Über die externe Frame-Datenquelle (ExternalFrameSource) können Entwickler EasyAR Sense um eine benutzerdefinierte Kameraimplementierung erweitern, um bestimmte Headset-Geräte oder andere Eingabegeräte zu unterstützen. Im Folgenden werden die Typstruktur und die Schnittstellendefinitionen der externen Frame-Datenquelle beschrieben.

Vor Beginn

  • Verstehen Sie die grundlegenden Konzepte von custom camera.
  • Verstehen Sie die grundlegenden Konzepte, Typen und die Auswahlmethode zur Laufzeit von frame source.

Typen externer 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.

Abhängig von den Eingabedaten können externe Frame-Datenquellen in zwei Hauptkategorien unterteilt werden:

  • Erweiterung für Bild- und Gerätebewegungsdaten
    • Implementiert durch Vererbung von ExternalDeviceMotionFrameSource: Das Gerät und das Geräte-SDK stellen 6DoF-Motion-Tracking bereit. Die Transform der virtuellen Kamera und weitere Steuerungen werden vom Geräte-SDK übernommen.
    • Implementiert durch Vererbung von ExternalDeviceRotationFrameSource: Das Gerät und das Geräte-SDK stellen 3DoF-Rotationstracking bereit. Die Transform der virtuellen Kamera und weitere Steuerungen werden vom Geräte-SDK übernommen.
  • Erweiterung für Bilddaten
    • Implementiert durch Vererbung von ExternalImageStreamFrameSource: Liefert nur Bildeingaben. Die Transform der virtuellen Kamera und weitere Steuerungen werden von EasyAR übernommen.

Bei der Integration dieser externen Frame-Datenquellen unterscheiden sich die verfügbaren AR-Funktionen:

  • Erweiterung für Bild- und Gerätebewegungsdaten ExternalDeviceMotionFrameSource
    • Mega
    • Motion tracking (vom Gerät selbst bereitgestellt)
    • Sparse spatial map
    • Dense spatial map
    • Image tracking (mit motion fusion)
    • Cloud image recognition
    • Object tracking (mit motion fusion)
  • Erweiterung für Bild- und Gerätebewegungsdaten ExternalDeviceRotationFrameSource
    • Mega
    • Image tracking (ohne motion fusion)
    • Cloud image recognition
    • Object tracking (ohne motion fusion)
  • Erweiterung für Bilddaten ExternalImageStreamFrameSource
    • Image tracking (ohne motion fusion)
    • Cloud image recognition
    • Object tracking (ohne motion fusion)

Schnittstellendefinition der externen Frame-Datenquelle

Beim Erstellen einer externen Frame-Datenquelle müssen die relevanten Schnittstellen implementiert werden. Die Definitionen dieser Schnittstellen und ihre Verwendung werden im Folgenden beschrieben.

Gerätedefinition

  • FrameSource.IsHMD: Defines whether it is a head-mounted display Nur auf Headset-Geräten auf true setzen. Wenn es sich um ein Headset handelt, werden Diagnoseinformationen auf einer 3D-Tafel vor der Kamera statt auf dem Bildschirm angezeigt. Einige AR-Funktionen verhalten sich auf Headset-Geräten leicht anders.
  • FrameSource.Display: Defines the display system Liefert Informationen wie die Rotation des aktuellen Displays. Verwenden Sie Display.DefaultSystemDisplay oder Display.DefaultHMDDisplay, um Standardanzeigeinformationen zu erhalten. Auf Headset-Geräten kann normalerweise Display.DefaultHMDDisplay verwendet werden.

Keine zusätzlichen Einstellungen.

Verfügbarkeit

  • FrameSource.IsAvailable: Availability Dient dazu zu bestimmen, ob die Frame-Datenquelle verwendbar ist. Wenn eine Frame-Datenquelle auf dem aktuellen Laufzeitgerät oder in der Umgebung nicht verfügbar ist, sollte dieser Wert false sein. Wenn dieser Wert Optional<bool>.Empty entspricht, wird die Coroutine FrameSource.CheckAvailability() aufgerufen. FrameSource.IsAvailable sollte vor dem Ende der Coroutine aktualisiert werden. Die Verfügbarkeitsprüfung wird während der Sitzungszusammenstellung verwendet. Nicht verfügbare Komponenten werden nicht ausgewählt und ihre Methoden werden während der Laufzeit nicht aufgerufen.
  • FrameSource.CheckAvailability() (optional): Coroutine to check the availability of the frame source Wird aufgerufen, wenn FrameSource.IsAvailable Optional<bool>.Empty entspricht. Der Zusammenstellungsprozess der Sitzung wird blockiert, bis diese Coroutine endet.

Sitzungsursprung

  • ExternalDeviceFrameSource.OriginType: Origin type
    • 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 automatisch ausgewählt oder aus der Szene erstellt, bewegt sich aber nicht. Die Sitzung unterstützt dann nur den SessionOrigin-Center-Modus. Anwendungsentwickler müssen sehr sorgfältig mit der Platzierung virtueller Objekte umgehen, da sich alle Ziele und Inhalte unter den Zielen immer im Unity-Koordinatensystem bewegen und einige Benutzerinhalte (z. B. Physiksysteme) nicht korrekt funktionieren. Objekte, die im Unity-Weltkoordinatensystem platziert werden, erscheinen unter keiner Konfiguration an der richtigen Position.
  • ExternalDeviceFrameSource.Origin: Origin object Definieren Sie Ihren eigenen Ursprung nur dann, wenn ExternalDeviceFrameSource.OriginType auf Custom gesetzt ist. Andernfalls ist keine Neudefinition erforderlich.

Virtuelle Kamera

  • FrameSource.Camera: Virtual Camera Die Kamera wird nicht von der Sitzung gesteuert. Transform und Projektionsmatrix der Kamera sowie die Hintergrunddarstellung des Bildes sollten vom externen Code gesteuert werden. Diese Kamera wird auf Headset-Geräten nur verwendet, um Diagnoseinformationen vor den Augen anzuzeigen. Wenn ExternalDeviceFrameSource.OriginType XROrigin ist, ist keine Definition erforderlich. EasyAR verwendet automatisch die im Unity-XR-Framework definierte Kamera.

Physische Kamera

  • FrameSource.DeviceCameras: Physical camera parameters Physische Kameras, die Kamera-Frame-Daten liefern. Wenn Kamera-Frame-Daten von mehreren Kameras bereitgestellt werden, muss die Liste alle physischen Kameras enthalten. Stellen Sie sicher, dass die korrekten Parameter der physischen Kamera abgerufen werden können, wenn FrameSource.CameraFrameStarted true ist.
  • FrameSource.CameraFrameStarted: Whether camera frame input has started Gibt true zurück, nachdem die physische Kamera bereit ist und Daten an EasyAR liefern kann, und false, nachdem die physische Kamera stoppt. Wenn FrameSource.CameraFrameStarted false ist, funktioniert EasyAR nicht. Wenn FrameSource.CameraFrameStarted true ist, stellen Sie sicher, dass die Daten von FrameSource.DeviceCameras zugänglich sind und fortlaufend Kamera-Frames an EasyAR liefern. Wenn EasyAR über längere Zeit keine Kamera-Frames empfängt, wird eine Warnung ausgegeben, um die Ursachenanalyse zu erleichtern.

Die Parameter der physischen Kamera müssen mit der realen Gerätekamera übereinstimmen.

Sitzungsstart und -stopp

  • FrameSource.OnSessionStart(ARSession): Handle session startup event Wirksam, wenn diese Frame-Datenquelle während der Sitzungszusammenstellung ausgewählt wurde. Kann für Lazy Initialisierung verwendet werden; führen Sie AR-spezifische Initialisierungsschritte hier aus.
  • FrameSource.OnSessionStop(): Handle session shutdown event Wirksam, wenn diese Frame-Datenquelle während der Sitzungszusammenstellung ausgewählt wurde. Kann Ressourcen zerstören, die in FrameSource.OnSessionStart(ARSession) und während des Sitzungsbetriebs erstellt wurden, und den internen Zustand wiederherstellen. Diese Methode wird garantiert vor der Zerstörung der Sitzung aufgerufen. Wenn die Frame-Datenquelle vor der Sitzung zerstört wird, wird diese Methode nicht aufgerufen und die Sitzung wechselt in den Broken-Zustand.

Eingabe von Frame-Daten

  • ExternalFrameSource.TryAcquireBuffer(int): Attempt to acquire a memory block from the memory pool Dieser Speicherblock wird normalerweise zum Speichern von Bilddaten für Kamera-Frames und deren Übergabe an EasyAR verwendet.
  • ExternalFrameSource.ReceivedFrameCount: Number of camera frames received by EasyAR EasyAR verwendet dies, um den Zustand der Geräte-Kameraeingabe zu überwachen. Kann zur Fehlerbehebung verwendet werden; wenn dieser Wert nicht mehr steigt, bedeutet dies meist, dass das Gerät keine Daten mehr an EasyAR liefert.

Unity-Nachrichten

Wenn Sie die folgenden Nachrichten in Skripten verwenden, stellen Sie sicher, dass die Implementierungen der Basisklasse aufgerufen werden:

Nächste Schritte

Verwandte Themen