Interatividade nas futuras aplicações e o Leap Motion
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?
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?