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
- Entenda os conceitos básicos de câmera personalizada.
- Entenda os conceitos básicos, tipos e método de seleção em tempo de execução de fonte de quadros.
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
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
inserir dados de quadro da câmeraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
inserir dados de quadro da câmera
Pode ser chamado em qualquer thread, desde que todas as APIs do SDK do dispositivo sejam thread-safe.
Esses dados precisam corresponder aos dados do momento de exposição do sensor da câmera física. Recomenda-se inserir dados a 30 ou 60 fps. A taxa mínima de quadros aceitável é 2, mas o tempo de resposta de alguns algoritmos será afetado. Sempre que possível, recomenda-se inserir dados coloridos, o que ajuda o efeito do Mega.
Para obter a melhor eficiência, é possível projetar toda a cadeia de dados para que os dados YUV originais sejam transmitidos diretamente por memória compartilhada, usando diretamente o ponteiro de dados ao passá-los ao EasyAR e prestando atenção à propriedade dos dados.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
inserir dados de quadro de renderizaçãoExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
inserir dados de quadro de renderização
É necessário garantir que a chamada seja feita a cada quadro de renderização depois que os dados do dispositivo estiverem prontos, sem pular quadros. Esses dados precisam ser consistentes com os dados da câmera virtual Unity atual que impulsionam o mesmo quadro.
- 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
- Leia Dados de quadro de entrada externos para conhecer os dados de quadro da câmera e os dados de quadro de renderização
- Crie uma extensão de entrada de imagem e dados de movimento do dispositivo
- Crie uma extensão de entrada de imagem