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 displayNur auf Headset-Geräten auftruesetzen. 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 systemLiefert 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:
AvailabilityDient 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 Wertfalsesein. Wenn dieser WertOptional<bool>.Emptyentspricht, 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 sourceWird aufgerufen, wenn FrameSource.IsAvailableOptional<bool>.Emptyentspricht. 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 objectDefinieren Sie Ihren eigenen Ursprung nur dann, wenn ExternalDeviceFrameSource.OriginType auf Custom gesetzt ist. Andernfalls ist keine Neudefinition erforderlich.
Virtuelle Kamera
- FrameSource.Camera:
Virtual CameraDie 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 parametersPhysische 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.CameraFrameStartedtrueist. - FrameSource.CameraFrameStarted:
Whether camera frame input has startedGibttruezurück, nachdem die physische Kamera bereit ist und Daten an EasyAR liefern kann, undfalse, nachdem die physische Kamera stoppt. Wenn FrameSource.CameraFrameStartedfalseist, funktioniert EasyAR nicht. Wenn FrameSource.CameraFrameStartedtrueist, 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.
- FrameSourceCamera.CameraType:
Physical camera typeFür Nicht-Frontkameras wird in der Regel die Rückkamera gewählt, z. B. auf Headsets. - FrameSourceCamera.CameraOrientation:
Clockwise rotation angle required to display physical camera image in device's natural orientationBereich [0, 360). - FrameSourceCamera.FrameSize:
Image size - FrameSourceCamera.FrameRateRange:
Frame rate rangeDefinieren Sie x als Untergrenze und y als Obergrenze des Bildratenbereichs. - DeviceFrameSourceCamera.AxisSystem:
Coordinate axis system used for head/physical camera pose and physical camera extrinsicsAlle Matrizen müssen dasselbe Koordinatenachsensystem verwenden. Wenn die Datendefinition keinem bekannten System entspricht, führen Sie vor der Übergabe an EasyAR eine Koordinatentransformation durch. - DeviceFrameSourceCamera.Extrinsics:
Physical camera extrinsicsMeist kalibrierte Matrizen. Ihre Koordinatenachsen sollten der Definition von DeviceFrameSourceCamera.AxisSystem entsprechen. Wenn sich die Koordinatenachsen der Extrinsics von den tatsächlichen Posedefinitionen unterscheiden oder DeviceFrameSourceCamera.AxisSystem verletzen, führen Sie vor dem Setzen dieses Wertes eine Koordinatentransformation durch.
Sitzungsstart und -stopp
- FrameSource.OnSessionStart(ARSession):
Handle session startup eventWirksam, 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 eventWirksam, 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
- ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Input camera frame data - ExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Input camera frame dataKann aus jedem Thread aufgerufen werden, solange die Geräte-SDK-APIs thread-sicher sind. Diese Daten müssen dem Zeitpunkt entsprechen, an dem der physische Kamerasensor belichtet wurde. Es wird empfohlen, Daten mit 30 oder 60 fps einzuspeisen. Die minimale akzeptable Bildrate beträgt 2, aber einige Antwortzeiten der Algorithmen werden dadurch beeinflusst. Es wird empfohlen, nach Möglichkeit Farbdaten einzuspeisen, da dies die Mega-Leistung verbessert. Für optimale Effizienz sollte die gesamte Datenkette rohe YUV-Daten direkt über Shared Memory weitergeben, den Datenzeiger direkt an EasyAR übergeben und auf die Datenverantwortlichkeit achten. - ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Input render frame data - ExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Input render frame dataMuss in jedem Render-Frame nach Verfügbarkeit der Gerätedaten ohne Frame-Auslassung aufgerufen werden. Diese Daten müssen den Daten entsprechen, die die aktuelle Unity-virtuelle Kamera innerhalb desselben Frames antreiben.
- ExternalFrameSource.TryAcquireBuffer(int):
Attempt to acquire a memory block from the memory poolDieser 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 EasyAREasyAR 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
- Lesen Sie Externe Input-Frame-Daten, um Kamera-Frame-Daten und Rendering-Frame-Daten kennenzulernen
- Erstellen Sie eine Erweiterung für Bild- und Gerätebewegungsdaten
- Erstellen Sie eine Erweiterung für Bilddaten