Imagem de Tom und Nicki Löschner por Pixabay. Edição por Erick Simões. Todos os direitos reservados. Unity e Vuforia são marcas registradas pertencentes a seus respectivos donos.

Habilitando o Foco Automático da Câmera para AR no Unity

Esse é um recurso fundamental para quando desenvolvemos aplicações em Realidade Aumentada baseadas em smartphones com o Unity e Vuforia.

Erick Simões
NAVE Recife
Published in
3 min readJun 23, 2020

--

Quando trabalhamos com o desenvolvimento de soluções em dispositivos móveis enfrentamos vários desafios relacionados a fragmentação de software e hardware. Especificamente no contexto de Realidade Aumentada (AR), além da versão do sistema operacional e poder de processamento do dispositivo, um outro desafio recorrente é relacionado ao foco da câmera.

À esquerda, o foco está no objeto em primeiro plano. À direita, o foco está no objeto em segundo plano.

O foco da câmera permite colocar determinados objetos em evidência e com maior nitidez. O foco automático (autofocus) garante que, a medida em que você aproxima ou afasta um objeto da câmera, esse ajuste será feito dinamicamente. Para aplicações desenvolvidas usando o Unity, nem todos os dispositivos tem por padrão o foco automático da câmera habilitado, sendo necessário fazer esse processo manualmente.

Quando temos uma aplicação de realidade aumentada desenvolvida com Vuforia, é essencial ficar atento para esse detalhe visando garantir que o target esteja sempre em foco, facilitando sua detecção pelo sistema. Para isso, vamos partir de um projeto básico no Unity para Android com o pacote mais recente do Vuforia instalado (em junho de 2020 é a versão 9.2.7). Em cena deve haver o objeto ARCamera e algum Image Target para teste.

A primeira coisa que precisamos saber é sobre os 5 tipos de modos de câmera. Diferentes dispositivos possuem modos de câmera padrão diferentes. Os modos de câmera suportados pelo Vuforia são:

FOCUS_MODE_NORMAL

Ativa o comportamento da câmera como o padrão definido pelo drive do dispositivo. É usado, principalmente, para retomar o modo padrão da câmera, depois dele ter sido modificado.

FOCUS_MODE_TRIGGERAUTO

Dispara uma única operação de foco automático. Depois de ajustado, o foco permanece o mesmo até que seja definido um modo novamente.

FOCUS_MODE_CONTINUOUSAUTO

Ativa o foco automático contínuo. Esse é o modo recomendado para aplicações em AR, pois garante que a câmera está sempre focando o target.

FOCUS_MODE_INFINITY

Define a câmera para o modo de foco infinito, usado para objetos que estão muito distantes. Esse modo está disponível apenas para dispositivos Android.

FOCUS_MODE_MACRO

Define a câmera para o modo de foco macro, usado para objetos que estão muito próximos. Esse modo está disponível apenas para dispositivos Android.

Por mais que todos esses modos possam ser úteis em diferentes contextos, o modo FOCUS_MODE_CONTINUOUSAUTO é, sem dúvidas, o mais adequado para aplicações em AR. Por permitir o ajuste automático do foco dinamicamente, ou seja, enquanto a aplicação esta sendo executada, garante imagens nítidas e um bom desempenho de rastreamento.

Contudo, em alguns dispositivos, esse modo pode não estar disponível. Neste caso, é recomendado o uso do modo FOCUS_MODE_TRIGGERAUTO. Ele pode ser usado junto ao recurso de “touch to focus” ou “clique para focar”. Comum em aplicativos de foto, o usuário precisa clicar na tela para que o foco seja ajustado.

Para controlar o modo da câmera, é necessário escrever um script C#. Aqui criaremos um novo script chamado CameraFocusController e vamos adiciona-lo como componente do GameObject ARCamera. No script, adicionaremos o seguinte código:

CameraFocusController.cs

Neste script, no método Start(8), registramos dois métodos no Callback de eventos do Vuforia: RegisterVuforiaStartedCallback e RegisterOnPauseCallback. Isso significa que, quando esses eventos correrem, os métodos passados como parâmetro são executados. No caso, são, respectivamente, os eventos de inicialização do Vuforia (quando uma cena que contem um ARCamera e demais componentes são carregados) e o evento de pausa (quando o aplicativo entra em estado de pausa ou quando ele volta do estado de pausa).

Ambos os eventos terminam por acionar o método SetFocus(24). Nele, a câmera do dispositivo é acessada e, através do método SetFocusMode é definido o modo de foco FOCUS_MODE_CONTINUOUSAUTO. O método SetFocusMode pode retornar false se o modo não está disponível ou se não pôde ser ativado.

--

--

Erick Simões
NAVE Recife

Bacharel em Sistemas de Informação, professor de jogos digitais, palestrante, programador erudito, adestrador de robôs, defenestrador de bugs, maker diletante