HoloLens (1. generace) Základy 101E: Dokončení projektu s emulátorem

Důležité

Kurzy Mixed Reality Academy byly navrženy s ohledem na HoloLens (1. generace), Unity 2017 a Mixed Reality Asistivní náhlavní soupravy. Proto se domníváme, že je důležité ponechat tyto kurzy pro vývojáře, kteří stále hledají pokyny při vývoji pro tato zařízení. Tyto kurzy nebudou aktualizovány nejnovějšími sadami nástrojů nebo interakcemi používanými pro HoloLens 2 a nemusí být kompatibilní s novějšími verzemi Unity. Budou zachovány, aby mohly pokračovat v práci na podporovaných zařízeních. Pro HoloLens 2 byla zveřejněny nové série kurzů.


Tento kurz vás provede kompletním projektem vytvořeným v Unity, který ukazuje základní funkce Windows Mixed Reality na HoloLensu, včetně pohledu, gest, hlasového vstupu, prostorového zvuku a prostorového mapování. Dokončení kurzu bude trvat přibližně 1 hodinu.

Podpora zařízení

Kurz HoloLens Imerzivní náhlavní soupravy
MR Basics 101E: Dokončení projektu s emulátorem ✔️

Než začnete

Požadavky

Soubory projektu

  • Stáhněte soubory vyžadované projektem. Vyžaduje Unity 2017.2 nebo novější.
  • Zrušte archivaci souborů na ploše nebo na jiném snadno dostupném místě. Název složky ponechte jako Origami.

Poznámka

Pokud si chcete před stažením projít zdrojový kód, je k dispozici na GitHubu.

Kapitola 1 - "Holo" svět

V této kapitole nastavíme náš první projekt Unity a projdeme procesem sestavení a nasazení.

Cíle

  • Nastavení Unity pro holografický vývoj
  • Vytvoření hologramu
  • Podívejte se na hologram, který jste vytvořili.

Pokyny

  • Spusťte Unity.
  • Vyberte Otevřít.
  • Jako složku Origami , kterou jste dříve archivovali, zadejte umístění.
  • Vyberte Origami a klikněte na Vybrat složku.
  • Uložte novou scénu: Soubor / Uložit scénu jako.
  • Pojmenujte scénu Origami a stiskněte tlačítko Uložit .

Nastavení hlavní kamery

  • Na panelu hierarchie vyberte Hlavní kamera.
  • V inspektoru nastavte jeho transformační pozici na 0,0,0.
  • Najděte vlastnost Clear Flags (Vymazat příznaky ) a změňte rozevírací seznam z Skyboxu na Plnou barvu.
  • Kliknutím na pole Pozadí otevřete výběr barvy.
  • Nastavte R, G, B a A na 0.

Nastavení scény

  • Na panelu hierarchie klikněte na Vytvořit a vytvořit prázdné.
  • Klikněte pravým tlačítkem na nový GameObject a vyberte Přejmenovat. Přejmenujte GameObject na OrigamiCollection.
  • Ze složky Hologramy na panelu projektu:
    • Přetáhněte dílčí fázi do hierarchie, aby byla podřízená funkce OrigamiCollection.
    • Přetáhněte Sphere1 do hierarchie, abyste se mohli stát dítětem OrigamiCollection.
    • Přetáhněte Sphere2 do hierarchie, abyste se mohli stát podřízeným elementem OrigamiCollection.
  • Na panelu hierarchie klikněte pravým tlačítkem na objekt Directional Light (Směrové světlo) a vyberte Delete (Odstranit).
  • Ze složky Hologramy přetáhněte světla do kořenového adresáře panelu hierarchie.
  • V hierarchii vyberte OrigamiCollection.
  • V inspektoru nastavte pozici transformace na 0, -0,5, 2,0.
  • Stisknutím tlačítka Přehrát v Unity zobrazíte náhled hologramů.
  • V okně náhledu byste měli vidět objekty Origami.
  • Stisknutím tlačítka Přehrát podruhé ukončete režim náhledu.

Export projektu z Unity do sady Visual Studio

  • V Unity vyberte Nastavení sestavení souboru>.
  • V seznamu Platforma vyberte Windows Store a klikněte na Přepnout platformu.
  • Nastavte SADU SDK na Universal 10 a typ sestavení na D3D.
  • Zkontrolujte projekty Unity C#.
  • Kliknutím na Přidat otevřená scéna scénu přidejte.
  • Klikněte na Nastavení přehrávače....
  • Na panelu inspektorů vyberte logo Windows Store. Pak vyberte Nastavení publikování.
  • V části Capabilities (Schopnosti ) vyberte Mikrofon aSpatialPerception (Prostorové percepce ).
  • Zpět v okně Nastavení sestavení klikněte na Sestavit.
  • Vytvořte novou složku s názvem "App".
  • Klikněte na složku aplikace.
  • Stiskněte Vybrat složku.
  • Po dokončení Unity se zobrazí okno Průzkumník souborů.
  • Otevřete složku Aplikace .
  • Otevřete řešení Origami v sadě Visual Studio.
  • Pomocí horního panelu nástrojů v sadě Visual Studio změňte cíl z Ladění na Vydání a z ARM na X86.
    • Klikněte na šipku vedle tlačítka Zařízení a vyberte Emulátor HoloLens.
    • Klikněte na Ladit –> Spustit bez ladění nebo stiskněte ctrl + F5.
    • Po nějaké době se emulátor spustí s projektem Origami. Při prvním spuštění emulátoru může trvat až 15 minut, než se emulátor spustí. Jakmile se spustí, nezavírejte ho.

Kapitola 2 - Pohled

V této kapitole představíme první ze tří způsobů interakce s hologramy – pohled.

Cíle

  • Vizualizujte svůj pohled pomocí světově uzamčeného kurzoru.

Pokyny

  • Zpět do projektu Unity, a pokud je okno Nastavení sestavení stále otevřené, zavřete ho.
  • Na panelu Projekt vyberte složku Hologramy.
  • Přetáhněte objekt Kurzor na panel Hierarchie na kořenové úrovni.
  • Poklikejte na objekt Cursor a podívejte se na něj podrobněji.
  • Klikněte pravým tlačítkem na složku Scripts (Skripty ) na panelu Project (Projekt).
  • Klikněte na pod nabídku Vytvořit .
  • Vyberte Skript jazyka C#.
  • Pojmenujte skript WorldCursor. Poznámka: V názvu se rozlišují velká a malá písmena. Není nutné přidávat příponu .cs.
  • Na panelu Hierarchie vyberte objekt Kurzor.
  • Přetáhněte skript WorldCursor na panel Inspektor.
  • Poklikáním otevřete skript WorldCursor v sadě Visual Studio.
  • Zkopírujte a vložte tento kód do souboru WorldCursor.cs a Uložit vše.
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;
        }
    }
}
  • Znovu vytvořte aplikaci z nastavení sestavení souboru>.
  • Vraťte se k řešení sady Visual Studio, které se dříve používalo k nasazení do emulátoru.
  • Po zobrazení výzvy vyberte Znovu načíst vše.
  • Klikněte na Ladit –> Spustit bez ladění nebo stiskněte Ctrl +F5.
  • Pomocí ovladače Xbox se rozhlédněte po celé scéně. Všimněte si, jak kurzor komunikuje s tvarem objektů.

Kapitola 3 - Gesta

V této kapitole přidáme podporu pro gesta. Když uživatel vybere papírovou kouli, vytvoříme její pád zapnutím gravitace pomocí fyzikálního modulu Unity.

Cíle

  • Ovládejte hologramy pomocí gesta Vybrat.

Pokyny

Začneme vytvořením skriptu, který dokáže rozpoznat gesto Vybrat.

  • Ve složce Scripts vytvořte skript s názvem GazeGestureManager.
  • Přetáhněte skript GazeGestureManager do objektu OrigamiCollection v hierarchii.
  • Otevřete skript GazeGestureManager v sadě Visual Studio a přidejte následující kód:
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();
        }
    }
}
  • Ve složce Scripts vytvořte další skript, tentokrát s názvem SphereCommands.
  • Rozbalte objekt OrigamiCollection v zobrazení Hierarchie.
  • Přetáhněte skript SphereCommands na objekt Sphere1 na panelu Hierarchie.
  • Přetáhněte skript SphereCommands do objektu Sphere2 na panelu Hierarchie.
  • Otevřete skript v sadě Visual Studio pro úpravy a nahraďte výchozí kód tímto:
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;
        }
    }
}
  • Exportujte, sestavte a nasaďte aplikaci do emulátoru HoloLens.
  • Rozhlédni se kolem scény a zacentrujte se na jednu z koulí.
  • Stiskněte tlačítko A na ovladači Xbox nebo stiskněte mezerník a simulujte gesto Vybrat.

Kapitola 4 – Hlas

V této kapitole přidáme podporu pro dva hlasové příkazy: "Resetovat svět", který vrátí vyhozené koule do původního umístění, a "Drop sphere", aby koule spadla.

Cíle

  • Přidejte hlasové příkazy, které vždy poslouchají na pozadí.
  • Vytvořte hologram, který reaguje na hlasový příkaz.

Pokyny

  • Ve složce Scripts vytvořte skript s názvem SpeechManager.
  • Přetáhněte skript SpeechManager do objektu OrigamiCollection v hierarchii.
  • Otevřete skript SpeechManager v sadě Visual Studio.
  • Zkopírujte a vložte tento kód do souboru SpeechManager.cs a Uložit vše:
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();
        }
    }
}
  • Otevřete skript SphereCommands v sadě Visual Studio.
  • Aktualizujte skript tak, aby se četl takto:
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();
    }
}
  • Exportujte, sestavte a nasaďte aplikaci do emulátoru HoloLens.
  • Emulátor bude podporovat mikrofon počítače a reagovat na váš hlas: upravte zobrazení tak, aby byl kurzor na jedné z koulí, a řekněte "Drop Sphere".
  • Řekněte "ResetOvat svět", abyste je přivedli zpět na jejich počáteční pozice.

Kapitola 5 - Prostorový zvuk

V této kapitole přidáme do aplikace hudbu a pak aktivujeme zvukové efekty u určitých akcí. Prostorový zvuk použijeme k tomu, abychom zvukům poskytli konkrétní umístění v 3D prostoru.

Cíle

  • Poslechněte si hologramy ve vašem světě.

Pokyny

  • V Unity vyberte v horní nabídce Upravit > nastavení > projektu Zvuk.
  • Najděte nastavení modulu plug-in Spatializer a vyberte MS HRTF Spatializer.
  • Ze složky Holograms přetáhněte objekt Ambience do objektu OrigamiCollection v panelu hierarchie.
  • Vyberte OrigamiCollection a najděte komponentu Zdroj zvuku . Změňte tyto vlastnosti:
    • Zkontrolujte vlastnost Spatialize (Prostorové nastavení).
    • Zkontrolujte možnost Přehrát při probuzení.
    • Změňte prostorovou prolnutí na 3D přetažením posuvníku úplně doprava.
    • Zkontrolujte vlastnost Smyčka .
    • Rozbalte nastavení 3D zvuku a jako Úroveň Doppleru zadejte 0.1.
    • Nastavte možnost Vrácení svazku na logaritmické zavedení.
    • Nastavte maximální vzdálenostna 20.
  • Ve složce Scripts vytvořte skript s názvem SphereSounds.
  • Přetáhněte SphereSounds na objektySphere1 a Sphere2 v hierarchii.
  • Otevřete SphereSounds v sadě Visual Studio, aktualizujte následující kód a uložte vše.
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();
        }
    }
}
  • Uložte skript a vraťte se do Unity.
  • Exportujte, sestavte a nasaďte aplikaci do emulátoru HoloLens.
  • Noste sluchátka, abyste získali plný efekt, a pohybujte se blíž a dál od pódia, abyste si mohli poslechnout změny zvuků.

Kapitola 6 - Prostorové mapování

Nyní použijeme prostorové mapování k umístění herní desky na skutečný objekt v reálném světě.

Cíle

  • Přeneste svůj skutečný svět do virtuálního světa.
  • Umístěte hologramy tam, kde jsou pro vás nejdůležitější.

Pokyny

  • Klikněte na složku Hologramy na panelu Projekt.
  • Přetáhněte asset spatial mapping do kořenového adresáře hierarchie.
  • Klikněte na objekt Prostorové mapování v hierarchii.
  • Na panelu Inspektor změňte následující vlastnosti:
    • Zaškrtněte políčko Kreslit vizuální sítě .
    • Vyhledejte kreslicí materiál a klikněte na kruh vpravo. Do vyhledávacího pole v horní části zadejte "wireframe". Klikněte na výsledek a zavřete okno.
  • Exportujte, sestavte a nasaďte aplikaci do emulátoru HoloLens.
  • Při spuštění aplikace se v drátovém modelu vykresluje síť dříve naskenovaného obývacího pokoje z reálného světa.
  • Podívejte se, jak se z pódia a na podlahu spadne koule!

Teď vám ukážeme, jak přesunout OrigamiCollection do nového umístění:

  • Ve složce Scripts vytvořte skript s názvem TapToPlaceParent.
  • V hierarchii rozbalte OrigamiCollection a vyberte objekt Stage .
  • Přetáhněte skript TapToPlaceParent do objektu Stage.
  • Otevřete skript TapToPlaceParent v sadě Visual Studio a aktualizujte ho tak, aby byl následující:
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;
            }
        }
    }
}
  • Exportujte, sestavte a nasaďte aplikaci.
  • Teď byste měli mít možnost hru umístit na určité místo tak, že na ni zhlédnete, použijete gesto Vybrat (A nebo mezerník), přesunete se na nové místo a znovu použijete gesto Vybrat.

Konec

A to je konec tohoto kurzu!

Naučili jste se:

  • Jak vytvořit holografickou aplikaci v Unity.
  • Jak využít pohled, gesta, hlas, zvuky a prostorové mapování.
  • Postup sestavení a nasazení aplikace pomocí sady Visual Studio

Teď jste připraveni začít vytvářet vlastní holografické aplikace.

Viz také