noções básicas de HoloLens (1ª gen) 101E: concluir o projeto com o emulador

Importante

os tutoriais misturados do academia de realidade foram projetados com a HoloLens (1ª gen), o Unity 2017 e o headset de imersão de realidade misturada em mente. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos. esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes ou as interações usadas para o HoloLens 2 e podem não ser compatíveis com as versões mais recentes do Unity. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis. Uma nova série de tutoriais foi postada para o HoloLens 2.


este tutorial guiará você por um projeto completo, interno do Unity, que demonstra os principais recursos de Windows Mixed Reality em HoloLens incluindo olhar, gestos, entrada de voz, som espacial e mapeamento espacial. O tutorial levará aproximadamente 1 hora para ser concluído.

Suporte a dispositivos

Curso HoloLens Headsets imersivos
Noções básicas do MR 101E: projeto completo com emulador ✔️

Antes de começar

Pré-requisitos

  • um computador Windows 10 configurado com as ferramentas corretas instaladas.

Arquivos de projeto

  • Baixe os arquivos exigidos pelo projeto. Requer o Unity 2017,2 ou posterior.
    • Se você ainda precisar de suporte do Unity 5,6, use esta versão.
    • Se você ainda precisar de suporte do Unity 5,5, use esta versão.
    • Se você ainda precisar de suporte do Unity 5,4, use esta versão.
  • Cancele o arquivamento dos arquivos em sua área de trabalho ou outro local fácil de acessar. Mantenha o nome da pasta como origami.

Observação

Se você quiser examinar o código-fonte antes de baixá-lo, ele estará disponível em github.

Capítulo 1 – mundo "holo"

Neste capítulo, vamos configurar nosso primeiro projeto do Unity e percorrer o processo de compilação e implantação.

Objetivos

  • Configure o Unity para o desenvolvimento de Holographic.
  • Crie um holograma.
  • Veja um holograma que você fez.

Instruções

  • Inicie o Unity.
  • Selecione Abrir.
  • Insira o local como a pasta de origami que você cancelou anteriormente.
  • Selecione origami e clique em Selecionar pasta.
  • Salve a nova cena: arquivo / salvar cena como.
  • Nomeie o origami da cena e pressione o botão salvar .

Configurar a câmera principal

  • No Painel de Hierarquia, selecione Câmera Principal.
  • No Inspetor , defina sua posição de transformação como 0, 0, 0.
  • Localize a propriedade limpar sinalizadores e altere a lista suspensa de Skybox para cor sólida.
  • Clique no campo Tela de fundo para abrir um seletor de cor.
  • Defina R, G, B e A para 0.

Configurar a cena

  • No painel hierarquia, clique em criar e em criar vazio.
  • Clique com o botão direito do mouse no novo gameobject e selecione Renomear. Renomeie o gameobject para origamicollection.
  • na pasta Hologramas no painel de Project:
    • Arraste o estágio para a hierarquia para ser um filho de origamicollection.
    • Arraste Sphere1 para a hierarquia para ser um filho de origamicollection.
    • Arraste Sphere2 para a hierarquia para ser um filho de origamicollection.
  • Clique com o botão direito do mouse no objeto de luz direcional no painel hierarquia e selecione excluir.
  • na pasta Hologramas , arraste luzes para a raiz do painel hierarquia.
  • Na hierarquia, selecione o origamicollection.
  • No Inspetor, defina a posição de transformação como 0,-0,5, 2,0.
  • Pressione o botão reproduzir no Unity para visualizar os hologramas.
  • Você deve ver os objetos de origami na janela de visualização.
  • Pressione executar uma segunda vez para parar o modo de visualização.

Exportar o projeto do Unity para o Visual Studio

  • em Unity, selecione arquivo > Build Configurações.
  • selecione Windows repositório na lista plataforma e clique em alternar plataforma.
  • Defina o SDK como Universal 10 e o tipo de compilação como D3D.
  • Verifique os projetos do Unity C#.
  • Clique em Adicionar abrir cenas para adicionar a cena.
  • clique em Player Configurações....
  • no painel inspetor, selecione o logotipo da Windows Store. em seguida, selecione publicação Configurações.
  • Na seção recursos , selecione os recursos de microfone e SpatialPerception .
  • de volta à janela Configurações de compilação, clique em compilar.
  • Crie uma nova pasta chamada "app".
  • Clique uma vez na pasta do aplicativo.
  • Pressione Selecionar pasta.
  • Quando o Unity for concluído, uma janela Explorador de arquivos será exibida.
  • Abra a pasta do aplicativo .
  • abra a solução de Visual Studio Origami.
  • usando a barra de ferramentas superior no Visual Studio, altere o destino de Debug para Release e de ARM para X86.
    • clique na seta ao lado do botão dispositivo e selecione HoloLens Emulator.
    • Clique em depurar-> iniciar sem Depurar ou pressione Ctrl + F5.
    • Após algum tempo, o emulador começará com o projeto de origami. Ao iniciar o emuladorpela primeira vez, pode levar até 15 minutos para que o emulador seja inicializado. Quando ele for iniciado, não o feche.

Capítulo 2 – olhar

Neste capítulo, vamos apresentar a primeira das três maneiras de interagir com seus hologramas-- olhar.

Objetivos

  • Visualize seu olhar usando um cursor com bloqueio mundial.

Instruções

  • volte ao seu projeto do Unity e feche a janela Build Configurações se ela ainda estiver aberta.
  • selecione a pasta Hologramas no painel de Project.
  • Arraste o objeto cursor para o painel hierarquia no nível raiz.
  • Clique duas vezes no objeto de cursor para examiná-lo mais detalhadamente.
  • clique com o botão direito do mouse na pasta Scripts no painel de Project.
  • Clique no submenu criar .
  • Selecione script C#.
  • Nomeie o script WorldCursor. Observação: o nome diferencia maiúsculas de minúsculas. Você não precisa adicionar a extensão .cs.
  • Selecione o objeto Cursor no painel Hierarquia.
  • Arraste e solte o script WorldCursor no painel Inspetor.
  • Clique duas vezes no script WorldCursor para abri-lo Visual Studio.
  • Copie e copie esse código em WorldCursor.cs e salve 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 thecursor 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;
        }
    }
}
  • Recomar o aplicativo do Arquivo > Build Configurações.
  • Retorne à solução Visual Studio usada anteriormente para implantar no emulador.
  • Selecione "Recarregar Tudo" quando solicitado.
  • Clique em Depurar -> Iniciar Sem depuração ou pressione Ctrl + F5.
  • Use o controlador Xbox para dar uma olhada na cena. Observe como o cursor interage com a forma dos objetos.

Capítulo 3 – Gestos

Neste capítulo, adicionaremos suporte para gestos. Quando o usuário selecionar uma esfera de papel, faremos com que a esfera caia, aciona a gravidade usando o mecanismo de física do Unity.

Objetivos

  • Controle seus hologramas com o gesto Selecionar.

Instruções

Vamos começar criando um script do que pode detectar o gesto Selecionar.

  • Na pasta Scripts, crie um script chamado 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 Start()
    {
        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.
  • Expanda o objeto OrigamiCollection na exibição 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 padrão 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;
        }
    }
}
  • Exportar, criar e implantar o aplicativo no HoloLens emulador.
  • Procure em volta da cena e centralmente em uma das esferas.
  • Pressione o botão A no controlador Xbox ou pressione a Barra de Espaços para simular o gesto Selecionar.

Capítulo 4 – Voz

Neste capítulo, adicionaremos suporte para dois comandos de voz:"Redefinir mundo" para retornar as esferas soltas para seu local original e "Soltar esfera" para fazer a esfera cair.

Objetivos

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

Instruções

  • Na pasta Scripts, crie um script chamado SpeechManager.
  • Arraste o script SpeechManager para o objeto OrigamiCollection na Hierarquia
  • Abra o script SpeechManager no Visual Studio.
  • Copie e copie esse código em SpeechManager.cs e salve todos:
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();
    }
}
  • Exportar, criar e implantar o aplicativo no HoloLens emulador.
  • O emulador dará suporte ao microfone do computador e responderá à sua voz: ajuste a exibição para que o cursor está em uma das esferas e diga "Drop Sphere".
  • Diga "Redefinir Mundo" para voltar às posições iniciais.

Capítulo 5 – Som espacial

Neste capítulo, adicionaremos música ao aplicativo e dispararemos efeitos de som em determinadas ações. Vamos usar o som espacial para dar aos sons um local específico no espaço 3D.

Objetivos

  • Ouvir hologramas em seu mundo.

Instruções

  • No Unity, selecione no menu superior Editar > Project Configurações > Áudio
  • Encontre a configuração Plug-in do Spatializer e selecione Espacializador MS HRTF.
  • Na pasta Hologramas, arraste o objeto Ambience para o objeto OrigamiCollection no Painel de Hierarquia.
  • Selecione OrigamiCollection e encontre o componente Fonte de Áudio. Altere estas propriedades:
    • Verifique a propriedade Spatialize.
    • Verifique a reprodução ao ser acoada.
    • Altere o Spatial Blend para 3D arrastando o controle deslizante até a direita.
    • Verifique a propriedade Loop.
    • Expanda Som 3D Configurações e insira 0,1 para Nível do Doppler.
    • De definido Volume Rolloff como Logarithmic Rolloff.
    • De acordo com a Distância Máxima como 20.
  • Na pasta Scripts, crie um script chamado SphereSounds.
  • Arraste SphereSounds para os objetos Sphere1 e Sphere2 na Hierarquia.
  • Abra SphereSounds no Visual Studio, atualize o código a seguir e Salve 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 script e retorne ao Unity.
  • Exportar, criar e implantar o aplicativo no HoloLens emulador.
  • Use fones de ouvido para obter o efeito total e mova-se cada vez mais para perto do Estágio para ouvir os sons mudarem.

Capítulo 6 – Mapeamento espacial

Agora, vamos usar o mapeamento espacial para colocar o tabuleiro do jogo em um objeto real no mundo real.

Objetivos

  • Traga seu mundo real para o mundo virtual.
  • Coloque seus hologramas onde eles são mais importantes para você.

Instruções

  • Clique na pasta Hologramas no painel Project dados.
  • Arraste o ativo Mapeamento Espacial para a raiz da Hierarquia.
  • Clique no objeto Mapeamento Espacial na Hierarquia.
  • No painel Inspetor , altere as seguintes propriedades:
    • Marque a caixa Desenhar Malhas Visuais.
    • Localize Desenhar Material e clique no círculo à direita. Digite "wireframe" no campo de pesquisa na parte superior. Clique no resultado e feche a janela.
  • Exportar, criar e implantar o aplicativo no HoloLens emulador.
  • Quando o aplicativo for executado, uma malha de uma sala de estar do mundo real digitalizada anteriormente será renderizada em wireframe.
  • Observe como uma esfera rolante cairá do estágio e no chão!

Agora, mostraremos como mover o OrigamiCollection para um novo local:

  • Na pasta Scripts, crie um script chamado TapToPlaceParent.
  • Na Hierarquia , expanda OrigamiCollection e selecione o objeto Stage.
  • Arraste o script TapToPlaceParent para o objeto Stage.
  • Abra o script TapToPlaceParent Visual Studio e atualize-o para que ele seja 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, criar e implantar o aplicativo.
  • Agora você deve ser capaz de colocar o jogo em um local específico olhando para ele, usando o gesto Selecionar (A ou Barra de Espaços) e, em seguida, movendo para um novo local e usando o gesto Selecionar novamente.

Fim

E esse é o final deste tutorial!

Você aprendeu a:

  • Como criar um aplicativo holográfico no Unity.
  • Como usar o olhar, o gesto, a voz, os sons e o mapeamento espacial.
  • Como criar e implantar um aplicativo usando Visual Studio.

Agora você está pronto para começar a criar seus próprios aplicativos holográficos!

Confira também