základní informace o HoloLens (1. generace) 101E: dokončení projektu pomocí emulátoru

Důležité

výukové kurzy Mixed reality Academy byly navrženy s ohledem na HoloLens (1. generace), Unity 2017 a moderních sluchátek s poutavými realitami. V takovém případě je důležité nechat tyto kurzy na místě pro vývojáře, kteří stále hledají pokyny k vývoji pro tato zařízení. tyto kurzy nebudou aktualizovány na nejnovější sady nástrojů nebo interakce používané pro HoloLens 2 a nemusí být kompatibilní s novějšími verzemi Unity. Budou zachovány, aby pokračovaly v práci na podporovaných zařízeních. byla publikována nová série kurzů pro HoloLens 2.


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

Podpora zařízení

Kurz HoloLens Moderní sluchátka
Základy MR 101E: dokončení projektu pomocí emulátoru ✔️

Než začnete

Požadavky

soubory Project

  • Stáhněte soubory požadované projektem. Vyžaduje Unity 2017,2 nebo novější.
    • Pokud pořád potřebujete podporu Unity 5,6, použijte prosím tuto verzi.
    • Pokud pořád potřebujete podporu Unity 5,5, použijte prosím tuto verzi.
    • Pokud pořád potřebujete podporu Unity 5,4, použijte prosím tuto verzi.
  • Zrušte archivaci souborů na plochu nebo jiné snadné umístění. Název složky nechte jako origami.

Poznámka

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

Kapitola 1 – "Holo" World

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

Cíle

  • Nastavte Unity pro holografický vývoj.
  • Udělejte si hologram.
  • Podívejte se na hologram, který jste provedli.

Pokyny

  • Spusťte Unity.
  • Vyberte Otevřít.
  • Jako složku origami , kterou jste předtím zrušili archivaci, zadejte umístění.
  • Vyberte origami a klikněte na Vybrat složku.
  • Uložte novou scénu: souborUložit scénu jako.
  • Pojmenujte scénu origami a stiskněte tlačítko Uložit .

Nastavení hlavní kamery

  • Na panelu hierarchievyberte hlavní kamera.
  • V inspektoru nastavte jeho pozici transformace na 0, 0, 0.
  • Vyhledejte vlastnost Vymazat příznaky a změňte rozevírací seznam z Skybox na Solid Color.
  • Kliknutím na tlačítko v poli pozadí otevřete výběr barvy.
  • Nastavte R, G, B a a na 0.

Nastavení scény

  • Na panelu hierarchieklikně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 Project:
    • Přetáhněte fázi do hierarchie, aby byla podřízená OrigamiCollection.
    • Přetáhněte Sphere1 do hierarchie, která bude podřízená objektu OrigamiCollection.
    • Přetáhněte Sphere2 do hierarchie, která bude podřízená objektu OrigamiCollection.
  • Pravým tlačítkem myši klikněte na objekt směrového světla na panelu hierarchie a vyberte Odstranit.
  • ze složky Hologramy přetáhněte světla do kořenového adresáře panelu hierarchie.
  • V hierarchiivyberte OrigamiCollection.
  • V inspektorunastavte pozici transformace na 0,-0,5, 2,0.
  • Kliknutím na tlačítko Přehrát v Unity zobrazíte náhled vašich hologramů.
  • Měli byste vidět objekty origami v okně náhledu.
  • Druhým stisknutím klávesy Play zastavíte režim náhledu.

Exportujte projekt z Unity do Visual Studio

  • v Unity vyberte Nastavení sestavení souboru.
  • v seznamu platforma vyberte Windows Store a klikněte na přepínač platforma.
  • Nastavte sadu SDK na Universal 10 a typ sestavení na D3D.
  • Ověřte projekty Unity jazyka C#.
  • Kliknutím na tlačítko Přidat otevřené scény přidáte scénu.
  • klikněte na Player Nastavení....
  • na panelu inspektora vyberte logo Windows Store. pak vyberte publikování Nastavení.
  • V části Možnosti vyberte možnosti mikrofonu a SpatialPerception .
  • zpět v okně build Nastavení klikněte na sestavit.
  • Vytvořte novou složku s názvem "App".
  • Jediné klikněte na složku aplikace.
  • Stiskněte Vybrat složku.
  • Po dokončení Unity se zobrazí okno Průzkumníka souborů.
  • Otevřete složku aplikace .
  • otevřete řešení Origami Visual Studio.
  • pomocí horního panelu nástrojů v Visual Studio změňte cíl z ladění na Release a z ARM na X86.
    • klikněte na šipku vedle tlačítka zařízení a vyberte HoloLens Emulator.
    • Klikněte na ladit – Spustit bez ladění nebo stiskněte CTRL + F5.
    • Po určité době se emulátor spustí s projektem origami. Při prvním spuštění emulátorumůže trvat až 15 minut, než se emulátor spustí. Až se spustí, nezavírejte ho.

Kapitola 2 – pohledu

V této kapitole budeme zavádět první ze tří způsobů interakce s vašimi hologramy – pohledu.

Cíle

  • Vizualizujte své pohledu pomocí kurzoru se zablokovaným světem.

Pokyny

  • vraťte se do projektu Unity a zavřete okno Build Nastavení, pokud je stále otevřené.
  • vyberte složku Hologramy na panelu Project.
  • Přetáhněte objekt Cursor na panel hierarchie na kořenové úrovni.
  • Poklikáním na objekt kurzoru se podíváte na jeho podrobnější pohled.
  • klikněte pravým tlačítkem na složku skripty na panelu Project.
  • Klikněte na dílčí nabídku vytvořit .
  • Vyberte skript C#.
  • Pojmenujte skript WorldCursor. Poznámka: v názvu se rozlišují velká a malá písmena. Nemusíte přidávat příponu. cs.
  • Vyberte objekt kurzoru na panelu hierarchie.
  • Přetáhněte skript WorldCursor do panelu Inspector.
  • Dvojím kliknutím na skript WorldCursor ho otevřete v Visual Studio.
  • Zkopírujte a vložte tento kód do souboru WorldCursor. cs a uložte všechny.
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 sestavte aplikaci ze souboru Build Nastavení.
  • vraťte se do řešení Visual Studio dříve používaného k nasazení do emulátoru.
  • Po zobrazení výzvy vyberte možnost znovu načíst vše.
  • Klikněte na ladit – Spustit bez ladění nebo stiskněte CTRL + F5.
  • K prohlédnutí scény použijte kontroler Xbox. Všimněte si, jak ukazatel komunikuje se tvarem objektů.

Kapitola 3 – gesta

V této kapitole přidáme podporu pro gesta. Když uživatel vybere pole papír, povedeme na ni zvýšením závažnosti pomocí modulu fyziky Unity.

Cíle

  • Ovládat své hologramy pomocí gesta pro výběr.

Pokyny

Začneme vytvořením skriptu, než dokáže detekovat gesto pro výběr.

  • 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 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();
        }
    }
}
  • Vytvořte ve složce Scripts další skript, tentokrát s názvem SphereCommands.
  • Rozbalte objekt OrigamiCollection v zobrazení hierarchie.
  • Přetáhněte skript SphereCommands do objektu Sphere1 na panelu hierarchie.
  • Přetáhněte skript SphereCommands do objektu Sphere2 na panelu hierarchie.
  • otevřete skript v 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.
  • Prohlédněte si scénu a prostředte je na jednom z oblastí.
  • Stiskněte tlačítko a na řadiči Xbox nebo stiskněte mezerník pro simulaci gesta výběru.

Kapitola 4 – hlas

V této kapitole přidáme podporu dvou hlasových příkazů: "Reset World", která vrátí vyřazené koule do jejich původního umístění a "drop sphere", aby se mohla koule rozdělit.

Cíle

  • Přidejte hlasové příkazy, které vždy naslouchají na pozadí.
  • Vytvořte hologram, který se bude chovat hlasovým příkazem.

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 Visual Studio.
  • Zkopírujte a vložte tento kód do souboru SpeechManager. cs a uložte všechny:
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 Visual Studio.
  • Aktualizujte skript tak, aby četl následující informace:
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 vašeho počítače a reagovat na váš hlas: upravte zobrazení tak, aby se kurzor nacházel v některém z oblastí, a řekněme "drop sphere".
  • Řekněte "resetovat svět", aby se přenesly zpátky na jejich počáteční pozice.

Kapitola 5 – prostorový zvuk

V této kapitole přidáme do aplikace hudbu a potom pro určité akce spustíme zvukové efekty. Prostorové zvuky budeme používat k poskytnutí zvukového místa v prostorovém prostoru.

Cíle

  • Poslechnout si hologramy na světě.

Pokyny

  • v horní nabídce vyberte v části Unity možnost upravit Project Nastavení > zvuk
  • Vyhledejte nastavení modulu plug-in Spatializer a vyberte MS HRTF Spatializer.
  • ze složky Hologramy přetáhněte objekt Ambience na objekt OrigamiCollection na panelu hierarchie.
  • Vyberte OrigamiCollection a vyhledejte zdrojovou komponentu zvuku . Změňte tyto vlastnosti:
    • Ověřte vlastnost Spatialize .
    • Podívejte se na hraní zapnuto.
    • Změňte prostorovou Blend na 3D přetažením jezdce úplně doprava.
    • Ověřte vlastnost Loop .
    • rozbalte položku 3d Sound Nastavenía zadejte 0,1 pro úroveň Doppler.
    • Nastavte rolloff svazků na logaritmický rolloff.
    • Nastavte maximální vzdálenost na 20.
  • Ve složce Scripts Vytvořte skript s názvem SphereSounds.
  • Přetáhněte SphereSounds do objektů Sphere1 a Sphere2 v hierarchii.
  • v Visual Studio otevřete SphereSounds , aktualizujte následující kód a uložte všechny.
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.
  • Využijte sluchátka, abyste získali úplný efekt, a posuňte se blíž a dále od fáze, abyste slyšeli změny zvuků.

Kapitola 6 – územní mapování

Teď k umístění hry do reálného světa použijeme prostorové mapování .

Cíle

  • Přeneste svůj reálný svět do virtuálního světa.
  • Položte své hologramy tam, kde jsou pro vás nejvíc.

Pokyny

  • na panelu Project klikněte na složku Hologramy .
  • Přetáhněte prostředek prostorového mapování do kořenového adresáře hierarchie.
  • V hierarchii klikněte na objekt prostorového mapování .
  • V panelu inspektorazměňte následující vlastnosti:
    • Zaškrtněte políčko Kreslení vizuálních mřížek .
    • Najděte nakreslený materiál a klikněte na kroužek vpravo. Zadejte "drátěný" do vyhledávacího pole v horní části. Klikněte na výsledek a pak okno zavřete.
  • exportujte, sestavte a nasaďte aplikaci do emulátoru HoloLens.
  • Po spuštění aplikace se v drátěném modelu vykreslí síť s dříve naskenovaným živým pracovním prostorem.
  • Podívejte se, jak má fáze valení klesnout z fáze a do podlahy.

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

  • Ve složce Scripts Vytvořte skript s názvem TapToPlaceParent.
  • V hierarchiirozbalte OrigamiCollection a vyberte objekt Stage .
  • Přetáhněte skript TapToPlaceParent do objektu Stage.
  • otevřete ve Visual Studio skript TapToPlaceParent 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.
  • Nyní byste teď měli být schopni umístit hru do konkrétního umístění tím, že je gazing, a to pomocí gesta Select (a nebo mezerník) a pak přejít na nové umístění a znovu použít gesto pro výběr.

Konec

A na konci tohoto kurzu!

Naučili jste se:

  • Jak vytvořit holografickou aplikaci v Unity.
  • Jak využít pohledu, gesto, hlas, zvuky a prostorové mapování
  • Jak sestavit a nasadit aplikaci pomocí Visual Studio.

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

Viz také