HoloLens (1e generatie) Basics 101E: Complete project with emulator (Basisprincipes 101E: project voltooien met emulator)

Belangrijk

De Mixed Reality Academy-zelfstudies zijn ontworpen met HoloLens (eerste generatie), Unity 2017 en Mixed Reality Immersive Headsets in gedachten. Daarom vinden we het belangrijk om deze zelfstudies te laten staan voor ontwikkelaars die nog op zoek zijn naar richtlijnen voor het ontwikkelen van deze apparaten. Deze zelfstudies worden niet bijgewerkt met de nieuwste toolsets of interacties die worden gebruikt voor HoloLens 2 en zijn mogelijk niet compatibel met nieuwere versies van Unity. Ze blijven behouden om te blijven werken op de ondersteunde apparaten. Er is een nieuwe reeks zelfstudies geplaatst voor HoloLens 2.


In deze zelfstudie wordt u door een volledig project, gebouwd in Unity, gebracht waarin de belangrijkste Windows Mixed Reality-functies op HoloLens worden gedemonstreerd, waaronder staren, gebaren, spraakinvoer,ruimtelijke geluid en ruimtelijke toewijzing. Het voltooien van de zelfstudie duurt ongeveer 1 uur.

Ondersteuning voor apparaten

Cursus HoloLens Immersive headsets
MR Basics 101E: Project voltooien met emulator ✔️

Voordat u begint

Vereisten

Project bestanden

  • Download de bestanden die vereist zijn voor het project. Vereist Unity 2017.2 of hoger.
    • Gebruik deze release als u nog ondersteuning voor Unity 5.6 nodig hebt.
    • Als u nog steeds ondersteuning voor Unity 5.5 nodig hebt, gebruikt u deze release.
    • Gebruik deze release als u ondersteuning voor Unity 5.4 nog nodig hebt.
  • Archiveer de bestanden op uw bureaublad of een andere gemakkelijk te bereiken locatie. Bewaar de mapnaam als Origami.

Notitie

Als u de broncode wilt bekijken voordat u deze downloadt, is deze beschikbaar op GitHub.

Hoofdstuk 1 - Holo-wereld

In dit hoofdstuk stellen we ons eerste Unity-project in en doorlopen we het build- en implementatieproces.

Doelen

  • Unity instellen voor holografische ontwikkeling.
  • Maak een hologram.
  • Bekijk een hologram dat u hebt gemaakt.

Instructies

  • Start Unity.
  • Selecteer Openen.
  • Voer de locatie in als de Origami-map die u eerder niet-gearchiveerd hebt.
  • Selecteer Origami en klik op Map selecteren.
  • Sla de nieuwe scène op: / BestandScène opslaan als.
  • Noem de scène Origami en druk op de knop Opslaan.

De hoofdcamera instellen

  • Selecteer in het Hierarchy Panel de optie Main Camera.
  • Stel in de Inspector de transformatiepositie in op 0,0,0.
  • Zoek de eigenschap Clear Flags en wijzig de vervolgkeuzeset van Skybox in Solid color.
  • Klik op het veld Background om een kleurenkiezer te openen.
  • Stel R, G, B en A in op 0.

De scène instellen

  • Klik in het deelvenster Hiërarchie op Maken en Leeg maken.
  • Klik met de rechtermuisknop op het nieuwe GameObject en selecteer Naam wijzigen. Wijzig de naam van het GameObject in OrigamiCollection.
  • Vanuit de Hologrammen map in het Project deelvenster:
    • Sleep Fase naar de hiërarchie als onderliggende van OrigamiCollection.
    • Sleep Sphere1 naar de hiërarchie als onderliggende van OrigamiCollection.
    • Sleep Sphere2 naar de hiërarchie als onderliggende van OrigamiCollection.
  • Klik met de rechtermuisknop op het object Directional Light in het hiërarchiepaneel en selecteer Verwijderen.
  • Sleep vanuit Hologrammen map Lights naar de hoofdmap van het hiërarchiepaneel.
  • Selecteer in de Hiërarchie de OrigamiCollection.
  • Stel in de Inspector de transformatiepositie in op 0, -0,5, 2.0.
  • Druk op de knop Afspelen in Unity om een voorbeeld van uw hologrammen te bekijken.
  • U ziet de Origami-objecten in het voorbeeldvenster.
  • Druk nog een keer op Afspelen om de preview-modus te stoppen.

Het project exporteren van Unity naar Visual Studio

  • Selecteer in Unity File > Build Instellingen.
  • Selecteer Windows Store in de lijst Platform en klik op Switch Platform.
  • Stel SDK in op Universal 10 en BuildType op D3D.
  • Controleer Unity C#-projecten.
  • Klik op Open scenes toevoegen om de scène toe te voegen.
  • Klik op Speler Instellingen....
  • Selecteer in het deelvenster Inspector het Windows Store-logo. Selecteer vervolgens Instellingen.
  • Selecteer in de sectie Mogelijkheden de mogelijkheden Microphone en SpatialPerception.
  • Klik in het venster Build Instellingen build op Build.
  • Maak een nieuwe map met de naam 'App'.
  • Klik met één klik op de app-map.
  • Druk op Map selecteren.
  • Wanneer Unity klaar is, wordt er een verkennervenster weergegeven.
  • Open de map App.
  • Open origami Visual Studio Solution.
  • Wijzig met de bovenste werkbalk in Visual Studio doel van Foutopsporing in Release en van ARM in X86.
    • Klik op de pijl naast de knop Apparaat en selecteer HoloLens Emulator.
    • Klik op Fouten opsporen - > starten zonder foutopsporing of druk op Ctrl + F5.
    • Na enige tijd begint de emulator met het Origami-project. Wanneer u de emulator voor het eerststart, kan het 15 minuten duren voordat de emulator is opstarten. Zodra het is gestart, sluit u deze niet.

Hoofdstuk 2- Staren

In dit hoofdstuk introduceren we de eerste van drie manieren om te communiceren met uw hologrammen: staren.

Doelen

  • Visualiseer uw staren met behulp van een wereldge vergrendelde cursor.

Instructies

  • Terug aan uw Unity-project en sluit het venster Build Instellingen als het nog steeds is geopend.
  • Selecteer de Hologrammen map in het Project deelvenster.
  • Sleep het object Cursor naar het deelvenster Hiërarchie op hoofdniveau.
  • Dubbelklik op het Cursor-object om het object nader te bekijken.
  • Klik met de rechtermuisknop op de map Scripts in Project deelvenster.
  • Klik op het submenu Maken.
  • Selecteer C# Script.
  • Noem het script WorldCursor. Opmerking: De naam is casegevoelig. U hoeft de extensie .cs niet toe te voegen.
  • Selecteer het object Cursor in het deelvenster Hiërarchie.
  • Sleep het WorldCursor-script naar het deelvenster Inspector en zet het neer.
  • Dubbelklik op het WorldCursor-script om het te openen in Visual Studio.
  • Kopieer en plak deze code in WorldCursor.cs en Sla alle op.
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;
        }
    }
}
  • Bouw de app opnieuw op vanuit File > Build Instellingen.
  • Ga terug naar Visual Studio oplossing die eerder is gebruikt om in de emulator te implementeren.
  • Selecteer Alles opnieuw laden wanneer u hier om wordt gevraagd.
  • Klik op Fouten opsporen -> starten zonder foutopsporing of druk op Ctrl + F5.
  • Gebruik de Xbox-controller om rond de scène te kijken. U ziet hoe de cursor communiceert met de vorm van objecten.

Hoofdstuk 3 - Gebaren

In dit hoofdstuk voegen we ondersteuning toe voor gebaren. Wanneer de gebruiker een papieren bol selecteert, laten we de bol vallen door de ernst in te zetten met behulp van de fysica-engine van Unity.

Doelen

  • Beheer uw hologrammen met het gebaar Selecteren.

Instructies

We beginnen met het maken van een script dat de beweging Selecteren kan detecteren.

  • Maak in de map Scripts een script met de naam StaringGestureManager.
  • Sleep het script StarGestureManager naar het OrigamiCollection-object in de hiërarchie.
  • Open het script StarGestureManager in Visual Studio en voeg de volgende code toe:
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();
        }
    }
}
  • Maak nog een script in de map Scripts, deze keer met de naam SphereCommands.
  • Vouw het OrigamiCollection-object uit in de weergave Hiërarchie.
  • Sleep het script SphereCommands naar het sphere1-object in het deelvenster Hiërarchie.
  • Sleep het script SphereCommands naar het Sphere2-object in het deelvenster Hiërarchie.
  • Open het script in Visual Studio te bewerken en vervang de standaardcode door deze:
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;
        }
    }
}
  • Exporteer, bouw en implementeer de app in HoloLens emulator.
  • Bekijk de scène en centreer op een van de bol.
  • Druk op de knop A op de Xbox-controller of druk op de spatiebalk om de beweging Selecteren te simuleren.

Hoofdstuk 4 - Stem

In dit hoofdstuk voegen we ondersteuning toe voor twee spraakopdrachten: 'Wereld opnieuw instellen' om de uitgevallen bol terug te zetten op de oorspronkelijke locatie, en 'Drop sphere' om de bol te laten vallen.

Doelen

  • Voeg spraakopdrachten toe die altijd op de achtergrond luisteren.
  • Maak een hologram dat op een spraakopdracht reageert.

Instructies

  • Maak in de map Scripts een script met de naam SpeechManager.
  • Sleep het SpeechManager-script naar het OrigamiCollection-object in de hiërarchie
  • Open het SpeechManager-script in Visual Studio.
  • Kopieer en plak deze code in SpeechManager.cs en alles opslaan:
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();
        }
    }
}
  • Open het script SphereCommands in Visual Studio.
  • Werk het script als volgt bij om het te lezen:
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();
    }
}
  • Exporteer, bouw en implementeer de app in HoloLens emulator.
  • De emulator ondersteunt de microfoon van uw pc en reageert op uw stem: pas de weergave aan zodat de cursor zich op een van de bol en zeg 'Bol neerzetten'.
  • Zeg 'Wereld opnieuw instellen' om ze terug te brengen naar hun initiële posities.

Hoofdstuk 5 - Ruimtelijk geluid

In dit hoofdstuk voegen we muziek toe aan de app en activeren we geluidseffecten voor bepaalde acties. We gebruiken ruimtelijk geluid om geluiden een specifieke locatie in 3D-ruimte te geven.

Doelen

  • Meer hologrammen in uw wereld.

Instructies

  • Selecteer in Unity in het bovenste menu Edit > Project Instellingen > Audio
  • Zoek de instelling voor de Spatializer-invoeg-invoeging en selecteer MS HRTF Spatializer.
  • Sleep vanuit Hologrammen map naar het object OrigamiCollection in het deelvenster Hiërarchie.
  • Selecteer OrigamiCollection en zoek het onderdeel Audiobron. Wijzig deze eigenschappen:
    • Controleer de eigenschap Spatialize.
    • Controleer de Play On 2019.
    • Wijzig Spatial Blend in 3D door de schuifregelaar helemaal naar rechts te slepen.
    • Controleer de eigenschap Loop.
    • Vouw 3D Sound Instellingen uit en voer 0.1 in bij Doppler-niveau.
    • Stel Volume Rolloff in op Logarithmic Rolloff.
    • Stel Maximale afstand in op 20.
  • Maak in de map Scripts een script met de naam Sphere Globes.
  • Sleep Sphere Globes naar de Sphere1- en Sphere2-objecten in de hiërarchie.
  • Open Sphere Globes in Visual Studio, werk de volgende code bij en sla alle op.
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();
        }
    }
}
  • Sla het script op en ga terug naar Unity.
  • Exporteer, bouw en implementeer de app in HoloLens emulator.
  • Draag een bril om het volledige effect te krijgen en ga steeds verder van de fase af om te horen dat het geluid verandert.

Hoofdstuk 6 - Ruimtelijke toewijzing

Nu gaan we ruimtelijke toewijzing gebruiken om het gamebord in de echte wereld op een echt object te plaatsen.

Doelen

  • Breng uw echte wereld in de virtuele wereld.
  • Plaats uw hologrammen op de plek waar ze voor u het belangrijkst zijn.

Instructies

  • Klik op de Hologrammen map in Project deelvenster.
  • Sleep de asset Ruimtelijke toewijzing naar de hoofdmap van de hiërarchie.
  • Klik op het object Ruimtelijke toewijzing in de hiërarchie.
  • Wijzig in het deelvenster Inspector de volgende eigenschappen:
    • Vink het selectievakje Visual Meshes tekenen aan.
    • Zoek Draw Material en klik op de cirkel aan de rechterkant. Typ wireframe in het zoekveld bovenaan. Klik op het resultaat en sluit het venster.
  • Exporteer, bouw en implementeer de app in HoloLens emulator.
  • Wanneer de app wordt uitgevoerd, wordt een mesh van een eerder gescande echte huisruimte weergegeven in wireframe.
  • Kijk hoe een rolling sphere van het fase valt en op de vloer!

Nu laten we u zien hoe u de OrigamiCollection naar een nieuwe locatie verplaatst:

  • Maak in de map Scripts een script met de naam TapToPlaceParent.
  • Vouw in de Hiërarchie de OrigamiCollection uit en selecteer het object Fase.
  • Sleep het script TapToPlaceParent naar het stage-object.
  • Open het script TapToPlaceParent in Visual Studio en werk het als volgt bij:
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;
            }
        }
    }
}
  • Exporteer, bouw en implementeer de app.
  • Nu moet u het spel op een specifieke locatie kunnen plaatsen door naar de game te staren, met behulp van de beweging Selecteren (A of spatiebalk) en vervolgens naar een nieuwe locatie te gaan en nogmaals de beweging Selecteren te gebruiken.

Het einde

En dat is het einde van deze zelfstudie.

U hebt het volgende geleerd:

  • Een holografische app maken in Unity.
  • Hoe u gebruik kunt maken van staren, gebaren, stem, geluiden en ruimtelijke toewijzing.
  • Een app bouwen en implementeren met behulp van Visual Studio.

U bent nu klaar om uw eigen holografische apps te gaan maken.

Zie ook