HoloLens (1.ª geração) Basics 101: Concluir o projeto com o dispositivo
Importante
Os tutoriais Mixed Reality Academy foram concebidos com HoloLens (1.ª geração), Unity 2017 e Mixed Reality Headsets Envolventes em mente. Como tal, consideramos importante deixar estes tutoriais em vigor para os programadores que ainda estão à procura de orientação no desenvolvimento desses dispositivos. Estes tutoriais não serão atualizados com os conjuntos de ferramentas ou interações mais recentes utilizados para HoloLens 2 e poderão não ser compatíveis com versões mais recentes do Unity. Serão mantidas para continuarem a trabalhar nos dispositivos suportados. Foi publicada uma nova série de tutoriais para HoloLens 2.
Este tutorial irá guiá-lo através de um projeto completo, incorporado no Unity, que demonstra as principais funcionalidades Windows Mixed Reality no HoloLens, incluindo olhar,gestos, entrada de voz, som espacial e mapeamento espacial.
O tutorial demorará aproximadamente 1 hora a ser concluído.
Suporte de dispositivos
Curso | HoloLens | Headsets envolventes |
---|---|---|
MR Basics 101: Concluir o projeto com o dispositivo | ✔️ |
Antes de começar
Pré-requisitos
- Um WINDOWS 10 PC configurado com as ferramentas corretas instaladas.
- Um dispositivo HoloLens configurado para desenvolvimento.
Ficheiros de projeto
- Transfira os ficheiros necessários para o projeto. Requer o Unity 2017.2 ou posterior.
- Se ainda precisar de suporte para o Unity 5.6, utilize esta versão.
- Se ainda precisar de suporte para o Unity 5.5, utilize esta versão.
- Se ainda precisar de suporte para o Unity 5.4, utilize esta versão.
- Remova o arquivo dos ficheiros para o seu ambiente de trabalho ou outra localização fácil de aceder. Mantenha o nome da pasta como Origami.
Nota
Se quiser ver o código fonte antes de transferir, este estará disponível no GitHub.
Capítulo 1 - Mundo "Holo"
Neste capítulo, vamos configurar o nosso primeiro projeto do Unity e percorrer o processo de compilação e implementação.
Objetivos
- Configurar o Unity para desenvolvimento holográfico.
- Criar um holograma.
- Veja um holograma que criou.
Instruções
- Inicie o Unity.
- Selecione Abrir.
- Introduza a localização como a pasta Origami que desvendou anteriormente.
- Selecione Origami e clique em Selecionar Pasta.
- Uma vez que o projeto Origami não contém uma cena, guarde a cena predefinida vazia num novo ficheiro com:Cenário guardar ficheiro / como.
- Dê o nome Origami à nova cena e prima o botão Guardar .
Configurar a câmara virtual principal
- No Painel hierarquia, selecione Câmara Principal.
- No Inspetor , defina a sua posição de transformação para 0,0,0.
- Localize a propriedade Limpar Sinalizadores e altere o menu pendente de Skybox para Cor sólida.
- Clique no campo Fundo para abrir um seletor de cores.
- Defina R, G, B e A como 0.
Configurar o cenário
- No Painel hierarquia, clique em Criar e Criar Vazio.
- Clique com o botão direito do rato no novo GameObject e selecione Mudar o Nome. Mude o nome do GameObject para OrigamiCollection.
- Na pasta Hologramas no Painel de Projeto (expanda Recursos e selecione Hologramas ou faça duplo clique na pasta Hologramas no Painel de Projeto):
- Arraste Fase para a Hierarquia para ser um subordinado de OrigamiCollection.
- Arraste Sphere1 para a Hierarquia para ser subordinado de OrigamiCollection.
- Arraste Sphere2 para a Hierarquia para ser subordinado de OrigamiCollection.
- Clique com o botão direito do rato no objeto Luz Direcional no Painel de Hierarquia e selecione Eliminar.
- Na pasta Hologramas , arraste Luzes para a raiz do Painel de Hierarquia.
- Na Hierarquia, selecione OrigamiCollection.
- No Inspetor, defina a posição de transformação como 0, -0,5, 2.0.
- Prima o botão Reproduzir no Unity para pré-visualizar os hologramas.
- Deverá ver os objetos Origami na janela de pré-visualização.
- Prima Reproduzir uma segunda vez para parar o modo de pré-visualização.
Exportar o projeto do Unity para o Visual Studio
No Unity, selecione Definições de Compilação de Ficheiros>.
Selecione Plataforma Universal do Windows na lista Plataforma e clique em Mudar de Plataforma.
Defina o SDK como Universal 10 e o Tipo de Compilação como D3D.
Verifique Projetos C# do Unity.
Clique em Adicionar Cenas Abertas para adicionar a cena.
Clique em Compilar.
Na janela do explorador de ficheiros apresentada, crie uma Nova Pasta com o nome "Aplicação".
Clique único na Pasta da Aplicação.
Prima Selecionar Pasta.
Quando o Unity estiver concluído, será apresentada uma janela de Explorador de Ficheiros.
Abra a pasta Aplicação .
Abrir (duplo clique) Origami.sln.
Com a barra de ferramentas superior no Visual Studio, altere o destino de Depuração para Versão e de ARM para X86.
Clique na seta junto ao botão Dispositivo e selecione Máquina Remota para implementar através de Wi-Fi.
- Defina o Endereço para o nome ou endereço IP do HoloLens. Se não souber o endereço IP do seu dispositivo, procure em Definições > Rede & Opções Avançadas da Internet > ou pergunte à Cortana "Olá Cortana, Qual é o meu endereço IP?"
- Se o HoloLens estiver ligado através de USB, poderá selecionar Dispositivo para implementar através de USB.
- Deixe o Modo de Autenticação definido como Universal.
- Clique em Selecionar
Clique em Depurar > Iniciar Sem depuração ou prima Ctrl + F5. Se esta for a primeira vez que implementa no seu dispositivo, terá de o emparelhar com o Visual Studio.
O projeto Origami irá agora compilar, implementar no holoLens e, em seguida, executar.
Coloque o HoloLens e veja os seus novos hologramas.
Capítulo 2 - Olhar
Neste capítulo, vamos introduzir a primeira de três formas de interagir com os seus hologramas.
Objetivos
- Visualize o olhar através de um cursor bloqueado pelo mundo.
Instruções
- Voltar ao projeto do Unity e feche a janela Definições de Compilação se ainda estiver aberta.
- Selecione a pasta Hologramas no painel Projeto.
- Arraste o objeto Cursor para o painel Hierarquia ao nível da raiz.
- Faça duplo clique no objeto Cursor para dar uma vista de olhos.
- Clique com o botão direito do rato na pasta Scripts no painel Projeto.
- Clique no submenu Criar .
- Selecione Script C#.
- Atribua o nome WorldCursor ao script. Nota: o nome é sensível às maiúsculas e minúsculas. Não precisa de adicionar a extensão .cs.
- Selecione o objeto Cursor no painel Hierarquia.
- Arraste e largue o script WorldCursor no painel Inspetor.
- Faça duplo clique no script WorldCursor para o abrir no Visual Studio.
- Copie e cole este código em WorldCursor.cs e em Guardar Tudo.
using UnityEngine;
public class WorldCursor : MonoBehaviour
{
private MeshRenderer meshRenderer;
// Use this for initialization
void Start()
{
// Grab the mesh renderer that's on the same object as this script.
meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
}
// Update is called once per frame
void Update()
{
// Do a raycast into the world based on the user's
// head position and orientation.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
{
// If the raycast hit a hologram...
// Display the cursor mesh.
meshRenderer.enabled = true;
// Move the cursor to the point where the raycast hit.
this.transform.position = hitInfo.point;
// Rotate the cursor to hug the surface of the hologram.
this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
}
else
{
// If the raycast did not hit a hologram, hide the cursor mesh.
meshRenderer.enabled = false;
}
}
}
- Recrie a aplicação a partir das Definições de Compilação de Ficheiros>.
- Regresse à solução do Visual Studio anteriormente utilizada para implementar no HoloLens.
- Selecione "Recarregar Tudo" quando lhe for pedido.
- Clique em Depurar -> Iniciar Sem depuração ou prima Ctrl + F5.
- Agora, observe a cena e repare como o cursor interage com a forma de objetos.
Capítulo 3 - Gestos
Neste capítulo, vamos adicionar suporte para gestos. Quando o utilizador selecionar uma esfera de papel, faremos com que a esfera caia ao ativar a gravidade utilizando o motor de física do Unity.
Objetivos
- Controle os hologramas com o gesto Selecionar.
Instruções
Vamos começar por criar um script e, em seguida, podemos detetar o gesto Selecionar.
- Na pasta Scripts , crie um script com o nome GazeGestureManager.
- Arraste o script GazeGestureManager para o objeto OrigamiCollection na Hierarquia.
- Abra o script GazeGestureManager no Visual Studio e adicione o seguinte código:
using UnityEngine;
using UnityEngine.XR.WSA.Input;
public class GazeGestureManager : MonoBehaviour
{
public static GazeGestureManager Instance { get; private set; }
// Represents the hologram that is currently being gazed at.
public GameObject FocusedObject { get; private set; }
GestureRecognizer recognizer;
// Use this for initialization
void Awake()
{
Instance = this;
// Set up a GestureRecognizer to detect Select gestures.
recognizer = new GestureRecognizer();
recognizer.Tapped += (args) =>
{
// Send an OnSelect message to the focused object and its ancestors.
if (FocusedObject != null)
{
FocusedObject.SendMessageUpwards("OnSelect", SendMessageOptions.DontRequireReceiver);
}
};
recognizer.StartCapturingGestures();
}
// Update is called once per frame
void Update()
{
// Figure out which hologram is focused this frame.
GameObject oldFocusObject = FocusedObject;
// Do a raycast into the world based on the user's
// head position and orientation.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
{
// If the raycast hit a hologram, use that as the focused object.
FocusedObject = hitInfo.collider.gameObject;
}
else
{
// If the raycast did not hit a hologram, clear the focused object.
FocusedObject = null;
}
// If the focused object changed this frame,
// start detecting fresh gestures again.
if (FocusedObject != oldFocusObject)
{
recognizer.CancelGestures();
recognizer.StartCapturingGestures();
}
}
}
- Crie outro script na pasta Scripts, desta vez denominado Comandos do Sphere.
- Expanda o objeto OrigamiCollection na vista Hierarquia.
- Arraste o script SphereCommands para o objeto Sphere1 no painel Hierarquia.
- Arraste o script SphereCommands para o objeto Sphere2 no painel Hierarquia.
- Abra o script no Visual Studio para edição e substitua o código predefinido pelo seguinte:
using UnityEngine;
public class SphereCommands : MonoBehaviour
{
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// If the sphere has no Rigidbody component, add one to enable physics.
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
}
- Exporte, crie e implemente a aplicação no HoloLens.
- Olhe para uma das esferas.
- Efetue o gesto de seleção e watch a esfera cair sobre a superfície abaixo.
Capítulo 4 - Voz
Neste capítulo, vamos adicionar suporte para dois comandos de voz: "Repor mundo" para devolver as esferas removidas à sua localização original e "Largar esfera" para fazer com que a esfera caia.
Objetivos
- Adicione comandos de voz que ouvem sempre em segundo plano.
- Crie um holograma que reaja a um comando de voz.
Instruções
- Na pasta Scripts , crie um script com o nome SpeechManager.
- Arraste o script SpeechManager para o objeto OrigamiCollection na Hierarquia
- Abra o script SpeechManager no Visual Studio.
- Copie e cole este código em SpeechManager.cs e Guarde Tudo:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;
public class SpeechManager : MonoBehaviour
{
KeywordRecognizer keywordRecognizer = null;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
// Use this for initialization
void Start()
{
keywords.Add("Reset world", () =>
{
// Call the OnReset method on every descendant object.
this.BroadcastMessage("OnReset");
});
keywords.Add("Drop Sphere", () =>
{
var focusObject = GazeGestureManager.Instance.FocusedObject;
if (focusObject != null)
{
// Call the OnDrop method on just the focused object.
focusObject.SendMessage("OnDrop", SendMessageOptions.DontRequireReceiver);
}
});
// Tell the KeywordRecognizer about our keywords.
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
// Register a callback for the KeywordRecognizer and start recognizing!
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
keywordRecognizer.Start();
}
private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
System.Action keywordAction;
if (keywords.TryGetValue(args.text, out keywordAction))
{
keywordAction.Invoke();
}
}
}
- Abra o script SphereCommands no Visual Studio.
- Atualize o script para ler da seguinte forma:
using UnityEngine;
public class SphereCommands : MonoBehaviour
{
Vector3 originalPosition;
// Use this for initialization
void Start()
{
// Grab the original local position of the sphere when the app starts.
originalPosition = this.transform.localPosition;
}
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// If the sphere has no Rigidbody component, add one to enable physics.
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
// Called by SpeechManager when the user says the "Reset world" command
void OnReset()
{
// If the sphere has a Rigidbody component, remove it to disable physics.
var rigidbody = this.GetComponent<Rigidbody>();
if (rigidbody != null)
{
rigidbody.isKinematic = true;
Destroy(rigidbody);
}
// Put the sphere back into its original local position.
this.transform.localPosition = originalPosition;
}
// Called by SpeechManager when the user says the "Drop sphere" command
void OnDrop()
{
// Just do the same logic as a Select gesture.
OnSelect();
}
}
- Exporte, crie e implemente a aplicação no HoloLens.
- Olhe para uma das esferas e diga "Drop Sphere".
- Diga "Repor Mundo" para os trazer de volta às suas posições iniciais.
Capítulo 5 - Som espacial
Neste capítulo, vamos adicionar música à aplicação e, em seguida, acionar efeitos sonoros em determinadas ações. Vamos utilizar som espacial para dar aos sons uma localização específica no espaço 3D.
Objetivos
- Ouça hologramas no seu mundo.
Instruções
- No Unity, selecione no menu superior Editar > Áudio das Definições > do Projeto
- No Painel de Inspetores do lado direito, localize a definição Plug-in spatializer e selecione Espacializador MS HRTF.
- Na pasta Hologramas no painel Projeto, arraste o objeto Ambiente para o objeto OrigamiCollection no Painel de Hierarquia.
- Selecione OrigamiCollection e localize o componente Origem de Áudio no painel Inspetor. Altere estas propriedades:
- Verifique a propriedade Spatialize .
- Verifique a Reprodução Ativada.
- Altere o Spatial Blend para 3D ao arrastar o controlo de deslize para a direita. O valor deve mudar de 0 para 1 quando mover o controlo de deslize.
- Verifique a propriedade Loop .
- Expanda Definições de Som 3D e introduza 0,1 para Nível do Doppler.
- Defina o Rolloff de Volume como Rolloff Logarítmico.
- Defina a Distância Máxima como 20.
- Na pasta Scripts , crie um script com o nome SphereSounds.
- Arraste e largue SphereSounds para os objetos Sphere1 e Sphere2 na Hierarquia.
- Abra o SphereSounds no Visual Studio, atualize o seguinte código e Guarde Tudo.
using UnityEngine;
public class SphereSounds : MonoBehaviour
{
AudioSource impactAudioSource = null;
AudioSource rollingAudioSource = null;
bool rolling = false;
void Start()
{
// Add an AudioSource component and set up some defaults
impactAudioSource = gameObject.AddComponent<AudioSource>();
impactAudioSource.playOnAwake = false;
impactAudioSource.spatialize = true;
impactAudioSource.spatialBlend = 1.0f;
impactAudioSource.dopplerLevel = 0.0f;
impactAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
impactAudioSource.maxDistance = 20f;
rollingAudioSource = gameObject.AddComponent<AudioSource>();
rollingAudioSource.playOnAwake = false;
rollingAudioSource.spatialize = true;
rollingAudioSource.spatialBlend = 1.0f;
rollingAudioSource.dopplerLevel = 0.0f;
rollingAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
rollingAudioSource.maxDistance = 20f;
rollingAudioSource.loop = true;
// Load the Sphere sounds from the Resources folder
impactAudioSource.clip = Resources.Load<AudioClip>("Impact");
rollingAudioSource.clip = Resources.Load<AudioClip>("Rolling");
}
// Occurs when this object starts colliding with another object
void OnCollisionEnter(Collision collision)
{
// Play an impact sound if the sphere impacts strongly enough.
if (collision.relativeVelocity.magnitude >= 0.1f)
{
impactAudioSource.Play();
}
}
// Occurs each frame that this object continues to collide with another object
void OnCollisionStay(Collision collision)
{
Rigidbody rigid = gameObject.GetComponent<Rigidbody>();
// Play a rolling sound if the sphere is rolling fast enough.
if (!rolling && rigid.velocity.magnitude >= 0.01f)
{
rolling = true;
rollingAudioSource.Play();
}
// Stop the rolling sound if rolling slows down.
else if (rolling && rigid.velocity.magnitude < 0.01f)
{
rolling = false;
rollingAudioSource.Stop();
}
}
// Occurs when this object stops colliding with another object
void OnCollisionExit(Collision collision)
{
// Stop the rolling sound if the object falls off and stops colliding.
if (rolling)
{
rolling = false;
impactAudioSource.Stop();
rollingAudioSource.Stop();
}
}
}
- Guarde o script e regresse ao Unity.
- Exporte, crie e implemente a aplicação no HoloLens.
- Aproxime-se cada vez mais do Palco e vire de um lado para o outro para ouvir os sons mudarem.
Capítulo 6 - Mapeamento espacial
Agora vamos utilizar o mapeamento espacial para colocar a placa de jogo num objeto real no mundo real.
Objetivos
- Traga o seu mundo real para o mundo virtual.
- Coloque os hologramas onde são mais importantes para si.
Instruções
- No Unity, clique na pasta Hologramas no painel Projeto.
- Arraste o recurso Mapeamento Espacial para a raiz da Hierarquia.
- Clique no objeto Mapeamento Espacial na Hierarquia.
- No painel Inspetor, altere as seguintes propriedades:
- Selecione a caixa Desenhar Malhas Visuais .
- Localize Desenhar Material e clique no círculo à direita. Escreva "wireframe" no campo de pesquisa na parte superior. Clique no resultado e, em seguida, feche a janela. Ao fazê-lo, o valor de Material de Desenho deve ser definido como Wireframe.
- Exporte, crie e implemente a aplicação no HoloLens.
- Quando a aplicação é executada, uma malha de wireframe sobrepõe-se ao seu mundo real.
- Veja como uma esfera ondulante cairá do palco e no chão!
Agora, vamos mostrar-lhe como mover o OrigamiCollection para uma nova localização:
- Na pasta Scripts , crie um script com o nome TapToPlaceParent.
- Na Hierarquia, expanda OrigamiCollection e selecione o objeto Fase .
- Arraste o script TapToPlaceParent para o objeto Fase.
- Abra o script TapToPlaceParent no Visual Studio e atualize-o para ser o seguinte:
using UnityEngine;
public class TapToPlaceParent : MonoBehaviour
{
bool placing = false;
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// On each Select gesture, toggle whether the user is in placing mode.
placing = !placing;
// If the user is in placing mode, display the spatial mapping mesh.
if (placing)
{
SpatialMapping.Instance.DrawVisualMeshes = true;
}
// If the user is not in placing mode, hide the spatial mapping mesh.
else
{
SpatialMapping.Instance.DrawVisualMeshes = false;
}
}
// Update is called once per frame
void Update()
{
// If the user is in placing mode,
// update the placement to match the user's gaze.
if (placing)
{
// Do a raycast into the world that will only hit the Spatial Mapping mesh.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
30.0f, SpatialMapping.PhysicsRaycastMask))
{
// Move this object's parent object to
// where the raycast hit the Spatial Mapping mesh.
this.transform.parent.position = hitInfo.point;
// Rotate this object's parent object to face the user.
Quaternion toQuat = Camera.main.transform.localRotation;
toQuat.x = 0;
toQuat.z = 0;
this.transform.parent.rotation = toQuat;
}
}
}
}
- Exportar, compilar e implementar a aplicação.
- Agora, deverá conseguir colocar o jogo numa localização específica ao olhar para o mesmo, ao utilizar o gesto Selecionar e, em seguida, mudar para uma nova localização e utilizar novamente o gesto Selecionar.
Capítulo 7 - Diversão holográfica
Objetivos
- Revele a entrada para um submundo holográfico.
Instruções
Agora, vamos mostrar-lhe como descobrir o submundo holográfico:
- Na pasta Hologramas no Painel de Projeto:
- Arraste o Submundo para a Hierarquia para ser um subordinado de OrigamiCollection.
- Na pasta Scripts , crie um script com o nome HitTarget.
- Na Hierarquia, expanda OrigamiCollection.
- Expanda o objeto Fase e selecione o objeto De destino (ventilador azul).
- Arraste o script HitTarget para o objeto Destino .
- Abra o script HitTarget no Visual Studio e atualize-o para ser o seguinte:
using UnityEngine;
public class HitTarget : MonoBehaviour
{
// These public fields become settable properties in the Unity editor.
public GameObject underworld;
public GameObject objectToHide;
// Occurs when this object starts colliding with another object
void OnCollisionEnter(Collision collision)
{
// Hide the stage and show the underworld.
objectToHide.SetActive(false);
underworld.SetActive(true);
// Disable Spatial Mapping to let the spheres enter the underworld.
SpatialMapping.Instance.MappingEnabled = false;
}
}
- No Unity, selecione o objeto Destino .
- Duas propriedades públicas estão agora visíveis no componente Hit Target e precisam de referenciar objetos na nossa cena:
- Arraste Submundo do painel Hierarquia para a propriedade Submundo no componente Hit Target .
- Arraste a Fase do painel Hierarquia para a propriedade Objeto para Ocultar no componente Hit Target .
- Exportar, criar e implementar a aplicação.
- Coloque a Coleção Origami no chão e, em seguida, utilize o gesto Selecionar para fazer uma queda de esfera.
- Quando a esfera atinge o alvo (ventilador azul), ocorrerá uma explosão. A coleção será ocultada e será apresentado um buraco no submundo.
O fim
E este é o fim deste tutorial!
Aprendeu:
- Como criar uma aplicação holográfica no Unity.
- Como utilizar o olhar, gesto, voz, som e mapeamento espacial.
- Como criar e implementar uma aplicação com o Visual Studio.
Está pronto para começar a criar a sua própria experiência holográfica!