HoloLens (1.ª geração) Basics 101: Concluir o projeto com o dispositivo
Artigo
12/07/2023
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.
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.
cs
using UnityEngine;
publicclassWorldCursor : MonoBehaviour
{
private MeshRenderer meshRenderer;
// Use this for initializationvoidStart()
{
// Grab the mesh renderer that's on the same object as this script.
meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
}
// Update is called once per framevoidUpdate()
{
// 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:
cs
using UnityEngine;
using UnityEngine.XR.WSA.Input;
publicclassGazeGestureManager : MonoBehaviour
{
publicstatic GazeGestureManager Instance { get; privateset; }
// Represents the hologram that is currently being gazed at.public GameObject FocusedObject { get; privateset; }
GestureRecognizer recognizer;
// Use this for initializationvoidAwake()
{
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 framevoidUpdate()
{
// 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:
cs
using UnityEngine;
publicclassSphereCommands : MonoBehaviour
{
// Called by GazeGestureManager when the user performs a Select gesturevoidOnSelect()
{
// 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:
cs
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;
publicclassSpeechManager : MonoBehaviour
{
KeywordRecognizer keywordRecognizer = null;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
// Use this for initializationvoidStart()
{
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();
}
privatevoidKeywordRecognizer_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:
cs
using UnityEngine;
publicclassSphereCommands : MonoBehaviour
{
Vector3 originalPosition;
// Use this for initializationvoidStart()
{
// 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 gesturevoidOnSelect()
{
// 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" commandvoidOnReset()
{
// 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" commandvoidOnDrop()
{
// 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.
cs
using UnityEngine;
publicclassSphereSounds : MonoBehaviour
{
AudioSource impactAudioSource = null;
AudioSource rollingAudioSource = null;
bool rolling = false;
voidStart()
{
// 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 objectvoidOnCollisionEnter(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 objectvoidOnCollisionStay(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.elseif (rolling && rigid.velocity.magnitude < 0.01f)
{
rolling = false;
rollingAudioSource.Stop();
}
}
// Occurs when this object stops colliding with another objectvoidOnCollisionExit(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:
cs
using UnityEngine;
publicclassTapToPlaceParent : MonoBehaviour
{
bool placing = false;
// Called by GazeGestureManager when the user performs a Select gesturevoidOnSelect()
{
// 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 framevoidUpdate()
{
// 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:
cs
using UnityEngine;
publicclassHitTarget : 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 objectvoidOnCollisionEnter(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!
Este módulo é um projeto de desafio onde você construirá um aplicativo de Realidade Aumentada para HoloLens 2. Ele orientará um desenvolvedor sobre como criar um aplicativo de ponta a ponta com a ajuda de examinar uma amostra existente.