Olá, pessoal! Tudo tranquilo?
Vocês já ouviram falar sobre computação holográfica?

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?

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:

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

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:

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:

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é!