Table of Contents

Implementação de câmera personalizada no Unity - Fonte de dados de quadro externo

Através da fonte de dados de quadro externo (ExternalFrameSource), os desenvolvedores podem estender a implementação da câmera do EasyAR Sense para suportar dispositivos de headset específicos ou outros dispositivos de entrada. O conteúdo a seguir descreve a estrutura de tipos e as definições de interface para a fonte de dados de quadro externo.

Antes de começar

Tipos de fonte de dados de quadro 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

O diagrama acima mostra a estrutura de tipos de fontes de dados de quadro externos.

De acordo com os diferentes dados de entrada, as fontes de dados de quadro externos podem ser divididas em duas categorias principais:

  • Extensão de entrada de dados de imagem e movimento do dispositivo
    • Implementado herdando ExternalDeviceMotionFrameSource: O dispositivo e seu SDK fornecem rastreamento de movimento 6DoF. A transform da câmera virtual e outros controles são realizados pelo SDK do dispositivo.
    • Implementado herdando ExternalDeviceRotationFrameSource: O dispositivo e seu SDK fornecem rastreamento de rotação 3DoF. A transform da câmera virtual e outros controles são realizados pelo SDK do dispositivo.
  • Extensão de entrada de imagem
    • Implementado herdando ExternalImageStreamFrameSource: Fornece apenas entrada de imagem. A transform da câmera virtual e outros controles são realizados pelo EasyAR.

Ao integrar essas fontes de dados de quadro externos, as funcionalidades AR disponíveis variam:

  • Extensão de entrada de imagem e movimento do dispositivo ExternalDeviceMotionFrameSource
    • Mega
    • Rastreamento de movimento (fornecido pelo próprio dispositivo)
    • Mapa espacial esparso
    • Mapa espacial denso
    • Rastreamento de imagem (com suporte a fusão de movimento)
    • Reconhecimento de imagem na nuvem
    • Rastreamento de objeto (com suporte a fusão de movimento)
  • Extensão de entrada de imagem e movimento do dispositivo ExternalDeviceRotationFrameSource
    • Mega
    • Rastreamento de imagem (sem suporte a fusão de movimento)
    • Reconhecimento de imagem na nuvem
    • Rastreamento de objeto (sem suporte a fusão de movimento)
  • Extensão de entrada de imagem ExternalImageStreamFrameSource
    • Rastreamento de imagem (sem suporte a fusão de movimento)
    • Reconhecimento de imagem na nuvem
    • Rastreamento de objeto (sem suporte a fusão de movimento)

Definição de interface de fonte de dados de frame externo

Ao criar uma fonte de dados de frame externo, as interfaces relevantes devem ser implementadas. As definições dessas interfaces e como usá-las são descritas abaixo.

Definição de dispositivo

  • FrameSource.IsHMDDefine se é um head-mounted display
    Definido como true apenas em dispositivos head-mounted.
    Se o dispositivo for head-mounted, as informações de diagnóstico serão exibidas em uma placa 3D diante da câmera em vez da tela. Alguns recursos de AR funcionam ligeiramente diferente em dispositivos head-mounted.

  • FrameSource.DisplayDefine o sistema de exibição
    Fornece informações como a rotação da exibição atual.
    Pode-se usar Display.DefaultSystemDisplay ou Display.DefaultHMDDisplay para obter informações de exibição padrão.
    Geralmente, Display.DefaultHMDDisplay pode ser usado em head-mounted displays.

Sem configurações adicionais.

Disponibilidade

  • FrameSource.IsAvailable: Disponibilidade (Availability)
    Usado para determinar se uma fonte de frames (frame source) pode ser utilizada.
    Se uma fonte de frames não estiver disponível no dispositivo ou ambiente de execução atual, este valor deve ser falso.
    Se este valor for igual a Optional<bool>.Empty, a corrotina FrameSource.CheckAvailability() será chamada. O valor de FrameSource.IsAvailable deve ser atualizado antes da conclusão desta corrotina.
    A interface de disponibilidade é usada durante a montagem da sessão (session). Componentes indisponíveis não serão selecionados e seus métodos não serão chamados durante a execução da sessão.
  • FrameSource.CheckAvailability() (Opcional): Corrotina para verificar se a fonte de frames está disponível
    Chamada quando FrameSource.IsAvailable é igual a Optional<bool>.Empty. O processo de montagem da sessão será bloqueado até que esta corrotina seja concluída.

Origem da sessão

  • ExternalDeviceFrameSource.OriginType: Tipo de Origem

    • XROrigin: O dispositivo SDK usa Unity.XR.CoreUtils.XROrigin como origem.
    • Custom: O dispositivo SDK usa uma origem personalizada. É necessário especificar ExternalDeviceFrameSource.Origin.
    • None: O dispositivo SDK não define uma origem. Neste caso, a origem será selecionada ou criada automaticamente da cena, mas não se moverá.
      A sessão suportará apenas o modo central SessionOrigin. Os desenvolvedores de aplicativos devem ter muito cuidado com como posicionam objetos virtuais, pois todos os alvos e conteúdos sob os alvos sempre se moverão no sistema de coordenadas do Unity, e partes do conteúdo do usuário (como sistemas de física) não funcionarão corretamente. Objetos colocados no sistema de coordenadas mundial do Unity nunca aparecerão na posição correta em qualquer configuração.
  • ExternalDeviceFrameSource.Origin: Objeto de Origem
    Defina sua própria origem apenas e somente quando ExternalDeviceFrameSource.OriginType for Custom. Não é necessário redefinir em outros momentos.

Câmera virtual

  • FrameSource.Camera: Câmera virtual
    A câmera não é controlada pela sessão. A transformação da câmera, matriz de projeção e renderização de fundo de imagem devem ser controlados por código externo.
    Esta câmera só é usada em headset para exibir textos de diagnóstico na visão do usuário.
    Não é necessário definir quando ExternalDeviceFrameSource.OriginType é XROrigin. O EasyAR usará automaticamente a câmera definida no framework Unity XR.

Câmera física

  • FrameSource.DeviceCamerasParâmetros da câmera física
    Fornece câmeras físicas que geram dados de quadro. Se os dados do quadro forem fornecidos por várias câmeras, a lista deve incluir todas as câmeras físicas.
    Garanta que os parâmetros corretos da câmera física possam ser obtidos quando FrameSource.CameraFrameStarted for true.
  • FrameSource.CameraFrameStartedA entrada de quadros da câmera foi iniciada
    Retorna true quando a câmera física está pronta e pode alimentar dados no EasyAR, retorna false após a câmera física parar. Quando FrameSource.CameraFrameStarted for false, o EasyAR não funcionará. Quando FrameSource.CameraFrameStarted for true, garanta que os dados de FrameSource.DeviceCameras estejam acessíveis e alimentem continuamente quadros da câmera no EasyAR. Se o EasyAR detectar ausência prolongada de entrada de quadros, exibirá um aviso para auxiliar na depuração.

Os parâmetros da câmera física devem corresponder aos da câmera do dispositivo real.

On session start and stop

  • FrameSource.OnSessionStart(ARSession): Manipula o evento de início da sessão
    Válido quando esta fonte de frames for selecionada durante a montagem da sessão.
    Pode ser usado para inicialização atrasada; realize o trabalho de inicialização exclusivo de AR neste método.
  • FrameSource.OnSessionStop(): Manipula o evento de parada da sessão
    Válido quando esta fonte de frames for selecionada durante a montagem da sessão.
    Você pode destruir os recursos criados durante FrameSource.OnSessionStart(ARSession) e durante a execução da sessão, e restaurar o estado interno neste método. Este método é garantido para ser chamado antes da destruição da sessão. Se a fonte de frames for destruída antes da sessão, ela não será chamada e a sessão entrará no estado Broken.

Quadro de entrada

  • ExternalFrameSource.TryAcquireBuffer(int): Tenta adquirir um bloco de memória do pool
    Este bloco é normalmente usado para armazenar dados de imagem do quadro da câmera e alimentar o EasyAR.
  • ExternalFrameSource.ReceivedFrameCount: Contagem de quadros da câmera recebidos pelo EasyAR
    O EasyAR usa isso para verificar a saúde da entrada de quadros da câmera do dispositivo. Pode ser usado para depuração; se esse valor parar de aumentar, geralmente indica que o dispositivo parou de alimentar dados no EasyAR.

Mensagens do Unity

Ao usar as seguintes mensagens em scripts, certifique-se de que a implementação da classe base seja chamada:

Próximos passos

Tópicos relacionados