основные сведения о HoloLens (1 gen) основы 101E: завершение проекта с помощью эмулятора

Важно!

учебники по смешанной реальности Academy были разработаны с учетом HoloLens (1-го поколения), Unity 2017 и впечатляющих головных телефонов смешанной реальности. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. эти учебники не будут обновлены с использованием последних наборов инструментов или взаимодействий, используемых для HoloLens 2 и могут быть несовместимы с более новыми версиями Unity. Они будут сохранены для работы на поддерживаемых устройствах. Опубликован новый цикл руководств для HoloLens 2.


в этом руководстве описывается полный проект, встроенный в Unity, демонстрирующий основные Windows Mixed Reality функции HoloLens включая взгляд, жесты, речевой ввод, пространственный звук и пространственное сопоставление. Выполнение руководства займет примерно 1 час.

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
101E. Основы смешанной реальности: полный проект с использованием эмулятора ✔️

Прежде чем начать

Предварительные условия

Файлы проекта

  • Скачайте файлы , необходимые для проекта. Требуется Unity 2017,2 или более поздней версии.
    • Если вам по-прежнему требуется поддержка Unity 5,6, используйте Этот выпуск.
    • Если вам по-прежнему требуется поддержка Unity 5,5, используйте Этот выпуск.
    • Если вам по-прежнему требуется поддержка Unity 5,4, используйте Этот выпуск.
  • Отмена архивации файлов на Рабочий стол или другого места для удобства доступа. В качестве имени папки используйте Origami.

Примечание

Если вы хотите просмотреть исходный код перед загрузкой, он будет доступен на GitHub.

Глава 1-"Холо"

В этой главе мы создадим наш первый проект Unity и пошаговым процессом сборки и развертывания.

Задачи

  • Настройка Unity для разработки с Holographic.
  • Создайте голограмму.
  • Ознакомьтесь с созданной голограммой.

Инструкции

  • Запустите Unity.
  • Выберите Открыть.
  • Введите Location в качестве папки Origami , которая была отменена для архивации.
  • Выберите Origami и щелкните выбрать папку.
  • Сохраните новую сцену: файлсохранить сцену как.
  • Присвойте сцене имя Origami и нажмите кнопку Save (сохранить ).

Настройка основной камеры

  • На панели Иерархия выберите объект Main Camera.
  • В инспекторе задайте для его параметра «transform » значение 0, 0,0.
  • Найдите свойство clear flags и измените раскрывающийся список с скибокс на сплошной цвет.
  • Щелкните поле Фон, чтобы открыть палитру.
  • Задайте для R, G, B, and A (Красный, зеленый, синий и альфа-компонент) значение 0.

Настройка сцены

  • На панели Иерархиящелкните создать и создать пустой.
  • Щелкните правой кнопкой мыши новый GameObject и выберите команду Переименовать. Переименуйте GameObject в оригамиколлектион.
  • в папке Голограммы на панели Project:
    • Перетащите этап в иерархию, чтобы он был дочерним элементом оригамиколлектион.
    • Перетащите Sphere1 в иерархию, чтобы она была дочерней для оригамиколлектион.
    • Перетащите Sphere2 в иерархию, чтобы она была дочерней для оригамиколлектион.
  • Щелкните правой кнопкой мыши направленный объект Light на панели Иерархия и выберите команду Удалить.
  • в папке Голограммы перетащите огни в корень панели иерархия.
  • В иерархиивыберите оригамиколлектион.
  • В инспекторезадайте для параметра Расположение преобразования значение 0,-0,5, 2,0.
  • Нажмите кнопку воспроизвести в Unity, чтобы просмотреть голограммы.
  • В окне предварительного просмотра должны отобразиться объекты Origami.
  • Чтобы выйти из режима предварительного просмотра, нажмите кнопку воспроизвести еще раз.

Экспорт проекта из Unity в Visual Studio

  • в Unity выберите файл сборка Параметры.
  • выберите хранилище Windows в списке платформа и щелкните переключить платформу.
  • Задайте для пакета SDK значение универсальное 10 , а для типа сборкиD3D.
  • Проверьте проекты C# для Unity.
  • Щелкните Добавить открытые сцены , чтобы добавить сцену.
  • щелкните Параметры проигрывателя....
  • на панели инспектора выберите эмблему магазина Windows. затем выберите публикация Параметры.
  • В разделе возможности выберите возможности микрофона и спатиалперцептион .
  • в окне сборка Параметры щелкните сборка.
  • Создайте новую папку с именем App.
  • Щелкните папку приложенияодним щелчком мыши.
  • Нажмите кнопку выбрать папку.
  • После завершения Unity появится окно проводника.
  • Откройте папку приложения .
  • откройте решение Origami Visual Studio.
  • с помощью верхней панели инструментов в Visual Studio измените целевой объект с отладка на выпуск и с ARM на X86.
    • щелкните стрелку рядом с кнопкой устройство и выберите HoloLens Emulator.
    • Щелкните Отладка- запустить без отладки или нажмите клавиши CTRL + F5.
    • Через некоторое время эмулятор начнет работу с проектом Origami. При первом запуске эмуляторадля запуска эмулятора может потребоваться до 15 минут. После запуска не закрывайте его.

Глава 2. взгляд

В этой главе мы будем познакомиться с первым из трех способов взаимодействия с голограммами — Взгляните.

Задачи

  • Визуализируйте взгляд с помощью курсора, заблокированного по всему миру.

Инструкции

  • вернитесь к проекту Unity и закройте окно Параметры сборки, если оно все еще открыто.
  • выберите папку Голограммы на панели Project.
  • Перетащите объект курсора на панель Иерархия на корневом уровне.
  • Дважды щелкните объект курсора , чтобы просмотреть его Подробнее.
  • щелкните правой кнопкой мыши папку скрипты на панели Project.
  • Щелкните подменю создать .
  • Выберите скрипт C#.
  • Назовите сценарий ворлдкурсор. Примечание. в имени учитывается регистр. Добавлять расширение CS не требуется.
  • Выберите объект курсора на панели Иерархия.
  • Перетащите сценарий ворлдкурсор на Панель инспектора.
  • Дважды щелкните скрипт ворлдкурсор , чтобы открыть его в Visual Studio.
  • Скопируйте и вставьте этот код в ворлдкурсор. CS и Сохраните все.
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;
        }
    }
}
  • перестройте приложение из Параметры сборки файлов.
  • вернитесь к Visual Studio решению, ранее использованному для развертывания в эмуляторе.
  • При появлении запроса выберите "перезагрузить все".
  • Щелкните Отладка- запустить без отладки или нажмите клавиши CTRL + F5.
  • Используйте контроллер Xbox для просмотра сцены. Обратите внимание, что курсор взаимодействует с формой объектов.

Глава 3 — жесты

В этой главе мы добавим поддержку жестов. Когда пользователь выбирает бумажную сферу, мы сделаем сферу, включив для нее функцию "сила притяжения" с помощью системы обработки физических модулей Unity.

Задачи

  • Контролируйте голограммы с помощью жеста выбора.

Инструкции

Начнем с создания сценария, чем может обнаружить жест выбора.

  • В папке Scripts создайте скрипт с именем газежестуреманажер.
  • Перетащите скрипт газежестуреманажер на объект оригамиколлектион в иерархии.
  • откройте скрипт газежестуреманажер в Visual Studio и добавьте следующий код:
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();
        }
    }
}
  • Создайте другой скрипт в папке Scripts с именем сферекоммандс.
  • Разверните объект оригамиколлектион в представлении иерархии.
  • Перетащите скрипт сферекоммандс на объект Sphere1 на панели Иерархия.
  • Перетащите скрипт сферекоммандс на объект Sphere2 на панели Иерархия.
  • откройте скрипт в Visual Studio для редактирования и замените код по умолчанию следующим:
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;
        }
    }
}
  • экспорт, сборка и развертывание приложения в эмуляторе HoloLens.
  • Взгляните на сцену и помещайтесь по центру на одном из шарик.
  • Нажмите кнопку на контроллере Xbox или нажмите клавишу пробел, чтобы имитировать жест выбора.

Глава 4-Voice

В этой главе мы добавим поддержку двух голосовых команд: "сбросить мир", чтобы вернуть удаленные шарик к их исходному расположению и "удалить шар", чтобы сделать сферу.

Задачи

  • Добавление речевых команд, которые всегда прослушиваются в фоновом режиме.
  • Создайте голограмму, которая реагирует на голосовую команду.

Инструкции

  • В папке Scripts создайте скрипт с именем спичманажер.
  • Перетащите скрипт спичманажер на объект оригамиколлектион в иерархии
  • Откройте скрипт спичманажер в Visual Studio.
  • Скопируйте и вставьте этот код в спичманажер. CS и Сохраните все:
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();
        }
    }
}
  • Откройте скрипт сферекоммандс в Visual Studio.
  • Обновите скрипт для чтения следующим образом:
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();
    }
}
  • экспорт, сборка и развертывание приложения в эмуляторе HoloLens.
  • Эмулятор будет поддерживать микрофон компьютера и отвечать на ваш голос: настройте представление таким образом, чтобы курсор наследовался на одном из шарик и сказал «Drop Sphere».
  • Скажите «сбросить мир», чтобы вернуть их в исходное положение.

Глава 5 — Пространственный звук

В этой главе мы добавим музыку в приложение, а затем активируем звуковые эффекты для определенных действий. Мы будем использовать Пространственный звук , чтобы дать звуковое сопровождение определенному месту в трехмерном пространстве.

Задачи

  • Прослушайте голограммы в своем мире.

Инструкции

  • в элементе Unity выберите в верхнем меню изменить Project Параметры > Audio .
  • Найдите параметр подключаемого модуля спатиализер и выберите MS хртф спатиализер.
  • из папки Голограммы перетащите объект окружения на объект оригамиколлектион на панели иерархия.
  • Выберите оригамиколлектион и найдите компонент " источник аудио ". Измените следующие свойства:
    • Проверьте свойство спатиализе .
    • Проверьте Воспроизведение в спящемрежиме.
    • Измените пространственный переход на 3D , перетащив ползунок вправо.
    • Проверьте свойство Loop .
    • разверните 3d Sound Параметрыи введите 0,1 для уровня Doppler.
    • Задайте для параметра Volume роллофф значение логарифмической роллофф.
    • Установите Максимальное расстояние равным 20.
  • В папке Scripts создайте скрипт с именем сфересаундс.
  • Перетащите сфересаундс в объекты Sphere1 и Sphere2 в иерархии.
  • откройте сфересаундс в Visual Studio, обновите следующий код и сохраните все.
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();
        }
    }
}
  • Сохраните скрипт и вернитесь в Unity.
  • экспорт, сборка и развертывание приложения в эмуляторе HoloLens.
  • Выизнос наушников, чтобы получить полный результат, и продвинуться ближе и дальше от этапа, чтобы услышать смену звуков.

Глава 6-пространственное сопоставление

Теперь мы будем использовать пространственное сопоставление , чтобы поместить игровую доску на реальный объект в реальном мире.

Задачи

  • Приведите реальный мир к виртуальному миру.
  • Размещайте голограммы, где это важно.

Инструкции

  • щелкните папку Голограммы на панели Project.
  • Перетащите ресурс пространственного сопоставления в корень иерархии.
  • Щелкните объект пространственного сопоставления в иерархии.
  • На панели инспектораизмените следующие свойства.
    • Установите флажок рисовать визуальные сетки .
    • Перейдите на вкладку Рисование материалов и щелкните окружность справа. Введите "каркаснаясхема" в поле поиска вверху. Щелкните результат, а затем закройте окно.
  • экспорт, сборка и развертывание приложения в эмуляторе HoloLens.
  • При запуске приложения сеть ранее проверенной в реальном времени области будет отображаться в каркасе.
  • Следите за тем, как изкрутка будет выпадать за пределы этапа, и на этаж!

Теперь мы покажем, как переместить Оригамиколлектион в новое расположение:

  • В папке Scripts создайте скрипт с именем таптоплацепарент.
  • В иерархииразверните оригамиколлектион и выберите объект Stage .
  • Перетащите скрипт таптоплацепарент на объект Stage.
  • откройте скрипт таптоплацепарент в Visual Studio и обновите его следующим образом:
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;
            }
        }
    }
}
  • Экспорт, сборка и развертывание приложения.
  • Теперь вы можете разместить игру в определенном месте, облаками ее с помощью жеста выбора (a или пробела), а затем переместить в новое место и снова с помощью жеста выбора.

Конец

И это окончание этого руководства.

Вы узнали:

  • Создание приложения holographic в Unity.
  • Использование взгляда, жеста, голоса, звуков и пространственного сопоставления.
  • Как создать и развернуть приложение с помощью Visual Studio.

Теперь вы готовы приступить к созданию собственных приложений holographic!

См. также раздел