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
- Verstehen sie die grundkonzepte der benutzerdefinierte kamera.
- Verstehen sie die grundkonzepte, typen sowie auswahlmethoden zur laufzeit der frame-datenquelle.
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 Wertfalsesein.
Wenn dieser Wert gleichOptional<bool>.Emptyist, 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 gleichOptional<bool>.Emptyist. 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.DeviceCameras:
Physikalische 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.CameraFrameStarted:
Kamerabild-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.
- FrameSourceCamera.CameraType:
Physikalischer Kameratyp
Im Allgemeinen für nicht-frontale Kameras, z.B. bei Head-Mounted-Displays, wählen Sie die hintere Kamera. - FrameSourceCamera.CameraOrientation:
Rotationswinkel im Uhrzeigersinn, um das Kamerabild in der natürlichen Geräteausrichtung anzuzeigen
Bereich [0, 360). - FrameSourceCamera.FrameSize:
Bildgröße - FrameSourceCamera.FrameRateRange:
Bildrate-Bereich
x definiert die untere Grenze, y die obere Grenze des Bildratenbereichs. - DeviceFrameSourceCamera.AxisSystem:
Koordinatensystem für Head/Kamera-Pose und extrinsische Kameraparameter
Alle Matrizen müssen dasselbe Koordinatensystem verwenden. Falls die verwendeten Daten einem unbekannten System entsprechen, muss vor der Übergabe an EasyAR eine Koordinatentransformation durchgeführt werden. - DeviceFrameSourceCamera.Extrinsics:
Extrinsische Kameraparameter
Typischerweise eine kalibrierte Matrix. Ihr Koordinatensystem sollte der Definition in DeviceFrameSourceCamera.AxisSystem entsprechen. Falls das Koordinatensystem der extrinsischen Parameter sich von dem der tatsächlichen Pose unterscheidet oder nicht der Definition in DeviceFrameSourceCamera.AxisSystem entspricht, muss vor dem Setzen dieses Wertes eine Koordinatentransformation durchgeführt werden.
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
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Eingabe von kamerarahmendatenExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Eingabe von kamerarahmendaten
Kann in jedem thread aufgerufen werden, solange die device-SDK-APIs thread-sicher sind.
Diese daten müssen mit den daten des physikalischen kamerasensors bei der belichtung übereinstimmen. Empfohlen wird die eingabe von daten mit 30 oder 60 fps. Die minimal akzeptable bildrate beträgt 2, aber einige algorithmenreaktionszeiten sind betroffen. Es wird empfohlen, farbdaten einzugeben, wenn verfügbar, da dies die mega-effekte verbessert.
Für optimale effizienz kann die datenpipeline so gestaltet werden, dass rohe YUV-daten direkt über shared memory durchgereicht werden, der datenzeiger direkt an easyar übergeben wird, und die dateneigentümerschaft beachtet wird.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Eingabe von renderrahmen-datenExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Eingabe von renderrahmen-daten
Muss bei jedem renderframe aufgerufen werden, nachdem gerätedaten bereit sind, ohne frames zu überspringen. Diese daten müssen mit den daten übereinstimmen, die die virtuelle unity-kamera im selben frame steuern.
- 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
- Lesen Sie external-input-frame.md, um mehr über Kamerarahmendaten und Rendering-Rahmendaten zu erfahren
- Erstellen Sie eine Erweiterung für Bild- und Gerätebewegungsdaten-Eingabe
- Erstellen Sie eine Bilderfassungserweiterung