Table of Contents

Implementacion de camara personalizada en Unity: fuente de datos de fotogramas externa

Mediante una fuente de datos de fotogramas externa (ExternalFrameSource), los desarrolladores pueden ampliar EasyAR Sense con una implementacion de camara personalizada para admitir headsets u otros dispositivos de entrada especificos. El contenido siguiente presenta la estructura de tipos y las definiciones de interfaz de la fuente de datos de fotogramas externa.

Antes de empezar

Tipos de fuente de datos de fotogramas externa

---
  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

La figura anterior muestra la estructura de tipos de las fuentes de datos de fotogramas externas.

Segun los datos de entrada, las fuentes de datos de fotogramas externas se pueden dividir en dos categorias principales:

  • Extension de entrada de imagen y datos de movimiento del dispositivo
    • Se implementa heredando de ExternalDeviceMotionFrameSource: el dispositivo y su SDK proporcionan seguimiento de movimiento 6DoF. El transform de la camara virtual y otros controles los realiza el SDK del dispositivo.
    • Se implementa heredando de ExternalDeviceRotationFrameSource: el dispositivo y su SDK proporcionan seguimiento de rotacion 3DoF. El transform de la camara virtual y otros controles los realiza el SDK del dispositivo.
  • Extension de entrada de imagen
    • Se implementa heredando de ExternalImageStreamFrameSource: solo proporciona entrada de imagen. El transform de la camara virtual y otros controles los realiza EasyAR.

Al integrar estos tipos de fuentes de datos de fotogramas externas, las funciones AR disponibles son diferentes:

  • Extension de entrada de imagen y datos de movimiento del dispositivo ExternalDeviceMotionFrameSource
    • Mega
    • Seguimiento de movimiento (proporcionado por el propio dispositivo)
    • Mapa espacial disperso
    • Mapa espacial denso
    • Seguimiento de imagen (admite fusion de movimiento)
    • Reconocimiento de imagen en la nube
    • Seguimiento de objetos (admite fusion de movimiento)
  • Extension de entrada de imagen y datos de movimiento del dispositivo ExternalDeviceRotationFrameSource
    • Mega
    • Seguimiento de imagen (no admite fusion de movimiento)
    • Reconocimiento de imagen en la nube
    • Seguimiento de objetos (no admite fusion de movimiento)
  • Extension de entrada de imagen ExternalImageStreamFrameSource
    • Seguimiento de imagen (no admite fusion de movimiento)
    • Reconocimiento de imagen en la nube
    • Seguimiento de objetos (no admite fusion de movimiento)

Definicion de interfaces de fuente de datos de fotogramas externa

Al crear una fuente de datos de fotogramas externa, debe implementar las interfaces relacionadas. A continuacion se presentan sus definiciones y metodos de uso.

Definicion del dispositivo

  • FrameSource.IsHMD: Define si es un headset
    Establezcalo en true si y solo si el dispositivo es un headset.
    Si el dispositivo es un headset, la informacion de diagnostico se mostrara en un panel 3D frente a la camara, no en la pantalla. Algunas funciones AR funcionan de forma ligeramente diferente en headsets.

  • FrameSource.Display: Define el sistema de visualizacion
    Proporciona informacion como la rotacion de la pantalla actual.
    Puede usar Display.DefaultSystemDisplay o Display.DefaultHMDDisplay para obtener la informacion de visualizacion predeterminada. Normalmente puede usar Display.DefaultHMDDisplay en un headset.

Sin configuracion adicional.

Disponibilidad

  • FrameSource.IsAvailable: Disponibilidad (Availability)
    Se usa para determinar si el frame source se puede usar.
    Si un frame source no esta disponible en el dispositivo o entorno de ejecucion actual, este valor debe ser false.
    Si este valor es Optional<bool>.Empty, se llamara a la corrutina FrameSource.CheckAvailability(), y FrameSource.IsAvailable debe actualizarse antes de que la corrutina termine.
    La interfaz de disponibilidad se usa durante el ensamblaje de la session. Los componentes no disponibles no se seleccionaran y sus metodos no se llamaran durante la ejecucion de la session.
  • FrameSource.CheckAvailability() (opcional): Corrutina para comprobar si el frame source esta disponible
    Se llama cuando FrameSource.IsAvailable es Optional<bool>.Empty. Antes de que esta corrutina termine, el proceso de ensamblaje de la session quedara bloqueado.

Origen de la session

  • 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. Debe especificarse ExternalDeviceFrameSource.Origin.
    • None: el SDK del dispositivo no define un origen. En este caso, el origen se seleccionara o creara automaticamente en la escena, pero no se movera.
      La session solo admitira el modo central SessionOrigin. Los desarrolladores de la aplicacion deben tener mucho cuidado con la colocacion de objetos virtuales, porque todos los targets y el contenido bajo ellos se moveran siempre en el sistema de coordenadas de Unity, y parte del contenido del usuario, como el sistema fisico, no funcionara correctamente. Los objetos colocados en el sistema de coordenadas del mundo de Unity nunca podran mostrarse en la posicion correcta bajo ninguna configuracion.
  • ExternalDeviceFrameSource.Origin: Objeto de origen
    Defina su propio origen si y solo si ExternalDeviceFrameSource.OriginType es Custom. En otros casos no es necesario redefinirlo.

Camara virtual

  • FrameSource.Camera: Camara virtual
    La camara no esta controlada por la session. El transform y la matriz de proyeccion de la camara, asi como el renderizado del fondo de imagen, deben controlarse mediante codigo externo.
    Esta camara solo se usara en headsets para mostrar texto de diagnostico delante de los ojos.
    Cuando ExternalDeviceFrameSource.OriginType es XROrigin, no es necesario definirla; EasyAR usara automaticamente la camara definida en el framework Unity XR.

Camara fisica

  • FrameSource.DeviceCameras: Parametros de camara fisica
    Proporciona la camara fisica de los datos de fotogramas de camara. Si los datos de fotogramas de camara los proporcionan varias camaras, la lista debe incluir todas las camaras fisicas.
    Debe asegurarse de que los parametros correctos de la camara fisica se puedan obtener cuando FrameSource.CameraFrameStarted sea true.
  • FrameSource.CameraFrameStarted: Si ha empezado la entrada de fotogramas de camara
    Devuelve true despues de que la camara fisica este lista y pueda introducir datos en EasyAR, y devuelve false despues de que la camara fisica deje de funcionar. Cuando FrameSource.CameraFrameStarted es false, EasyAR no funcionara. Cuando FrameSource.CameraFrameStarted es true, debe garantizarse que los datos de FrameSource.DeviceCameras sean accesibles y que se introduzcan de forma continua datos de fotogramas de camara en EasyAR. Si EasyAR detecta que no hay entrada continua de fotogramas de camara durante mucho tiempo, mostrara una advertencia para ayudar al usuario a separar causas cuando la funcion no responde.

Los parametros de la camara fisica deben coincidir con los de la camara real del dispositivo.

Inicio y detencion de la session

  • FrameSource.OnSessionStart(ARSession): Procesa el evento de inicio de la session
    Es valido cuando este frame source se selecciona durante el ensamblaje de la session.
    Puede usarse para inicializacion diferida y para realizar inicializacion especifica de AR en este metodo.
  • FrameSource.OnSessionStop(): Procesa el evento de detencion de la session
    Es valido cuando este frame source se selecciona durante el ensamblaje de la session.
    Puede usar este metodo para destruir los recursos creados por FrameSource.OnSessionStart(ARSession) y durante la ejecucion de la session, y restaurar el estado interno. Este metodo tiene garantizada su llamada antes de que la session se destruya. Si el frame source se destruye antes que la session, no se llamara y la session entrara en el estado Broken.

Entrada de fotogramas

  • ExternalFrameSource.TryAcquireBuffer(int): Intenta obtener un bloque de memoria del pool de memoria
    Este bloque de memoria se usa normalmente para almacenar los datos de imagen de los fotogramas de camara e introducirlos en EasyAR.
  • ExternalFrameSource.ReceivedFrameCount: Contador de fotogramas de camara recibidos por EasyAR
    EasyAR lo usa para comprobar la salud de la entrada de fotogramas de la camara del dispositivo. Puede usarse durante la depuracion; si este valor deja de crecer, normalmente indica que el dispositivo ha dejado de introducir datos en EasyAR.

Mensajes de Unity

Al usar los siguientes mensajes en el script, debe tener cuidado de asegurarse de que se llama a la implementacion de la clase base:

Pasos siguientes

Temas relacionados