HoloLens (1º género) Básicos 101: Projeto completo com dispositivo


Importante

Os tutoriais da Mixed Reality Academy foram desenhados com HoloLens (1ª gen), Unidade 2017 e Auscultadores Imersivos de Realidade Mista em mente. Como tal, sentimos que é importante deixar estes tutoriais no lugar para os desenvolvedores que ainda estão à procura de orientação no desenvolvimento para esses dispositivos. Estes tutoriais não serão atualizados com os mais recentes instrumentos ou interações que estão a ser utilizados para HoloLens 2 e podem não ser compatíveis com versões mais recentes da Unidade. Serão mantidos para continuar a trabalhar nos dispositivos suportados. Uma nova série de tutoriais foi publicada para HoloLens 2.


Este tutorial irá acompanhar-te através de um projeto completo, construído em Unidade, que demonstra características Windows Mixed Reality fundamentais em HoloLens incluindo olhar, gestos, entrada de voz, som espacial e mapeamento espacial.

O tutorial levará aproximadamente 1 hora para ser concluído.

Suporte de dispositivos

Curso HoloLens Auscultadores imersivos
MR Basics 101: Projeto completo com dispositivo ✔️

Antes de começar

Pré-requisitos

Project ficheiros

  • Descarregue os ficheiros exigidos pelo projeto. Requer Unidade 2017.2 ou mais tarde.
    • Se ainda precisar de suporte da Unidade 5.6, utilize esta versão.
    • Se ainda precisar de suporte da Unidade 5.5, utilize esta versão.
    • Se ainda precisar de suporte unidade 5.4, utilize esta versão.
  • Desaprove os ficheiros para o seu ambiente de trabalho ou outro local de fácil acesso. Mantenha o nome da pasta como Origami.

Nota

Se quiser ver o código fonte antes de descarregar, está disponível no GitHub.

Capítulo 1 - Mundo "Holo"

Neste capítulo, vamos configurar o nosso primeiro projeto de Unidade e passar pelo processo de construção e implantação.

Objetivos

  • Criar unidade para o desenvolvimento holográfico.
  • Faça um holograma.
  • Veja um holograma que fez.

Instruções

  • Iniciar a Unidade.
  • Selecione Abrir.
  • Introduza o local como a pasta Origami que anteriormente não arquiva.
  • Selecione Origami e clique em Selecionar Pasta.
  • Uma vez que o projeto Origami não contém uma cena, guarde a cena padrão vazia para um novo ficheiro utilizando: Cena de salvamento de / ficheiros As.
  • Nomeie a nova cena Origami e prima o botão Guardar.

Configurar a câmara virtual principal

  • No Painel Hierárquico, selecione a Câmara Principal.
  • No Inspetor fixou a sua posição de transformação em 0,0,0.
  • Encontre a propriedade Clear Flags e mude o dropdown da Skybox para a cor Solid.
  • Clique no campo de fundo para abrir um apanhador de cores.
  • Set R, G, B e A a 0.

Configurar a cena

  • No Painel Hierárquico, clique em Criar e Criar Vazio.
  • Clique com o botão direito no novo GameObject e selecione Renomear. Mude o nome do GameObject para OrigamiCollection.
  • A partir da pasta Hologramas no Painel Project (expandir ativos e selecionar Hologramas ou clicar duas vezes na pasta Hologramas no Painel Project):
    • Drag Stage para a Hierarquia para ser filho de OrigamiCollection.
    • Arraste a Esfera1 para a Hierarquia para ser filho de OrigamiCollection.
    • Arraste a Esfera2 para a Hierarquia para ser filho de OrigamiCollection.
  • Clique com o botão direito do objeto Luz Direcional no Painel de Hierarquia e selecione Delete.
  • Da pasta Hologramas, arraste as luzes para a raiz do Painel Hierárquica.
  • Na Hierarquia, selecione a Câmara de Origami.
  • No Inspetor, coloque a posição de transformação em 0, -0,5, 2.0.
  • Prima o botão Reproduzir unidade para visualizar os hologramas.
  • Deve 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 de Unidade para Visual Studio

  • In Unitity selecione File > Build Definições.

  • Selecione Plataforma de Windows Universal na lista de plataformas e clique na Plataforma Switch.

  • Coloque o SDK no Universal 10 e construa o tipo para D3D.

  • Verifique projetos de unidade C#.

  • Clique em Adicionar Cenas Abertas para adicionar a cena.

  • Clique em Construir.

  • Na janela do explorador de ficheiros que aparece, crie uma Nova Pasta chamada "App".

  • Clique numa única palavra na Pasta de Aplicação.

  • Prima Selecionar Pasta.

  • Quando a unidade estiver terminada, aparecerá uma janela do Explorador de Ficheiros.

  • Abra a pasta App.

  • Abra (clique duplo) Origami.sln.

  • Utilizando a barra de ferramentas superior em Visual Studio, altere o alvo de Debug para Release e de ARM para X86.

  • Clique na seta ao lado do botão Dispositivo e selecione a Máquina Remota para implementar sobre o Wi-Fi.

    • Desaponhe o Endereço no nome ou endereço IP do seu HoloLens. Se não conhece o endereço IP do seu dispositivo, procure na rede Definições > & Internet > Opções Avançadas ou pergunte-Cortana "Hey Cortana, Qual é o meu endereço IP?"
    • Se o HoloLens estiver ligado por USB, pode em vez disso selecionar o Dispositivo para implantar em USB.
    • Deixe o modo de autenticação definido para a Universal.
    • Clique em Selecionar
  • Clique em Debug > Start Sem depurar ou prima Ctrl + F5. Se esta for a primeira vez que se implanta no seu dispositivo, terá de emparelhá-lo com Visual Studio.

  • O projeto Origami vai agora construir, implantar para o seu HoloLens, e depois executar.

  • Ponha o HoloLens e olhe em volta para ver 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 seu olhar usando um cursor bloqueado pelo mundo.

Instruções

  • Volte para o seu projeto de Unidade, e feche a janela Build Definições se ainda estiver aberto.
  • Selecione a pasta Hologramas no painel Project.
  • Arraste o objeto Cursor para o painel da Hierarquia ao nível da raiz.
  • Clique duas vezes no objeto Cursor para ver mais de perto.
  • Clique à direita na pasta Scripts no painel Project.
  • Clique no sub-menu Criar.
  • Selecione C# Script.
  • Nomeie o guião WorldCursor. Nota: O nome é sensível a casos. Não é necessário adicionar a extensão .cs.
  • Selecione o objeto Cursor no painel hierarquia.
  • Arraste e deixe cair o guião WorldCursor no painel do Inspetor.
  • Clique duas vezes no script WorldCursor para o abrir em Visual Studio.
  • Copie e cole este código no WorldCursor.cs e Save All.
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;
        }
    }
}
  • Reconstruir a aplicação a partir de > De Arquivos Definições.
  • Volte à solução Visual Studio anteriormente utilizada para implantar no seu HoloLens.
  • Selecione 'Reload All' quando solicitado.
  • Clique em Debug -> Iniciar Sem depurar ou prima Ctrl + F5.
  • Agora olhe ao redor da cena e note como o cursor interage com a forma dos objetos.

Capítulo 3 - Gestos

Neste capítulo, vamos adicionar apoio para gestos. Quando o utilizador selecionar uma esfera de papel, faremos a esfera cair ligando a gravidade usando o motor de física da Unidade.

Objetivos

  • Controle os hologramas com o gesto Select.

Instruções

Começaremos por criar um script e depois podemos detetar o gesto Select.

  • Na pasta Scripts, crie um script chamado GazeGestureManager.
  • Arraste o guião GazeGestureManager para o objeto OrigamiCollection na Hierarquia.
  • Abra o script GazeGestureManager em 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 chamado SphereCommands.
  • Expandir o objeto OrigamiCollection na vista da Hierarquia.
  • Arraste o script SphereCommands para o objeto Sphere1 no painel da Hierarquia.
  • Arraste o script SphereCommands para o objeto Sphere2 no painel da Hierarquia.
  • Abra o script em Visual Studio para edição e substitua o código predefinido por este:
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, construa e implemente a app para o seu HoloLens.
  • Olhe para uma das esferas.
  • Execute o gesto de seleção e veja a esfera cair sobre a superfície abaixo.

Capítulo 4 - Voz

Neste capítulo, adicionaremos suporte a dois comandos de voz: "Reset world" para devolver as esferas caídas à sua localização original, e "Drop sphere" para fazer a esfera cair.

Objetivos

  • Adicione comandos de voz que sempre ouvem em segundo plano.
  • Crie um holograma que reaja a um comando de voz.

Instruções

  • Na pasta Scripts, crie um script chamado SpeechManager.
  • Arraste o guião do SpeechManager para o objeto OrigamiCollection na Hierarquia
  • Abra o guião Do Porta-discursos em Visual Studio.
  • Copie e cole este código em SpeechManager.cs e Save All:
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 roteiro SphereCommands em 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, construa e implemente a app para o seu HoloLens.
  • Olhe para uma das esferas, e diga "Esfera de Lançamento".
  • Diga "Reset World" para trazê-los de volta às suas posições iniciais.

Capítulo 5 - Som espacial

Neste capítulo, vamos adicionar música à app e, em seguida, desencadear efeitos sonoros em determinadas ações. Vamos usar som espacial para dar aos sons uma localização específica no espaço 3D.

Objetivos

  • Ouve hologramas no teu mundo.

Instruções

  • Em Unidade selecione a partir do menu superior Editar > Project Definições > Áudio
  • No Painel de Inspetores do lado direito, encontre a definição de Plugin Spatializer e selecione o Spatializer MS HRTF.
  • A partir da pasta Hologramas no painel Project, arraste o objeto Ambience para o objeto OrigamiCollection no Painel Hierárquico.
  • Selecione OrigamiCollection e encontre o componente Audio Source no painel do Inspetor. Alterar estas propriedades:
    • Verifique a propriedade Spatialize.
    • Verifique a reprodução no despertar.
    • Mude a Mistura Espacial para 3D arrastando o slider até à direita. O valor deve mudar de 0 para 1 quando mover o deslizador.
    • Verifique a propriedade Loop.
    • Expandir o som 3D Definições, e introduza 0.1 para o Nível Doppler.
    • Definir Volume Rolloff para Logarithmic Rolloff.
    • Definir distância máxima a 20.
  • Na pasta Scripts, crie um script chamado SphereSounds.
  • Arraste e largue esferas para os objetos Sphere1 e Sphere2 na Hierarquia.
  • Abra os exames de esferas em 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();
        }
    }
}
  • Salve o guião e regresse à Unidade.
  • Exporte, construa e implemente a app para o seu HoloLens.
  • Aproxime-se cada vez mais do Palco e vire-se de um lado para o outro para ouvir a mudança dos sons.

Capítulo 6 - Mapeamento espacial

Agora vamos usar o mapeamento espacial para colocar o tabuleiro num objeto real no mundo real.

Objetivos

  • Traga o seu mundo real para o mundo virtual.
  • Coloque os hologramas onde mais importam para si.

Instruções

  • Em Unidade, clique na pasta Hologramas no painel Project.
  • Arraste o ativo de Mapeamento Espacial para a raiz da Hierarquia.
  • Clique no objeto de mapeamento espacial na hierarquia.
  • No painel de inspetores, altere as seguintes propriedades:
    • Verifique a caixa de malhas visuais draw.
    • Localize o material e clique no círculo à direita. Digite "wireframe" no campo de pesquisa no topo. Clique no resultado e feche a janela. Quando o fizeres, o valor do Material de desenho deve ser definido para Wireframe.
  • Exporte, construa e implemente a app para o seu HoloLens.
  • Quando a aplicação for executado, uma malha de arame irá sobrepor o seu mundo real.
  • Vejam como uma esfera rolante vai cair do palco e cair no chão!

Agora vamos mostrar-lhe como mover o OrigamiCollection para um novo local:

  • Na pasta Scripts, crie um script chamado TapToPlaceParent.
  • Na Hierarquia, expanda a OrigamiCollection e selecione o objeto Stage.
  • Arraste o script TapToPlaceParent para o objeto Stage.
  • Abra o script TapToPlaceParent em 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, construir e implementar a aplicação.
  • Agora você deve ser capaz de colocar o jogo em um local específico, olhando para ele, usando o gesto Select e, em seguida, movendo-se para um novo local, e usando novamente o gesto Select.

Capítulo 7 - Diversão holográfica

Objetivos

  • Revele a entrada de um submundo holográfico.

Instruções

Agora vamos mostrar-lhe como descobrir o submundo holográfico:

  • Da pasta Hologramas do Painel Project:
    • Arraste o Submundo para a Hierarquia para ser filho de OrigamiCollection.
  • Na pasta Scripts, crie um script chamado HitTarget.
  • Na Hierarquia, expanda a Câmara de OrigamiCollection.
  • Expanda o objeto Stage e selecione o objeto Target (ventilador azul).
  • Arraste o script HitTarget para o objeto Target.
  • Abra o script HitTarget em 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;
    }
}
  • Em Unidade, selecione o objeto Alvo.
  • Duas propriedades públicas estão agora visíveis no componente Hit Target e precisam de referência de objetos na nossa cena:
    • Arraste o Submundo do painel da Hierarquia para a propriedade do Underworld no componente Hit Target.
    • Arraste o palco do painel da hierarquia para a propriedade Object to Hide no componente Hit Target.
  • Exportar, construir e implementar a aplicação.
  • Coloque a Coleção Origami no chão e, em seguida, use o gesto Select para fazer cair a esfera.
  • Quando a esfera atingir o alvo (ventilador azul), ocorrerá uma explosão. A coleção será escondida e um buraco para o submundo aparecerá.

Fim

E é o fim deste tutorial!

Aprendeu:

  • Como criar uma aplicação holográfica em Unidade.
  • Como fazer uso do olhar, gesto, voz, som e mapeamento espacial.
  • Como construir e implementar uma aplicação utilizando Visual Studio.

Está agora pronto para começar a criar a sua própria experiência holográfica!

Ver também