Interatividade nas futuras aplicações e o Leap Motion

Interatividade nas futuras aplicações e o Leap Motion
gas
gas

Compartilhe

O teclado e o mouse são duas das maneiras mais antigas de se comunicar com um computador pessoal, junto com controles estilo vídeo game. Será que essas são as melhores maneiras para entrada e saída, além de manusear informações em um computador?

leap-motion

Nos últimos tempos, novas ferramentas surgiram que permitem trabalhar com o computador de outra maneira, muito além do número finito de entradas de um teclado ou dos atalhos de movimentos em uma tela touchscreen 2d. Uma delas é o Leap Motion, pequeno o suficiente para ser embutido em notebooks, que já está disponível.

Utilizando um leitor de infravermelho, o Leap cria na memória um mapa 3d do espaço próximo ao seu redor, sendo capaz de detectar mãos e dedos. Note que ele funciona de maneira diferente do Kinect, que consegue analisar a posição de corpos, mas em geral não de maneira tão fina quanto o Leap faz com os dedos.

Sua API é extremamente simples de usar, e criamos uma implementação de um dos jogos de mão mais popular do Brasil: o (como escreve) Jankenpo. A regra é simples, a cada rodada cada um dos dois jogadores escolhe uma de três opções: 2 dedos abertos para tesoura, mão fechada para pedra e mão aberta para papel. Papel ganha de pedra (embrulha), pedra ganha da tesoura (quebra) e tesoura ganha do papel (corta).

Para implementar o Jankenpo basta instanciar um controller do leap em nosso código:

 Controller controller = new Controller(); 

E uma das maneiras de trabalhar com ele é registrar um listener, que será notificado de cada mudança de informação do sensor do Leap:

 controller.addListener(new JankenpoListener()); 

O JoKenPoListener herda de com.leapmotion.leap.Listener e sobrescreve um único método:

 public void onFrame(Controller controller) { } 

Pronto! Agora basta descobrirmos quantos dedos estão visíveis na mão do usuário. Para isso, acessamos a lista de mãos visíveis:

 Frame frame = controller.frame(); HandList maos = frame.hands(); 

Repare que podemos ter 0, 1, 2 ou mais mãos visíveis a qualquer instante. Se nenhuma mão estiver visível, ou se o usuário mostrar mais de uma mão, vamos considerar que ele não escolheu nada, e retornar:

 if(maos.count() != 1) return; 

Depois vamos acessar esta mão:

 Hand primeiraMao = frame.hands().get(0); 

E agora perguntar quantos dedos estão a mostra:

 FingerList dedos = primeiraMao.fingers(); int dedosAMostra = dedos.count(); 

Com o número de dedos a mostra, sabemos dizer se o usuário está fazendo uma tesoura, papel ou pedra:

 if(dedosAMostra==0) selecao = "PEDRA"; else if(dedosAMostra==2) selecao = "TESOURA"; else if(dedosAMostra==5) selecao = "PAPEL"; 

Temos que cuidar dos outros casos, onde uma mão pode ter 1, 3, 4 ou mais de 6 dedos visíveis. No meu caso, vou lidar com 0 ou 1 dedos como sendo pedra, 2 tesoura e 3 ou mais papel:

 if(dedosAMostra < 2) selecao = "PEDRA"; else if(dedosAMostra == 2) selecao = "TESOURA"; else selecao = "PAPEL"; 

Pronto! Basta ligar o LEAP e ver o resultado! Você pode ver uma aplicação swing com o código acima rodando no vídeo a seguir, e o código fonte se encontra aqui.

Mas a API vai muito além de contar quantos dedos estão visíveis, ela pode nos dizer a posição de cada dedo no espaço 3d, e para que ponto estamos apontando, permitindo interagir com objetos. Ela indica o raio da palma da mão, para saber a abertura da mesma, além de também nos notificar de movimentos específicos, como quando o usuário faz um círculo com um dedo.

Agora que você já viu como é fácil trabalhar com o LEAP, dê uma olhada em como é viajar pela terra com o Google Earth usando o aparelho - Minority Report?

A biblioteca do LEAP para Java é um único jar que deve ser incluído que faz a comunicação com os arquivos .dylib em um sistema operacional OSX (a api java para windows e linux é a mesma, mas as bibliotecas de baixo nível que acessamos indiretamente podem variar). E você, o que gostaria de implementar com o LEAP?

Veja outros artigos sobre Inovação & Gestão