Table of Contents

Câmera Unity em cenas AR

A experiência AR no Unity depende da câmera. Este artigo explica o papel da câmera em cenas AR e como as sessions controlam as propriedades da câmera para garantir a experiência AR correta.

Antes de começar

O papel da câmera em cenas AR

No Unity, a câmera é usada para mostrar o mundo do jogo ao jogador, mas em cenas AR seu papel é ainda mais importante. Ela não apenas renderiza conteúdo virtual, mas também precisa se alinhar ao mundo real para garantir que os objetos virtuais sejam sobrepostos corretamente à cena real.

Este vídeo mostra uma cena AR simples. O lado esquerdo é a view Scene e o lado direito é a view Game. O vídeo foi gravado no modo Play do Unity Editor usando simulation data. O conteúdo na view Game é o mesmo que o usuário vê no telefone no mundo real.

Neste vídeo, a câmera que representa o usuário (ícone de câmera) se move de acordo com o movimento do usuário no mundo real. O cone branco mostra a posição e a orientação da câmera no período anterior. Na view Game, a câmera não apenas mostra o conteúdo virtual da view Scene, mas também sobrepõe a imagem do mundo real na parte inferior do conteúdo virtual. Esse é o comportamento típico de uma câmera em uma cena AR.

Para garantir que os objetos virtuais sejam sobrepostos corretamente à cena real, algumas propriedades da câmera precisam ser ajustadas de acordo com o estado de execução do AR. Essas propriedades incluem:

  • o transform da câmera (posição e orientação)
  • o field of view (FOV), aspect ratio e projection matrix da câmera
  • as configurações de culling da câmera (<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>)
Aviso

Ao desenvolver uma aplicação, modificar essas propriedades da câmera na session camera não é suportado, porque isso pode fazer com que o conteúdo virtual se alinhe incorretamente com o mundo real e afete a experiência do usuário. Mesmo que essas propriedades sejam modificadas por algum meio, o sistema AR sobrescreverá essas alterações durante a execução, ou um comportamento inesperado poderá ocorrer porque os dados renderizados e os dados calculados ficam inconsistentes.

Dependendo do objeto que controla essas propriedades, a câmera usada pela session pode ser dividida em dois tipos: câmeras controladas pela session e câmeras não controladas pela session.

Câmeras controladas pela session

Se a session camera não pertence a nenhum sistema externo, como um headset ou AR Foundation, a session controla automaticamente as propriedades da câmera acima para garantir que ela esteja corretamente alinhada com o mundo real.

transform

O transform da câmera (posição e orientação) é ajustado pela session de acordo com o estado de execução do recurso AR. Em geral, a session atualiza a posição e a orientação da câmera com base em dados de motion tracking e/ou dados de tracking target para garantir que o conteúdo visto pelo usuário corresponda ao mundo real.

No Unity, o ponto de referência central de todo tracking AR é chamado session origin, e a regra que determina esse origin durante a execução da session é chamada center mode. O transform da câmera se comporta de forma diferente em cada center mode:

  • No center mode <xref:u:easyar.ARSession.ARCenterMode.Camera>, a câmera pode se mover livremente.

    Em geral, o mode <xref:u:easyar.ARSession.ARCenterMode.Camera> raramente é usado por aplicações.

  • Em outros center mode, como <xref:u:easyar.ARSession.ARCenterMode.FirstTarget>, a câmera não pode se mover livremente.

    <xref:u:easyar.ARSession.ARCenterMode.FirstTarget> é o modo usado pela maioria das aplicações AR.

Aviso

O valor de scale do transform da câmera deve sempre permanecer (1, 1, 1). Modificar a scale da câmera pode causar comportamento inesperado.

Matriz de projeção

A projection matrix da câmera é atualizada a cada frame pela session de acordo com as intrinsics da câmera física para garantir que o conteúdo virtual seja sobreposto corretamente à cena real.

Configurações de culling

As configurações de culling da câmera (<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>) são ajustadas de acordo com as configurações de mirror da session para garantir que o conteúdo virtual seja renderizado corretamente na cena real.

Quando a configuração correspondente à câmera atual em <xref:u:easyar.ARSession.HorizontalFlip> é <xref:u:easyar.ARSession.ARHorizontalFlipMode.World>, <xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType> é definido como true. Essa é a configuração padrão para a front camera.

Stream de vídeo de fundo AR

Em cenas AR, a câmera normalmente renderiza o video stream da câmera física como background para aumentar a imersão. A session trata automaticamente da aquisição e renderização do video stream, e garante que ele esteja corretamente alinhado ao conteúdo virtual.

Câmeras não controladas pela session

Ao usar um headset ou AR Foundation, ou quando a implementação especifica <xref:u:easyar.FrameSource.IsCameraUnderControl> como false para <xref:u:easyar.FrameSource>, a session não controla as propriedades da câmera acima. Em vez disso, elas são controladas pelo sistema externo.

Aviso

Embora a session não controle as propriedades da câmera nesse caso, elas ainda são controladas por um sistema de terceiros, como um SDK de headset ou AR Foundation, então modificar essas propriedades durante o desenvolvimento continua sem suporte.

Considerações ao copiar câmeras

Às vezes pode ser necessário copiar os parâmetros da session camera para outra câmera. Nesse caso, preste atenção especial aos dois pontos a seguir:

  • Momento de obtenção das propriedades: ao usar uma câmera controlada, consulte Obter saída da session para obter esses parâmetros no momento correto; ao usar uma câmera não controlada pela session, consulte a documentação do sistema de terceiros para obtê-los no momento correto.
  • Field of view (FOV), aspect ratio e projection matrix da câmera: use <xref:UnityEngine.Camera.projectionMatrix?displayProperty=nameWithType> para obter a projection matrix da câmera e copiá-la para a outra câmera. <xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType> e <xref:UnityEngine.Camera.aspect?displayProperty=nameWithType> são matematicamente parte da projection matrix, portanto usar apenas <xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType> e <xref:UnityEngine.Camera.aspect?displayProperty=nameWithType> não é suficiente.

Próximos passos

Tópicos relacionados