HoloLens (1e generatie) Basics 101E: Project voltooien met emulator

Belangrijk

De Mixed Reality Academy-zelfstudies zijn ontworpen met HoloLens (1e generatie), Unity 2017 en Mixed Reality Immersive Headsets in het achterhoofd. Daarom vinden we het belangrijk om deze zelfstudies te laten staan voor ontwikkelaars die nog steeds op zoek zijn naar richtlijnen bij 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 worden onderhouden om te blijven werken op de ondersteunde apparaten. Er is een nieuwe reeks zelfstudies gepubliceerd voor HoloLens 2.


Deze zelfstudie begeleidt u door een compleet project, gebouwd in Unity, waarin de belangrijkste Windows Mixed Reality functies op HoloLens worden gedemonstreerd, zoals staren, gebaren, spraakinvoer, ruimtelijk geluid en ruimtelijke toewijzing. De zelfstudie duurt ongeveer 1 uur.

Ondersteuning voor apparaten

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

Voordat u begint

Vereisten

Projectbestanden

  • Download de bestanden die zijn vereist voor het project. Vereist Unity 2017.2 of hoger.
    • Als u nog steeds ondersteuning voor Unity 5.6 nodig hebt, gebruikt u deze release.
    • Als u nog steeds ondersteuning voor Unity 5.5 nodig hebt, gebruikt u deze release.
    • Als u nog steeds ondersteuning voor Unity 5.4 nodig hebt, gebruikt u deze release.
  • Maak het archiveren van de bestanden op uw bureaublad of een andere gemakkelijk te bereiken locatie ongedaan. Behoud de naam van de map 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 proces voor bouwen en implementeren.

Doelen

  • Stel Unity in 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 ongedaan hebt gemaakt.
  • Selecteer Origami en klik op Map selecteren.
  • Sla de nieuwe scène op: Bestand / Scène opslaan als.
  • Geef de scène de naam Origami en druk op de knop Opslaan .

De hoofdcamera instellen

  • Selecteer in het Hierarchy Panel de optie Main Camera.
  • Stel in inspector de transformatiepositie in op 0,0,0.
  • Zoek de eigenschap Markeringen wissen en wijzig de vervolgkeuzelijst van Skybox in Effen kleur.
  • 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 map Hologrammen in het deelvenster Project:
    • Sleep Stage naar de hiërarchie als onderliggend element van OrigamiCollection.
    • Sleep Sphere1 naar de hiërarchie als onderliggend element van OrigamiCollection.
    • Sleep Sphere2 naar de hiërarchie als onderliggend element van OrigamiCollection.
  • Klik met de rechtermuisknop op het object Directional Light in het deelvenster Hiërarchie en selecteer Verwijderen.
  • Sleep Lights vanuit de map Hologrammen naar de hoofdmap van het deelvenster Hiërarchie.
  • Selecteer in de hiërarchie de OrigamiCollection.
  • Stel in 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 nu de Origami-objecten in het voorbeeldvenster.
  • Druk nogmaals op Afspelen om de voorbeeldmodus te stoppen.

Het project exporteren van Unity naar Visual Studio

  • Selecteer in Unity Instellingen voor bestandsbuild>.
  • Selecteer Windows Store in de lijst Platform en klik op Ander platform.
  • Stel SDK in op Universal 10 en BuildType op D3D.
  • Controleer Unity C#-projecten.
  • Klik op Open scènes toevoegen om de scène toe te voegen.
  • Klik op Spelerinstellingen....
  • Selecteer in het deelvenster Inspector het Windows Store-logo. Selecteer vervolgens Publicatie-instellingen.
  • Selecteer in de sectie Mogelijkheden de mogelijkheden Microfoon en SpatialPerception .
  • Klik in het venster Build-instellingen op Bouwen.
  • Maak een nieuwe map met de naam 'App'.
  • Klik één klik op de map App.
  • Druk op Map selecteren.
  • Wanneer Unity klaar is, wordt een Bestandenverkenner venster weergegeven.
  • Open de map App .
  • Open de Origami Visual Studio-oplossing.
  • Gebruik de bovenste werkbalk in Visual Studio om het doel te wijzigen 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 de emulator voor het eerst wordt gestart, kan het 15 minuten duren voordat de emulator is opgestart. Zodra de app is gestart, moet u het niet sluiten.

Hoofdstuk 2 - Staren

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

Doelen

  • Visualiseer uw blik met behulp van een met de wereld vergrendelde cursor.

Instructies

  • Terug naar uw Unity-project en sluit het venster Build-instellingen als dit nog steeds is geopend.
  • Selecteer de map Hologrammen in het deelvenster Project.
  • Sleep het cursorobject naar het deelvenster Hiërarchie op het hoofdniveau.
  • Dubbelklik op het cursorobject om het object nader te bekijken.
  • Klik met de rechtermuisknop op de map Scripts in het deelvenster Project.
  • Klik op het submenu Maken .
  • Selecteer C#-script.
  • Noem het script WorldCursor. Opmerking: de naam is hoofdlettergevoelig. U hoeft de extensie .cs niet toe te voegen.
  • Selecteer het cursorobject in het deelvenster Hiërarchie.
  • Sleep het WorldCursor-script naar het deelvenster Inspector.
  • Dubbelklik op het WorldCursor-script om het te openen in Visual Studio.
  • Kopieer en plak deze code in WorldCursor.cs en Sla alles 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 instellingen voor het > maken van bestanden.
  • Ga terug naar de Visual Studio-oplossing die eerder is gebruikt om te implementeren in de emulator.
  • Selecteer 'Alles opnieuw laden' wanneer u hierom wordt gevraagd.
  • Klik op Foutopsporing -> Starten zonder foutopsporing of druk op Ctrl + F5.
  • Gebruik de Xbox-controller om de scène rond te kijken. U ziet hoe de cursor communiceert met de vorm van objecten.

Hoofdstuk 3 - Bewegingen

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

Doelen

  • Beheer uw hologrammen met de beweging 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 GazeGestureManager.
  • Sleep het script GazeGestureManager naar het object OrigamiCollection in de hiërarchie.
  • Open het script GazeGestureManager 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 object OrigamiCollection uit in de weergave Hiërarchie.
  • Sleep het script SphereCommands naar het object Sphere1 in het deelvenster Hierarchy.
  • Sleep het script SphereCommands naar het object Sphere2 in het deelvenster Hierarchy.
  • Open het script in Visual Studio voor bewerken en vervang de standaardcode door:
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 de HoloLens-emulator.
  • Kijk rond de scène en centreer op een van de bollen.
  • Druk op de A-knop op de Xbox-controller of druk op de spatiebalk om de beweging Selecteren te simuleren.

Hoofdstuk 4 - Spraak

In dit hoofdstuk voegen we ondersteuning toe voor twee spraakopdrachten: 'Wereld opnieuw instellen' om de verwijderde bollen terug te zetten naar de oorspronkelijke locatie en 'Bol neerzetten' om de bol te laten vallen.

Doelen

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

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 Sla alles op:
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 zodat deze wordt gelezen:
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 de 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 bollen bevindt en zeg 'Bol neerzetten'.
  • Zeg 'Wereld opnieuw instellen' om ze terug te brengen naar hun oorspronkelijke positie.

Hoofdstuk 5 - Ruimtelijk geluid

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

Doelen

  • Luister naar hologrammen in uw wereld.

Instructies

  • Selecteer in unity in het bovenste menu Projectinstellingen > bewerken > Audio
  • Zoek de instelling Van de Spatializer-invoegtoepassing en selecteer MS HRTF Spatializer.
  • Sleep vanuit de map Holograms het object Ambience 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 Awake.
    • Wijzig Spatial Blend in 3D door de schuifregelaar helemaal naar rechts te slepen.
    • Controleer de eigenschap Loop .
    • Vouw 3D-geluidsinstellingen uit en voer 0.1 in voor Doppler-niveau.
    • Stel Volume rolloff in op Logaritmische rolloff.
    • Stel Maximumafstand in op 20.
  • Maak in de map Scripts een script met de naam SphereSounds.
  • Sleep SphereSounds naar de objecten Sphere1 en Sphere2 in de hiërarchie.
  • Open SphereSounds in Visual Studio, werk de volgende code bij en sla alles 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 de HoloLens-emulator.
  • Draag een hoofdtelefoon om het volledige effect te krijgen en ga dichterbij en verder van het podium om de geluiden te horen veranderen.

Hoofdstuk 6 - Ruimtelijke toewijzing

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

Doelen

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

Instructies

  • Klik op de map Holograms in het deelvenster Project.
  • Sleep de asset Ruimtelijke toewijzing naar de hoofdmap van de hiërarchie.
  • Klik op het object Spatial Mapping in de hiërarchie.
  • Wijzig in het deelvenster Inspector de volgende eigenschappen:
    • Schakel het selectievakje Visuele meshes tekenen in .
    • Zoek Materiaal tekenen en klik op de cirkel aan de rechterkant. Typ 'draadmodel' in het zoekveld bovenaan. Klik op het resultaat en sluit het venster.
  • Exporteer, bouw en implementeer de app in de HoloLens-emulator.
  • Wanneer de app wordt uitgevoerd, wordt een mesh van een eerder gescande echte woonkamer weergegeven in draadmodel.
  • Kijk hoe een rollende bol van het podium 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 object Stage.
  • Open het script TapToPlaceParent in Visual Studio en werk het script 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.
  • U moet nu de game op een specifieke locatie kunnen plaatsen door ernaar te staren, met behulp van de beweging Selecteren (A of spatiebalk) en vervolgens naar een nieuwe locatie te gaan en de beweging Selecteren opnieuw 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, gebaar, stem, geluiden en ruimtelijke toewijzing.
  • Een app bouwen en implementeren met Visual Studio.

U bent nu klaar om te beginnen met het maken van uw eigen holografische apps.

Zie ook