Implementación personalizada de cámara en Unity —— Fuente de datos de fotogramas externa
Mediante la fuente de datos de fotogramas externa (ExternalFrameSource), los desarrolladores pueden extender la implementación de cámara de EasyAR Sense para admitir dispositivos de visualización montados en la cabeza (HMD) específicos u otros dispositivos de entrada. El siguiente contenido describe la estructura de tipos y las definiciones de interfaz de la fuente de datos de fotogramas externa.
Antes de comenzar
- Comprender los conceptos básicos de cámara personalizada.
- Comprender los conceptos básicos, tipos y métodos de selección en tiempo de ejecución de un origen de datos de fotogramas.
Tipos de fuente de datos de fotogramas externos
---
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
El diagrama anterior muestra la estructura de tipos de fuentes de datos de fotogramas externos.
Según los diferentes datos de entrada, las fuentes de datos de fotogramas externos se pueden dividir en dos categorías principales:
- Extensión de entrada de datos de imagen y movimiento del dispositivo
- Implementado mediante la herencia de ExternalDeviceMotionFrameSource: El dispositivo y el SDK del dispositivo proporcionan funciones de seguimiento de movimiento de 6DoF. La transformación de la cámara virtual y otros controles son realizados por el SDK del dispositivo.
- Implementado mediante la herencia de ExternalDeviceRotationFrameSource: El dispositivo y el SDK del dispositivo proporcionan funciones de seguimiento de rotación de 3DoF. La transformación de la cámara virtual y otros controles son realizados por el SDK del dispositivo.
- Extensión de entrada de imagen
- Implementado mediante la herencia de ExternalImageStreamFrameSource: Solo proporciona entrada de imagen. La transformación de la cámara virtual y otros controles son realizados por EasyAR.
Al acceder a estos tipos de fuentes de datos de fotogramas externos, las funciones AR disponibles pueden variar:
- Extensión de entrada de datos de imagen y movimiento del dispositivo ExternalDeviceMotionFrameSource
- Mega
- Seguimiento de movimiento (proporcionado por el propio dispositivo)
- Mapa espacial disperso
- Mapa espacial denso
- Seguimiento de imagen (admite fusión de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (admite fusión de movimiento)
- Extensión de entrada de datos de imagen y movimiento del dispositivo ExternalDeviceRotationFrameSource
- Mega
- Seguimiento de imagen (no admite fusión de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (no admite fusión de movimiento)
- Extensión de entrada de imagen ExternalImageStreamFrameSource
- Seguimiento de imagen (no admite fusión de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (no admite fusión de movimiento)
Definición de interfaz de fuente de datos de marco externo
Al crear una fuente de datos de marco externo, se deben implementar las interfaces relevantes. A continuación se describen las definiciones de estas interfaces y los métodos de uso.
Definición del dispositivo
FrameSource.IsHMD:
Define si es un dispositivo HMD
Se establece en true únicamente en dispositivos HMD.
Si el dispositivo es HMD, la información de diagnóstico se mostrará en un panel 3D frente a la cámara en lugar de en la pantalla. Algunas funciones de AR funcionan ligeramente diferente en dispositivos HMD.FrameSource.Display:
Define el sistema de visualización
Proporciona información como la rotación de la visualización actual.
Puede usar Display.DefaultSystemDisplay o Display.DefaultHMDDisplay para obtener la información de visualización predeterminada.
Normalmente en HMD puede usarse Display.DefaultHMDDisplay.
Sin configuraciones adicionales.
Disponibilidad
- FrameSource.IsAvailable:
Disponibilidad (Availability)
Se utiliza para determinar si la fuente de frames (frame source) se puede utilizar.
Si una fuente de frames no está disponible en el dispositivo actual o entorno de ejecución, este valor debe serfalse.
Si este valor es igual aOptional<bool>.Empty, se llamará a la corrutina FrameSource.CheckAvailability(). Se debe actualizar FrameSource.IsAvailable antes de que finalice la corrutina.
La interfaz de disponibilidad se utiliza durante el ensamblaje de la sesión (session). Los componentes no disponibles no serán seleccionados y sus métodos no serán llamados durante la ejecución de la sesión. - FrameSource.CheckAvailability() (Opcional):
Corrutina para comprobar si la fuente de frames está disponible
Se llama cuando FrameSource.IsAvailable es igual aOptional<bool>.Empty. El proceso de ensamblaje de la sesión se bloqueará hasta que finalice esta corrutina.
Origen de sesión
ExternalDeviceFrameSource.OriginType:
Tipo de origen- XROrigin: El SDK del dispositivo usa Unity.XR.CoreUtils.XROrigin como origen.
- Custom: El SDK del dispositivo usa un origen personalizado. Especifica ExternalDeviceFrameSource.Origin.
- None: El SDK del dispositivo no define un origen.
El origen se seleccionará o creará automáticamente desde la escena, pero no se moverá.
La sesión solo admitirá el modo de centro SessionOrigin. Los desarrolladores deben tener mucho cuidado al colocar objetos virtuales, ya que todos los objetivos y su contenido siempre se moverán en el sistema de coordenadas de Unity, y parte del contenido del usuario (como el sistema físico) no funcionará correctamente. Los objetos colocados en el sistema de coordenadas mundial de Unity nunca se mostrarán en la posición correcta en ninguna configuración.
ExternalDeviceFrameSource.Origin:
Objeto de origen
Define tu propio origen solo cuando ExternalDeviceFrameSource.OriginType es Custom. No es necesario redefinirlo en otros casos.
Cámara virtual
- FrameSource.Camera:
Cámara virtual
La cámara no está controlada por la sesión. La transform de la cámara, la matriz de proyección y la representación del fondo de imagen deben ser controlados por código externo.
Solo se utiliza en dispositivos montados en la cabeza para superponer texto de diagnóstico en la vista.
No es necesario definirlo cuando ExternalDeviceFrameSource.OriginType es XROrigin, EasyAR usará automáticamente la cámara definida en el marco de XR de Unity.
Cámara física
- FrameSource.DeviceCameras:
Parámetros de la cámara física
Cámara física que proporciona datos de fotogramas. Si los datos proceden de múltiples cámaras, la lista debe incluir todas.
Debe garantizarse que los parámetros sean accesibles cuando FrameSource.CameraFrameStarted sea true. - FrameSource.CameraFrameStarted:
Si la entrada de fotogramas de la cámara ha comenzado
Devuelve true cuando la cámara física está lista para enviar datos a EasyAR, y false cuando se detiene. Cuando es false, EasyAR no funciona. Cuando es true, debe garantizarse acceso continuo a FrameSource.DeviceCameras y un flujo constante de fotogramas. EasyAR emitirá advertencias si detecta interrupciones prolongadas.
Los parámetros de la cámara física deben coincidir con los del dispositivo real.
- FrameSourceCamera.CameraType:
Tipo de cámara física
Para casos no frontales (ej: dispositivos montados en cabeza), seleccione cámara trasera. - FrameSourceCamera.CameraOrientation:
Rotación horaria requerida para mostrar la imagen en orientación natural del dispositivo
Rango: [0, 360). - FrameSourceCamera.FrameSize:
Tamaño de imagen - FrameSourceCamera.FrameRateRange:
Rango de tasa de fotogramas
Define x como límite inferior e y como límite superior. - DeviceFrameSourceCamera.AxisSystem:
Sistema de coordenadas para pose de cámara física y parámetros extrínsecos
Todas las matrices deben usar el mismo sistema. Si los datos no coinciden, aplique transformaciones antes de enviar a EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Parámetros extrínsecos de la cámara física
Generalmente matrices calibradas. Su sistema de coordenadas debe alinearse con DeviceFrameSourceCamera.AxisSystem. Si difiere, transforme antes de asignar.
Sesión inicio y detención
- FrameSource.OnSessionStart(ARSession):
Maneja el evento de inicio de sesión
Válido cuando se selecciona este frame source durante el montaje de la sesión.
Puede usarse para inicialización diferida, realizando trabajos de inicialización específicos de AR en este método. - FrameSource.OnSessionStop():
Maneja el evento de detención de sesión
Válido cuando se selecciona este frame source durante el montaje de la sesión.
Puede destruir recursos creados en FrameSource.OnSessionStart(ARSession) o durante la ejecución de la sesión, y restaurar el estado interno en este método. Se garantiza que este método será llamado antes de la destrucción de la sesión. Si el frame source se destruye antes que la sesión, este método no será llamado y la sesión entrará en estado Broken.
Entrada de frames
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Introducir datos de frame de cámaraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Introducir datos de frame de cámara
Puede llamarse en cualquier hilo siempre que las API del SDK del dispositivo sean seguras para hilos.
Estos datos deben coincidir con los datos en el momento de la exposición del sensor físico de la cámara. Se recomienda introducir datos a 30 o 60 fps. La velocidad de frames mínima aceptable es 2, pero el tiempo de respuesta de algunos algoritmos se verá afectado. Siempre que esté disponible, se recomienda introducir datos en color, lo que ayuda al efecto de Mega.
Para una máxima eficiencia, puede diseñarse la cadena de datos para que los datos YUV crudos pasen directamente a través de memoria compartida, pasando el puntero de datos directamente a EasyAR, y prestando atención a la propiedad de los datos.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Introducir datos de frame de renderizadoExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Introducir datos de frame de renderizado
Debe asegurarse de llamarse en cada frame de renderizado después de que los datos del dispositivo estén listos, sin saltar frames. Estos datos deben coincidir con los que impulsan la cámara virtual Unity actual dentro del mismo frame.
- ExternalFrameSource.TryAcquireBuffer(int):
Intentar adquirir un bloque de memoria del pool
Este bloque de memoria se suele usar para almacenar los datos de imagen del frame de la cámara e introducirlos en EasyAR. - ExternalFrameSource.ReceivedFrameCount:
Recuento de frames de cámara recibidos por EasyAR
EasyAR lo usa para comprobar la salud de la entrada de frames de cámara del dispositivo. Puede usarse durante la depuración; si este valor deja de aumentar, normalmente indica que el dispositivo ha dejado de introducir datos en EasyAR.
Mensajes de Unity
Al utilizar los siguientes mensajes en scripts, es importante asegurarse de que se llame a la implementación de la clase base:
Próximos pasos
- Leer Datos de fotograma de entrada externa para comprender los datos de fotograma de cámara y renderizado
- Crear una Extensión de entrada de datos de imagen y movimiento del dispositivo
- Crear una Extensión de entrada de imagen