Iniciando o desenvolvimento em realidade mista com o UrhoSharp e Hololens
No seguinte artigo, o autor mostra como iniciar um novo projeto para o Hololens usando o UrhoSharp e apresenta alguns conceitos básicos da tecnologia de realidade mista.

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







