Table of Contents

Implementação de câmera personalizada no Unity —— Fonte de dados de quadros externa

Por meio da fonte de dados de quadros externa (ExternalFrameSource), os desenvolvedores podem estender o EasyAR Sense com uma implementação de câmera personalizada para oferecer suporte a headsets específicos ou outros dispositivos de entrada. O conteúdo a seguir apresenta a estrutura de tipos e as definições de interface da fonte de dados de quadros externa.

Antes de começar

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

A figura acima mostra a estrutura de tipos das fontes de dados de quadros externas.

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

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

Ao integrar esses tipos de fontes de dados de quadros externas, as funções de AR disponíveis são diferentes:

  • Extensão de entrada de imagem e dados de 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 imagens na nuvem
    • Rastreamento de objetos (com suporte a fusão de movimento)
  • Extensão de entrada de imagem e dados de movimento do dispositivo ExternalDeviceRotationFrameSource
    • Mega
    • Rastreamento de imagem (sem suporte a fusão de movimento)
    • Reconhecimento de imagens na nuvem
    • Rastreamento de objetos (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 imagens na nuvem
    • Rastreamento de objetos (sem suporte a fusão de movimento)

Definição da interface da fonte de dados de quadros externa

Ao criar uma fonte de dados de quadros externa, é necessário implementar as interfaces relacionadas. A seguir são apresentadas as definições dessas interfaces e como usá-las.

Definição do dispositivo

  • FrameSource.IsHMD: define se é um headset
    Defina como true somente em dispositivos headset.
    Se o dispositivo for um headset, as informações de diagnóstico serão exibidas em uma placa 3D à frente da câmera, e não na tela. Algumas funções de AR podem se comportar de maneira ligeiramente diferente em dispositivos headset.

  • FrameSource.Display: define o sistema de exibição
    Fornece informações como a rotação da exibição atual.
    Você pode usar Display.DefaultSystemDisplay ou Display.DefaultHMDDisplay para obter as informações de exibição padrão. Em geral, em headsets, você pode usar Display.DefaultHMDDisplay.

Sem configurações adicionais.

Disponibilidade

  • FrameSource.IsAvailable: disponibilidade (Availability)
    Usado para determinar se a frame source pode ser usada.
    Se uma frame source não estiver disponível no dispositivo ou ambiente de execução atual, esse valor deve ser false.
    Se esse valor for igual a Optional<bool>.Empty, a corrotina FrameSource.CheckAvailability() será chamada, e FrameSource.IsAvailable deve ser atualizado antes que a corrotina termine.
    A interface de disponibilidade será usada durante a montagem da session. Componentes indisponíveis não serão selecionados e seus métodos não serão chamados durante a execução da session.
  • FrameSource.CheckAvailability() (opcional): corrotina para verificar se a frame source está disponível
    Será chamada quando FrameSource.IsAvailable for igual a Optional<bool>.Empty. Antes do término dessa corrotina, o processo de montagem da session será bloqueado.

Origem da session

  • ExternalDeviceFrameSource.OriginType: tipo de origem

    • XROrigin: o SDK do dispositivo usa Unity.XR.CoreUtils.XROrigin como origem.
    • Custom: o SDK do dispositivo usa uma origem personalizada. É necessário especificar ExternalDeviceFrameSource.Origin.
    • None: o SDK do dispositivo não define uma origem. Nesse caso, a origem será selecionada ou criada automaticamente a partir da cena, mas não se moverá.
      A session só dará suporte ao modo de centro SessionOrigin. Os desenvolvedores do aplicativo devem ter muito cuidado ao posicionar objetos virtuais, pois todos os targets e o conteúdo sob os targets sempre se moverão no sistema de coordenadas do Unity, e parte do conteúdo do usuário (como sistemas de física) não funcionará corretamente. Qualquer objeto colocado no sistema de coordenadas do mundo do Unity nunca poderá aparecer na posição correta em nenhuma configuração.
  • ExternalDeviceFrameSource.Origin: objeto de origem
    Defina sua própria origem somente quando ExternalDeviceFrameSource.OriginType for Custom; nos demais casos, não é necessário redefini-la.

Câmera virtual

  • FrameSource.Camera: câmera virtual
    A câmera não é controlada pela session; o transform, a matriz de projeção e a renderização do fundo da imagem da câmera devem ser controlados por código externo.
    Essa câmera será usada somente em headsets, para exibir alguns textos de diagnóstico diante dos olhos.
    Quando ExternalDeviceFrameSource.OriginType for XROrigin, não é necessário defini-la; o EasyAR usará automaticamente a câmera definida no framework Unity XR.

Câmera física

  • FrameSource.DeviceCameras: parâmetros da câmera física
    Fornece a câmera física dos dados de quadro da câmera. Se os dados de quadro da câmera forem fornecidos por várias câmeras, a lista deverá conter todas as câmeras físicas.
    É necessário garantir que os parâmetros corretos da câmera física possam ser obtidos quando FrameSource.CameraFrameStarted for true.
  • FrameSource.CameraFrameStarted: se a entrada de quadros da câmera começou
    Retorna true depois que a câmera física estiver pronta e puder inserir dados no EasyAR; retorna false depois que a câmera física parar de funcionar. Quando FrameSource.CameraFrameStarted for false, o EasyAR não funcionará. Quando FrameSource.CameraFrameStarted for true, é obrigatório garantir que os dados de FrameSource.DeviceCameras sejam acessíveis e que dados de quadro da câmera sejam inseridos continuamente no EasyAR. Quando o EasyAR detectar ausência de entrada de quadros da câmera por muito tempo, ele exibirá um aviso para ajudar o usuário a separar problemas quando uma função não responder.

Os parâmetros da câmera física precisam ser iguais aos da câmera real do dispositivo.

  • FrameSourceCamera.CameraType: tipo de câmera física
    Em geral, em situações que não sejam de câmera frontal, como em headsets, selecione a câmera traseira.
  • FrameSourceCamera.CameraOrientation: ângulo de rotação no sentido horário necessário para exibir a imagem da câmera física na orientação natural do dispositivo
    O intervalo é [0, 360).
  • FrameSourceCamera.FrameSize: tamanho da imagem
  • FrameSourceCamera.FrameRateRange: intervalo de taxa de quadros
    Define x como o limite inferior do intervalo da taxa de quadros e y como o limite superior.
  • DeviceFrameSourceCamera.AxisSystem: sistema de eixos de coordenadas usado pela pose da cabeça/câmera física e pelos extrínsecos da câmera física
    Todas as matrizes devem usar o mesmo sistema de eixos de coordenadas. Se a definição dos dados usados não corresponder a um sistema conhecido, é necessário fazer a transformação dos eixos de coordenadas antes de passá-los ao EasyAR.
  • DeviceFrameSourceCamera.Extrinsics: extrínsecos da câmera física
    Geralmente é a matriz calibrada. Seus eixos de coordenadas devem cumprir a definição de DeviceFrameSourceCamera.AxisSystem. Se a definição dos eixos dos extrínsecos for diferente da definição dos eixos da pose real, ou se eles não corresponderem à definição de DeviceFrameSourceCamera.AxisSystem, será necessário fazer a transformação dos eixos de coordenadas antes de definir esse valor.

Início e parada da session

  • FrameSource.OnSessionStart(ARSession): tratar evento de início da session
    Válido quando esta frame source é selecionada durante a montagem da session.
    Pode ser usado para inicialização adiada, fazendo neste método o trabalho de inicialização específico de AR.
  • FrameSource.OnSessionStop(): tratar evento de parada da session
    Válido quando esta frame source é selecionada durante a montagem da session.
    Pode destruir os recursos criados em FrameSource.OnSessionStart(ARSession) e durante a execução da session, além de restaurar o estado interno. Este método tem chamada garantida antes da destruição da session. Se a frame source for destruída antes da session, ele não será chamado, e a session entrará no estado Broken.

Quadro de entrada

  • ExternalFrameSource.TryAcquireBuffer(int): tentar obter um bloco de memória do pool de memória
    Esse bloco de memória geralmente é usado para armazenar dados de imagem dos quadros da câmera e inseri-los no EasyAR.
  • ExternalFrameSource.ReceivedFrameCount: contagem de quadros da câmera recebidos pelo EasyAR
    O EasyAR usa esse valor para verificar a integridade da entrada de quadros da câmera do dispositivo. Ele pode ser usado na depuração; se esse valor parar de aumentar, geralmente indica que o dispositivo parou de inserir dados no EasyAR.

Mensagens do Unity

Ao usar as seguintes mensagens em scripts, é necessário garantir que a implementação da classe base seja chamada:

Próximos passos

Tópicos relacionados