HoloLens (1ère génération) Notions de base 101E : Projet complet avec émulateur

Important

Les tutoriels Mixed Reality Academy ont été conçus avec HoloLens (1ère génération), Unity 2017 et Mixed Reality casques immersifs à l’esprit. Nous estimons qu’il est important de laisser ces tutoriels à la disposition des développeurs qui recherchent encore des conseils pour développer des applications sur ces appareils. Ces didacticiels ne seront pas mis à jour avec les derniers ensembles d’outils ou interactions utilisés pour HoloLens 2 et peuvent ne pas être compatibles avec les versions plus récentes d’Unity. Ils sont fournis dans le but de fonctionner sur les appareils pris en charge. Une nouvelle série de tutoriels a été publiée pour HoloLens 2.


Ce tutoriel vous guide tout au long d’un projet complet, intégré à Unity, qui illustre les principales fonctionnalités Windows Mixed Reality sur HoloLens, notamment le regard, les mouvements, l’entréevocale, le son spatial et le mappage spatial. Le tutoriel prendra environ 1 heure.

Prise en charge des appareils

Cours HoloLens Casques immersifs
Réalité mixte - Principes fondamentaux - Cours 101E : Projet complet avec émulateur ✔️

Avant de commencer

Prérequis

Fichiers projet

  • Téléchargez les fichiers requis par le projet. Nécessite Unity 2017.2 ou version ultérieure.
    • Si vous avez toujours besoin de la prise en charge d’Unity 5.6, utilisez cette version.
    • Si vous avez toujours besoin de la prise en charge d’Unity 5.5, utilisez cette version.
    • Si vous avez toujours besoin de la prise en charge d’Unity 5.4, utilisez cette version.
  • Annulez l’archivage des fichiers sur votre bureau ou à un autre emplacement facile à atteindre. Conservez le nom du dossier Origami.

Notes

Si vous souhaitez examiner le code source avant le téléchargement, il est disponible sur GitHub.

Chapitre 1 - Monde « Holo »

Dans ce chapitre, nous allons configurer notre premier projet Unity et parcourir le processus de génération et de déploiement.

Objectifs

  • Configurez Unity pour le développement holographique.
  • Créez un hologramme.
  • Consultez un hologramme que vous avez créé.

Instructions

  • Démarrez Unity.
  • Sélectionnez Ouvrir.
  • Entrez l’emplacement comme dossier Origami que vous avez précédemment archivé.
  • Sélectionnez Origami , puis cliquez sur Sélectionner un dossier.
  • Enregistrez la nouvelle scène : Fichier / Enregistrer la scène sous.
  • Nommez la scène Origami et appuyez sur le bouton Enregistrer.

Configurer la caméra main

  • Dans Hierarchy Panel, sélectionnez Main Camera.
  • Dans l’inspecteur, définissez sa position de transformation sur 0,0,0.
  • Recherchez la propriété Clear Flags et remplacez la liste déroulante Skybox par Couleur unie.
  • Cliquez sur le champ Background pour ouvrir un sélecteur de couleurs.
  • Définissez R, G, B et A sur 0.

Configurer la scène

  • Dans le panneau Hiérarchie, cliquez sur Créer et créer vide.
  • Cliquez avec le bouton droit sur le nouveau GameObject , puis sélectionnez Renommer. Renommez le GameObject en OrigamiCollection.
  • À partir du dossier Holograms dans le panneau de projet :
    • Faites glisser Stage dans la hiérarchie pour être un enfant d’OrigamiCollection.
    • Faites glisser Sphere1 dans la hiérarchie pour être un enfant d’OrigamiCollection.
    • Faites glisser Sphere2 dans la hiérarchie pour être un enfant d’OrigamiCollection.
  • Cliquez avec le bouton droit sur l’objet Lumière directionnelle dans le panneau hiérarchie, puis sélectionnez Supprimer.
  • À partir du dossier Hologrammes , faites glisser Lumières vers la racine du panneau de hiérarchie.
  • Dans hiérarchie, sélectionnez OrigamiCollection.
  • Dans l’inspecteur, définissez la position de transformation sur 0, -0.5, 2.0.
  • Appuyez sur le bouton Lire dans Unity pour afficher un aperçu de vos hologrammes.
  • Vous devez voir les objets Origami dans la fenêtre d’aperçu.
  • Appuyez sur Lire une deuxième fois pour arrêter le mode aperçu.

Exporter le projet d’Unity vers Visual Studio

  • Dans Unity, sélectionnez Paramètres de build de fichier>.
  • Sélectionnez Windows Store dans la liste Plateforme , puis cliquez sur Changer de plateforme.
  • Définissez sdk sur Universal 10 et Type de build sur D3D.
  • Vérifiez Les projets Unity C#.
  • Cliquez sur Ajouter des scènes ouvertes pour ajouter la scène.
  • Cliquez sur Paramètres du lecteur....
  • Dans le panneau Inspecteur, sélectionnez le logo du Windows Store. Sélectionnez ensuite Paramètres de publication.
  • Dans la section Fonctionnalités , sélectionnez les fonctionnalités Microphone et SpatialPerception .
  • De retour dans la fenêtre Paramètres de build, cliquez sur Générer.
  • Créez un dossier nommé « App ».
  • Cliquez un seul clic sur le dossier de l’application.
  • Appuyez sur Sélectionner un dossier.
  • Une fois Unity terminé, une fenêtre Explorateur de fichiers s’affiche.
  • Ouvrez le dossier Application .
  • Ouvrez la solution Origami Visual Studio.
  • À l’aide de la barre d’outils supérieure de Visual Studio, modifiez la cible de Déboguer en Version et d’ARM en X86.
    • Cliquez sur la flèche en regard du bouton Appareil, puis sélectionnez Émulateur HoloLens.
    • Cliquez sur Déboguer -> Démarrer sans débogage ou appuyez sur Ctrl + F5.
    • Après un certain temps, l’émulateur démarre avec le projet Origami. Lors du premier lancement de l’émulateur, le démarrage de l’émulateur peut prendre jusqu’à 15 minutes. Une fois qu’il démarre, ne le fermez pas.

Chapitre 2 - Le regard

Dans ce chapitre, nous allons présenter la première des trois façons d’interagir avec vos hologrammes : le regard.

Objectifs

  • Visualisez votre regard à l’aide d’un curseur verrouillé dans le monde.

Instructions

  • Retour à votre projet Unity, puis fermez la fenêtre Paramètres de build si elle est toujours ouverte.
  • Sélectionnez le dossier Hologrammes dans le panneau Projet.
  • Faites glisser l’objet Cursor dans le panneau Hierarchy au niveau racine.
  • Double-cliquez sur l’objet Cursor pour l’examiner de plus près.
  • Cliquez avec le bouton droit sur le dossier Scripts dans le panneau Projet.
  • Cliquez sur le sous-menu Créer .
  • Sélectionnez Script C#.
  • Nommez le script WorldCursor. Remarque : Le nom respecte la casse. Vous n’avez pas besoin d’ajouter l’extension .cs.
  • Sélectionnez l’objet Cursor dans le panneau Hierarchy.
  • Faites glisser et déposez le script WorldCursor dans le panneau Inspector.
  • Double-cliquez sur le script WorldCursor pour l’ouvrir dans Visual Studio.
  • Copiez et collez ce code dans WorldCursor.cs et Enregistrer tout.
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;
        }
    }
}
  • Régénérez l’application à partir des paramètres de génération de fichiers>.
  • Revenez à la solution Visual Studio précédemment utilisée pour le déploiement sur l’émulateur.
  • Sélectionnez « Recharger tout » lorsque vous y êtes invité.
  • Cliquez sur Déboguer -> Démarrer sans débogage ou appuyez sur Ctrl + F5.
  • Utilisez la manette Xbox pour regarder autour de la scène. Notez comment le curseur interagit avec la forme des objets.

Chapitre 3 - Mouvements

Dans ce chapitre, nous allons ajouter la prise en charge des mouvements. Lorsque l’utilisateur sélectionne une sphère de papier, nous allons faire tomber la sphère en activant la gravité à l’aide du moteur physique d’Unity.

Objectifs

  • Contrôlez vos hologrammes avec le mouvement Sélectionner.

Instructions

Nous allons commencer par créer un script que peut détecter le mouvement Sélectionner.

  • Dans le dossier Scripts , créez un script nommé GazeGestureManager.
  • Faites glisser le script GazeGestureManager sur l’objet OrigamiCollection dans la hiérarchie.
  • Ouvrez le script GazeGestureManager dans Visual Studio et ajoutez le code suivant :
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();
        }
    }
}
  • Créez un autre script dans le dossier Scripts, cette fois nommé SphereCommands.
  • Développez l’objet OrigamiCollection dans la vue Hiérarchie.
  • Faites glisser le script SphereCommands sur l’objet Sphere1 dans le panneau Hierarchy.
  • Faites glisser le script SphereCommands sur l’objet Sphere2 dans le panneau Hierarchy.
  • Ouvrez le script dans Visual Studio pour le modifier, puis remplacez le code par défaut par ce qui suit :
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;
        }
    }
}
  • Exportez, générez et déployez l’application sur l’émulateur HoloLens.
  • Regardez autour de la scène, et centrez-vous sur l’une des sphères.
  • Appuyez sur le bouton A de la manette Xbox ou appuyez sur la barre d’espace pour simuler le mouvement Sélectionner.

Chapitre 4 - Voix

Dans ce chapitre, nous allons ajouter la prise en charge de deux commandes vocales : « Réinitialiser le monde » pour renvoyer les sphères supprimées à leur emplacement d’origine, et « Supprimer la sphère » pour faire tomber la sphère.

Objectifs

  • Ajoutez des commandes vocales qui écoutent toujours en arrière-plan.
  • Créez un hologramme qui réagit à une commande vocale.

Instructions

  • Dans le dossier Scripts , créez un script nommé SpeechManager.
  • Faire glisser le script SpeechManager sur l’objet OrigamiCollection dans hierarchy
  • Ouvrez le script SpeechManager dans Visual Studio.
  • Copiez et collez ce code dans SpeechManager.cs et Enregistrer tout :
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();
        }
    }
}
  • Ouvrez le script SphereCommands dans Visual Studio.
  • Mettez à jour le script pour lire comme suit :
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();
    }
}
  • Exportez, générez et déployez l’application sur l’émulateur HoloLens.
  • L’émulateur prend en charge le microphone de votre PC et répond à votre voix : ajustez la vue pour que le curseur se trouve sur l’une des sphères et dites « Drop Sphere ».
  • Dites « Réinitialiser le monde » pour les ramener à leurs positions initiales.

Chapitre 5 - Son spatial

Dans ce chapitre, nous allons ajouter de la musique à l’application, puis déclencher des effets sonores sur certaines actions. Nous allons utiliser le son spatial pour donner aux sons un emplacement spécifique dans l’espace 3D.

Objectifs

  • Entendre les hologrammes dans votre monde.

Instructions

  • Dans unity, sélectionnez dans le menu supérieur Modifier > les paramètres > du projet Audio
  • Recherchez le paramètre De plug-in Spatializer et sélectionnez MS HRTF Spatializer.
  • Dans le dossier Holograms , faites glisser l’objet Ambiance sur l’objet OrigamiCollection dans le panneau hierarchy.
  • Sélectionnez OrigamiCollection et recherchez le composant Source audio . Modifiez ces propriétés :
    • Vérifiez la propriété Spatialize .
    • Vérifiez l’option Play On Awake.
    • Remplacez Spatial Blend par 3D en faisant glisser le curseur vers la droite.
    • Vérifiez la propriété Loop .
    • Développez Paramètres audio 3D, puis entrez 0,1 pour Niveau Doppler.
    • Définissez Rolloff de volume sur Rolloff logarithmique.
    • Définissez Distance maximale sur 20.
  • Dans le dossier Scripts , créez un script nommé SphereSounds.
  • Faites glisser SphereSounds vers les objets Sphere1 et Sphere2 de la hiérarchie.
  • Ouvrez SphereSounds dans Visual Studio, mettez à jour le code suivant et enregistrez tout.
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();
        }
    }
}
  • Enregistrez le script et revenez à Unity.
  • Exportez, générez et déployez l’application sur l’émulateur HoloLens.
  • Portez un casque pour obtenir le plein effet, et avancez de plus en plus loin de la scène pour entendre les sons changer.

Chapitre 6 - Mappage spatial

Maintenant, nous allons utiliser le mappage spatial pour placer le plateau de jeu sur un objet réel dans le monde réel.

Objectifs

  • Apportez votre monde réel dans le monde virtuel.
  • Placez vos hologrammes là où ils comptent le plus pour vous.

Instructions

  • Cliquez sur le dossier Hologrammes dans le panneau Projet.
  • Faites glisser la ressource Mappage spatial vers la racine de la hiérarchie.
  • Cliquez sur l’objet Mappage spatial dans la hiérarchie.
  • Dans le panneau Inspecteur, modifiez les propriétés suivantes :
    • Cochez la case Dessiner des maillages visuels .
    • Recherchez Le matériau de dessin, puis cliquez sur le cercle à droite. Tapez « wireframe » dans le champ de recherche en haut. Cliquez sur le résultat, puis fermez la fenêtre.
  • Exportez, générez et déployez l’application sur l’émulateur HoloLens.
  • Lors de l’exécution de l’application, un maillage d’un salon du monde réel précédemment analysé est rendu en filaire.
  • Regardez comment une sphère de roulement va tomber de la scène, et sur le sol!

Nous allons maintenant vous montrer comment déplacer l’OrigamiCollection vers un nouvel emplacement :

  • Dans le dossier Scripts , créez un script nommé TapToPlaceParent.
  • Dans hiérarchie, développez OrigamiCollection et sélectionnez l’objet Stage .
  • Faites glisser le script TapToPlaceParent sur l’objet Stage.
  • Ouvrez le script TapToPlaceParent dans Visual Studio et mettez-le à jour comme suit :
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;
            }
        }
    }
}
  • Exportez, générez et déployez l’application.
  • Vous devriez maintenant être en mesure de placer le jeu dans un emplacement spécifique en le regardant, en utilisant le mouvement Sélectionner (A ou Barre d’espace), puis en vous déplaçant vers un nouvel emplacement et en utilisant à nouveau le mouvement Sélectionner.

La fin

Et c’est la fin de ce tutoriel !

Vous avez appris :

  • Comment créer une application holographique dans Unity.
  • Comment utiliser le regard, le mouvement, la voix, les sons et le mappage spatial.
  • Comment créer et déployer une application à l’aide de Visual Studio.

Vous êtes maintenant prêt à créer vos propres applications holographiques !

Voir aussi