IoT e Makers

27 jun, 2018

Iniciando o desenvolvimento em realidade mista com o UrhoSharp e Hololens

Publicidade

Olá, pessoal! Tudo tranquilo?

Vocês já ouviram falar sobre computação holográfica?

Jarvis

Essa tecnologia do futuro já não está mais tão no futuro assim, e iniciar o estudo e desenvolvimento sobre algo tão novo pode ser uma tarefa bastante confusa. Como começar? Qual tecnologia utilizar? Quais outros conceitos eu devo me aprofundar? O que é essa tal de Realidade Mista?

Realidade Mista: Pessoas interagindo com o comuptador e com o ambiente a sua volta, aliado à percepção desse computador no mesmo ambiente.

Existem diversas fontes de informação sobre o desenvolvimento para o Hololens, e a maioria dessas fontes utilizam o Unity como ferramenta e engine. O desenvolvimento de uma aplicação holográfica é muito parecido com o desenvolvimento de um jogo, onde o Unity é uma das principais ferramentas utilizadas e é sem dúvidas uma das melhores maneiras de começar, pois conta com muita documentação e muitos exemplos para o início de desenvolvimento. Porém, não é a única!

Esta é uma série de artigos onde conversaremos sobre como iniciar o desenvolvimento de aplicações holográficas utilizando o Urhosharp desde o nível mais básico, até a criação de uma aplicação que possua modelos 3D animados, GUI 2D, comandos de voz, mapeamento espacial e reconhecimento do mundo através de serviços cognitivos. Neste artigo inicial, vamos aprender a iniciar um novo projeto para o Hololens usando o UrhoSharp e alguns conceitos básicos.

Urho3D e UrhoSharp

O Urho3D é uma engine 3D e 2D para jogos com uma API em C++, totalmente open source, que já está há mais de 10 anos ativa em desenvolvimento. Além disso, o UrhoSharp é um binding em C#, adotado pelo Xamarin para trazer essa engine como motor que impulsiona os jogos Android e iOS desenvolvidos na plataforma.

Pois bem, eu, como programador C# de longa data, me senti um pouco desconfortável com o fluxo de trabalho do Unity e resolvi dar uma olhada nessa alternativa um pouco mais direta do Urhosharp.

Em primeiro lugar, vamos precisar de:

  • Windows 10 – 64-bit nas versões Pro, Enterprise ou Education
  • Visual Studio 2017 com a opção de desenvolvimento para Universal Windows Platform instalada.
  • Hololens Emulator
  • Hyper-V habilitado (para usar o emulador do hololens)

Opcional

  • Um amigo que trabalhe com modelagem e animação 3D (se não tiver, pode utilizar os modelos de exemplo disponíveis), ou curiosidade pra dar uma sofrida no Blender.
  • A engine Urho3D compilada com exemplos e ferramentas
  • Um Hololens, ou um device Mixed Reality Headset.

HelloMixedRealityWorld

Verifique se todos os pré-requisitos estão instalados e funcionando.

Agora, a primeira coisa que precisamos pra começar a desenvolver é o template de projeto do UrhoSharp para o Hololens.

No Visual Studio, vamos iniciar um novo projeto e nos templates vamos escolher a opção “Online” para baixar o template do UrhoSharp for Hololens:

Template do projeto do UrhoSharp para Hololens disponível para instalação.

Depois de algumas confirmações para a instalação do template, teremos nosso projeto criado com todas as dependências necessárias:

Estrutura do projeto criado pelo template

O template já vem com um código pronto bem interessante, que mostra um holograma com o planeta Terra e a lua girando em volta dele.

Então vamos compilar e executar esse código pra rodar no emulador. Pra isso, primeiro é necessário alterar a plataforma para x86, e o target para o Hololens Emulator:

Execute, e após isso você irá visualizar a aplicação rodando no emulador:

Você poderá utilizar as teclas A, S, D, W, Q e E para simular a movimentação da sua cabeça, e as teclas de setas do teclado para simular suas pernas. Enter e Space podem ser utilizados para simular o gesto de pinça para selecionar ou segurar um objeto.

Pronto! Fácil, rápido, indolor.

Program.cs

A estrutura básica da aplicação já está no Program.cs. Temos nossa classe principal HelloWorldApplication derivando de StereoApplication, que já é uma classe do UrhoSharp, e que possui tudo que o hololens precisa:

  • Uma cena
  • Objetos de câmera (que representam seus olhos)
  • Objeto de iluminação da cena
  • Manipuladores de gestos
  • Cortana
  • Informações sobre a posição da cabeça do usuário
  • Text to Speech
  • Mapeamento espacial
  • Etc.

Por si só, nossa classe HelloWorldApplication já é extremamente interessante para entendermos como tudo funciona alí dentro, então vamos começar por ela:

Método Start

Nesse método, temos tudo o que acontece quando a aplicação inicia. É onde criamos o mundo inicial que vai ser apresentado ao usuário.

Vamos avaliar o que temos nesse método:

Primeiro, a criação do nó principal da Terra:

Todos os objetos dentro da cena são organizados em Nodes; cada node contém outros nodes, que contêm mais objetos, e cada um passa a ter sua posição e escala baseados no nó pai.

Algo importante é que estamos trabalhando com coordenadas de mundo real. Portanto, posicionamos o nó da Terra a 1.5 metros de distância do usuário e definimos a escala para que ela tenha 30cm de diâmetro. Isso é algo realmente interessante, já que é possível reproduzir um ambiente ou objetos em distâncias e tamanhos reais, sem precisar de grandes cálculos.

Aqui nós podemos ver a criação de um componente dentro do nó da Terra. No nosso caso, esse componente é uma esfera, mas poderia ser um cubo ou um modelo animado, baseado em um modelo 3D (ou até uma Terra plana, se esse for seu caso).

Definimos o material que vai “envelopar” a nossa esfera da Terra, baseado em uma imagem com a textura do planeta. Essa imagem está dentro da pasta Data/Textures:

Textura do planeta Terra

Na sequência, a mesma coisa deve ser feita para criarmos a Lua:

Aqui temos uma diferença: o nó da lua está sendo criado como filho do nó da Terra, e assim estando sujeito à escala e posição da Terra. Quando colocamos a Lua com 0.27 de escala, ela está no tamanho proporcional real de 27% do tamanho da Terra.

Agora só falta criar a animação:

Com esse código, estamos executando uma ação no nó da Terra (que inclui a lua). Essa ação será repetida para sempre (objeto RepeatForever) e executará uma rotação onde a cada segundo o nó da Terra gira quatro graus no eixo Y. Lembrando que o Urho3d utiliza o sistema de coordenadas de mão esquerda:

Sistema de coordenadas dos eixos X,Y e Z

Como a Lua está restrita à posição e escala do nó da Terra, ela também irá acompanhar essa rotação.

A última coisa no método Start é um comando de Text to Speech:

Esse comando simples vai fazer com que o usuário receba uma mensagem por voz, algo muito simples e essencial para passarmos uma mensagem ao usuário em um ambiente virtual.

Interações

Existe mais um método importante no código que realiza a manipulação via gestos (no caso, estamos usando o gesto de segurar e arrastar a Terra):

Antes de realizar a manipulação, é importante notar que o método OnGestureManipulationStarted vai armazenar em um Vector3 a posição atual do nó da Terra. Um objeto Vector3 no UrhoSharp representa uma posição no espaço com três eixos.

Durante a movimentação, somamos a posição original com a nova posição relativa da nossa mão enquanto estamos arrastando, e atribuímos essa nova posição ao nó da Terra.

Como os vetores podem sofrer operações matemáticas, podemos realizar uma alteração nesse código para que a movimentação seja mais rápida:

Com isso, multiplicamos a posição relativa da mão por dois, e assim, dobramos a velocidade com a qual a Terra é deslocada.

Corrigindo o problema da rotação da Terra

Da maneira como a aplicação está, temos um problema. A Lua gira em volta da Terra na mesma velocidade que a Terra gira em torno dela mesma. Isso acontece pois a nossa animação está sendo aplicada ao nó da Terra, e a Lua está dentro desse nó.

Vamos alterar essa rotação para que a Terra seja independente:

A primeira coisa que faremos será criar um outro nó para representar a órbita da Lua e depois, criaremos nosso nó da Lua como filho dessa órbita:

Em seguida, vamos criar uma animação independente para a órbita:

Fazendo isso, ajustamos a rotação da Terra para que ela seja bem mais rápida, girando 50 graus negativos por segundo. Como o nó da orbita é filho do nó da Terra, nós criamos a animação da Lua como 45 graus positivo, compensando assim a rotação da Terra, como podemos ver na animação abaixo:

Como bônus, ainda mantivemos todo o mecanismo da Lua, deixando-a com sua face gravitacionalmente travada à Terra. Devido aos efeitos das marés que deixam sua rotação e translação sincronizadas ao nosso redor. Yeah, science!

E finalmente, fazendo o deploy para o Hololens, esse é o resultado:

Muito legal, né?

Então, por enquanto é isso!

Mais informações:

No próximo artigo, vamos tornar tudo mais interessante, criando modelos 3D animados, trabalhando com os métodos de Update para verificar o status das ações e utilizaremos comandos de voz da Cortana para interação com nossos hologramas.

Até!