Como eu crio um jogo tipo Pokemon Go?

Pokemon Go nem chegou oficialmente ao Brasil e já é uma febre (e eu já até escrevi um livro sobre o assunto). As ações da Nintendo, detentora da marca Pokemon, já mais que dobraram desde seu lançamento, com a grande aposta do mercado que esse jogo mobile, primeira aposta bem sucedida da Nintendo neste segmento, irá explodir em rios de dinheiro. Como um fã de Pokemon desde os 10 anos de idade (faz tempo…) arrisco dizer que eles estão certos.

Como desenvolvedor de apps e games móveis, muitos alunos têm me perguntado como fazer um jogo que nem o Pokemon Go. Ou que tipo de tecnologia alienígena eles usaram para inserir Pokemons em nosso mundo real através do app. E eu respondo: não há nada de místico, nem nada de inédito, chama-se Realidade Aumentada, e é disso que se trata este post, traduzido de um material em Inglês.

Se é seu primeiro app em Android, sugiro começar com este livro aqui, bem curto e objetivo. Agora se nem mesmo conhece a linguagem Java, bom, comece por esse aqui.

Mas que diabos é “realidade aumentada”? Ela tornou-se um termo um tanto popular há alguns anos graças ao Google Glass, mas a ideia é mais velha do que o primeiro celular com Android. Você se lembra do filme do Exterminador do Futuro? Arnold tinha uma visão que mapeava a área ao redor e mostrava informações adicionais sobre os objetos ou pessoas.

ra-00

E acho que esta é a melhor maneira de mostrar a você o que realmente é realidade aumentada. A definição de AR vem do guru Ronald Azuma em 1997, quando ele estabeleceu os três elementos que definem a realidade aumentada:

1. Ela conecta os mundos real e virtual
2. Ela é interativa em tempo real
3. ela permite movimentos em 3D

É muito importante que você não confunda realidade aumentada com realidade virtual porque estas tecnologias não são as mesmas. A ideia crucial é sobrepor informações digitalizadas sobre imagens do mundo real (offline). Soa legal, não é? Isto pode parecer ficção científica…mas existe. Claro que existem diversos dispositivos mais sofisticados do que câmeras de celular para trabalhar com realidade aumentada, com diferentes níveis de precisão e qualidade. Mas a parte mais legal é que boa parte das coisas realmente úteis que podemos fazer com realidade aumentada (inclusive jogos divertidíssimos como Pokemon Go) já estão ao nosso alcance e podem fazer parte do nosso cotidiano.

Existem dispositivos à venda na Internet (em sites como o dx.com) que, quando instalados no seu carro, transformam o seu pára-brisa em um head-up display (também conhecido como HUD pelos gamers) que mostra informações de navegação, alertas de segurança, etc.

ra-01

Quem não ouviu falar do Google Glass? É um famoso wearable (computador vestível) feito pelo Google. Você também pode pensar nele como um hads-up display pessoal. Mas o que é mais legal no Glass é que ele possui um SDK para Android que nos permite criar nossas próprias aplicações de realidade aumentada. e alguns excelentes apps foram criados com ele. Por exemplo, se você precisa de motivação para correr todo dia, você pode usar o app RaceYourself e escolher o modo “Zombie Chase” (perseguição zumbi). Toda vez que você olhar para trás (usando um Google Glass, é claro), você verá o quão perto você está de ser devorado por uma hora de zumbis que estão lhe perseguindo!

ra-02

Mas vamos nos focar em tecnologias que estão ao nosso alcance (afinal somos brazucas e Glass por aqui nem pensar) e vamos falar de alguns apps mais acessíveis. Smartphones estão sempre conosco, e podem fornecer importantes informações em tempo real. As experiências mais interessantes com certeza são as que conectam o que você vê ou ouve com dados processados digitalmente. Por exemplo, o Google recentemente implementou uma funcionalidade de realidade aumentada no seu app mobile de tradução. Ele automaticamente traduz texto via a câmera do smartphone e o mais impressionante é que funciona em real-time (não precisa tirar uma foto)!

ra-03

Dado o que mostrei acima sobre realidade aumentada, você deve estar pensando que é muito difícil, que requer um hardware moderno ou poderosos algoritmos de processamento combinados. Mas será que precisa ser tão sofisticado? Vamos dar uma olhada no Yelp. É um app que fornece informações sobre restaurantes próximos (reviews, etc). O que realmente importa para este exemplo é o recurso chamado Monocle (monóculo), que sobrepõe informações sobre os lugares de interesse na visão da sua câmera.

ra-04

Agora pense o quão difícil deve ser implementar um app tipo o Monocle do Yelp. O ponto mais importante aqui aqui é detectar os pontos de interesse e apresentá-los na tela. Algoritmos de reconhecimento de imagem podem ser a escolha certa, mas vamos ser sinceros, um smartphone ainda não tem um poder de processamento para tanto (ainda). Então vamos buscar outras alternativas, como geodésia, ou o estudo das formas e dimensões dos corpos, muito aplicado à engenharia.

Então mãos à obra! No tutorial à seguir vou mostrar como fazer um app muito simples que identifica nosso ponto de interesse usando a câmera. Para referência, veja este vídeo:

Um pouco de teoria

(Geodesy theory is based on the book: A. Jagielski, Geodezja I, GEODPIS , 2005.)
Vamos ver o que Wikipedia nos diz sobre ângulo azimutal, um conceito que precisamos entender:

“O azimute é o ângulo formado entre uma direção referencial (Norte) e uma linha a partir do observador até um ponto de interesse projetado no mesmo plano como a direção ortogonal referencial ao zênite”

ra-05

Então basicamente o que tentaremos fazer é reconhecer o ponto de destino comparando o azimute calculado a partir das propriedades básicas de um triângulo de ângulo reto e o azimute verdadeiro do dispositivo que está apontado.
Lista do que precisaremos:

  • pegar a localização GPS do dispositivo
  • pegar a localização GPS do ponto de destino
  • calcur o azimute teórico baseado nos dados GPS
  • pegar o azimute real do dispositivo
  • comparar ambos azimutes baseado na precisão e chamar um evento

Agora a questão é como calcular o azimute. Isto não deve ser muito difícil uma vez que vamos ignorar a curvatura da Terra e tratá-la como uma superfície plana:

ra-06

Como pode ver, temos um simples triângulo reto e podemos calcular o ângulo ᵠ entre os pontos A e B a partir da simples equação:

ra-07

A tabela abaixo representa as relações entre o ângulo em graus e o azimute A(AB):

ra-08

Hora da Implementação

Neste tutorial, não vamos descrever como obter a localização e orientação do azimute do dispositivo porque isto é bem documentado na Internet, com vário tutoriais. Principalmente para referência, leia Sensors Overview (especially TYPEORIENTATION and TYPEROTATION_VECTOR) e Location Strategies.

Uma vez que você tenha preparado os dados dos sensores, é hora de implementar a CameraViewActivity. A primeira e mais importante coisa é implementar o SurfaceHolder.Callback para carregar uma imagem da camera em nosso layout. SurfaceHolder.Callback implementa os três métodos responsáveis para isso: surfaceChanged(), surfaceCreated() e surfaceDestroyed().

O próximo passo é criar um arquivo de layout XML, chamado activity_camera_view.xml. Isto é bem simples:

Uma vez que temos a apresentação pronta, precisamos conectá-la com os sensores que nos forneceerão os dados. Neste caso, apenas significa implementar e inicializar os listeners apropriados de OnLocationChangedListener e OnAzimuthChangedListener.

Quando tivermos obtido a localização atual poderemos calcular o azimute teórico baseado na teoria apresentada antes.

Quando a orientação do telefone muda, precisamos calcular a precisão, comparar ambos ângulos e se o ângulo atual está dentro da precisão nós podemos mostrar uma seta na tela. É claro que esta abordagem é bem simples, mas ilustra a ideia.

Um método que implementa o cálculo do azimute entre pontos deve se parecer com o seguinte:

Para comparar o azimute calculado e o teórico usaremos os métodos isBetween() e calculateAzimuthAccuracy():

Coisas a Considerar

É claro, este tutorial é bem básico. Meu objetivo foi mostrar a você que não é muito difícil fazer um simples app com realidade aumentada. Algumas coisas a se considerar para continuar esta implementação são:

A precisão dos sensores – infelizmente não é perfeita, principalmente devido ao campo magnético emitido pelo próprio celular.

Provavelmente é necessário implementar um filtro para estabilizar os indicadores na tela. Um exemplo muito bom é fornecido aqui: http://phrogz.net/js/framerate-independent-low-pass-filter.html. A fórmula é escrita em JavaScript, mas é agnóstica de linguagem.

Você provavelmente precisará implementar um filtro de distância para mostrar somente pontos mais próximos. Para conseguir isso, simplesmente calcule a distância entre os pontos:

ra-09

E isto é tudo que você precisa saber para começar sua jornada em realidade aumentada. Eu lhe desafio a usar sua criatividade e imaginação para criar apps realmente inovadores com este recurso. O potencial é enorme, e nosso trabalho como desenvolvedores é de fazê-lo acontecer! Boa sorte!

Este artigo é uma adaptação livre do original https://www.netguru.co/blog/augmented-reality-mobile-android
Você pode encontrar o projeto Android inteiro no GitHub do autor original.

* OBS: curtiu o post? Então dá uma olhada no meu livro de Android clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Criando apps para empresas com Android

Publicado por

Luiz Duarte

Pós-graduado em computação, professor, empreendedor, autor, Agile Coach e programador nas horas vagas.