Table of Contents

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

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 ser false.
    Si este valor es igual a Optional<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 a Optional<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.

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

  • 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

Temas relacionados