Одним из наиболее интересных и революционных технологических продуктов на данный момент является Microsoft HoloLens. Возможность показа в реальном времени трехмерных голограмм, легко смешанных с любой физической средой, открывает бесконечные новые возможности для современных вычислений. Я только что поцарапал поверхность голографической кроличьей норы и, учитывая, что аппаратное обеспечение только что начало поставляться в виде комплекта разработчика за 3000 долларов, можно с уверенностью сказать, что лучшее еще впереди.
Если вы не можете дождаться выхода общедоступной версии и хотите углубиться в разработку приложений HoloLens сегодня, тогда есть хорошие новости! Инструмент уже доступен, он бесплатный, и вам даже не нужен HoloLens для начала работы.
Предпосылки
Поскольку HoloLens работает под управлением Windows 10, приложения создаются для универсальной платформы Windows (UWP), что означает, что приложения UWP, написанные для мобильных устройств, настольных компьютеров, Xbox и других платформ, также будут работать на HoloLens. Существует два основных инструмента, необходимых для создания голографических изображений — Visual Studio 2015 и Unity 3D. Вы будете использовать их вместе с SDK и эмулятором. В общей сложности вам понадобится следующее:
- Windows 10
- Visual Studio 2015, обновление 2 (выпуск для сообщества)
- Unity 3D для HoloLens
- Windows 10 SDK (если вы еще не установили его с Visual Studio 2015)
- HoloLens Emulator
После того, как вы установили эти инструменты, вы готовы создать свой первый голографический опыт.
Хотя HoloLens запускает приложения UWP, которые в свою очередь написаны с использованием C # и Visual Studio, уникальным аспектом приложений HoloLens являются трехмерные голограммы. Они создаются и моделируются в вашем любимом 3D-программном обеспечении, но если вы похожи на меня и не знаете, как создавать 3D-модели, есть сервисы, которые вы можете использовать, когда профессионалы создадут их для вас. У Unity даже есть собственный магазин активов 3D-моделей . Я включу краткое введение в Unity, однако это огромная тема. У SitePoint есть несколько других статей по Unity, с которых можно начать.
Unity 3D позволяет импортировать и манипулировать 3D-моделями, а также управлять событиями и сценариями для каждого объекта. Вы можете управлять освещением, окружением (известным как «сцена») и любым другим аспектом мира, который вы хотите проецировать для своих пользователей. Unity нелегко освоить, но нет способа обойти его, если вы хотите создавать приложения HoloLens.
Создание 3D-объектов в Unity
Вы можете создавать базовые фигуры в Unity, открыв меню GameObject , перейдя в 3D Object и выбрав нужный 3D-объект.
Выбор сферы создает базовую форму сферы в вашей сцене, которой вы можете манипулировать, анимировать и контролировать.
Основной способ взаимодействия с трехмерными объектами в голографическом режиме — это прикрепление сценариев к объектам. Вы делаете это, создавая новый скрипт в Unity.
Вы можете редактировать этот скрипт в Visual Studio, дважды щелкнув по нему.
using UnityEngine; using System.Collections; public class SphereBehaviour : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
Метод Start
вызывается при запуске приложения и устанавливает любые события или код инициализации. Update
вызывается один раз за кадр, и в нем вы обнаруживаете такие взаимодействия, как столкновения, попадания RayCast
и другие взаимодействия с пользователем.
Чтобы прикрепить скрипт к объекту в Unity, перетащите его на него. Код в сценарии будет выполняться соответствующим образом при вызове методов. Это может начаться, когда пользователь произносит голосовую команду или любое другое событие в вашем голографическом опыте.
Чтобы запустить голографическое приложение, вам нужно импортировать проект в Visual Studio, и Unity может создать для вас полноценное приложение UWP. Используйте следующие настройки сборки из меню «Настройки сборки» .
Убедитесь, что вы открыли « Параметры проигрывателя» , выберите « Поддерживаемая виртуальная реальность» и убедитесь, что присутствует голографический SDK Windows .
Когда вы нажмете « Построить» , Unity создаст полное решение для приложения UWP в выбранной вами папке. Вы можете открыть это решение в Visual Studio.
По умолчанию приложения Universal Windows Platform, экспортированные из Unity, будут работать на любом устройстве Windows 10. Поскольку HoloLens отличается, приложение должно использовать преимущества функций, которые доступны только на HoloLens. Чтобы сделать это, вам нужно установить для TargetDeviceFamily
значение «Windows.Holographic» в файле Package.appxmanifest в Visual Studio, как показано ниже.
И теперь вы можете запустить решение в эмуляторе HoloLens.
Теперь, когда вы знаете рабочий процесс создания трехмерного рабочего пространства, можете добавлять модели и применять сценарии к этим моделям, пришло время взглянуть на основные области взаимодействия с голограммами в приложениях HoloLens.
Ввод взгляда
Взгляд — это первая форма ввода в приложения HoloLens и способ сосредоточиться на голограммах. Он является центром поля зрения, когда пользователь просматривает HoloLens, и по сути является «курсором мыши». Вы можете создать этот курсор любым удобным вам способом, чтобы он мог соответствовать вашему приложению, логотипу компании или любой другой трехмерной фигуре.
Имейте в виду, что HoloLens использует положение и ориентацию головы вашего пользователя, а не его глаз, чтобы определить вектор их взгляда. Это как лазерная указка, которая выходит прямо из центра HoloLens.
Курсор также является трехмерным объектом, и вам необходимо кодировать его так, чтобы он вел себя как курсор. Создайте новый скрипт в Unity и присоедините его к вашей модели, затем используйте код, подобный приведенному ниже:
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 the cursor 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; } } }
Важной частью кода является объект RayCast
. Это «лазерный луч», упомянутый выше, и является тестом, чтобы увидеть, смотрит ли ваш пользователь на объект. Если есть удар, вы показываете курсор и заставляете его «обнимать» любую поверхность, на которой он находится.
Ввод жестов
После того как вы нацелились на объект, с которым вы хотите взаимодействовать, вы можете использовать жесты для выполнения реального взаимодействия. Самый распространенный и свободный жест — это «тап». Это похоже на нажатие левой кнопки мыши, чтобы вызвать действие на объекте. Можно выполнять более сложные жесты, такие как «касание и удержание» для перемещения объектов в трехмерном пространстве.
Создайте еще один скрипт в Unity и включите код, подобный приведенному ниже. Затем скрипт связывается с корнем вашего проекта, так как вы хотите, чтобы жесты были глобальными в приложении и взаимодействовали с любым 3D-объектом.
using UnityEngine; using UnityEngine.VR.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.TappedEvent += (source, tapCount, ray) => { // Send an OnSelect message to the focused object and its ancestors. if (FocusedObject != null) { FocusedObject.SendMessageUpwards("OnSelect"); } }; 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(); } } }
Основным объектом, который следует отметить в этом фрагменте, является GestureRecognizer
. Он отвечает за распознавание жестов, которые выполняют пользователи вашего приложения. Здесь вы регистрируете TappedEvent
для передачи события OnSelect
объекту при каждом касании.
Метод Update
постоянно проверяет, находится ли какой-либо объект на объекте, и устанавливает его в фокусе, чтобы отправить событие касания объекту при касании.
Голосовой ввод
Мой любимый способ взаимодействия с HoloLens (или, по крайней мере, с эмулятором) — использовать голос. Помимо правила «Посмотри, скажи», вы можете создавать свои собственные фразы, которые распознает HoloLens. Когда приложение распознает определенную фразу, запускается событие, которое вы можете использовать для обработки действия фразы.
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 Object", () => { var focusObject = GazeGestureManager.Instance.FocusedObject; if (focusObject != null) { // Call the OnDrop method on just the focused object. focusObject.SendMessage("OnDrop"); } }); // 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(); } } }
Объект, который выполняет всю тяжелую работу, — это KeywordRecognizer
, конструктор которого принимает ключевые слова в виде Array
. Каждый раз, когда он распознает фразу, OnPhraseRecognized
событие OnPhraseRecognized
и вызывается действие ключевого слова. Когда пользователь говорит «Сбросить мир», OnReset
сообщение OnReset
а когда говорится, что « OnDrop
объект», событие OnDrop
отправляется объекту, на который OnDrop
.
Аудио ввод
Последняя основная часть создания голографического опыта — это погружение звука. Это не способ для пользователей предоставить информацию, а способ показать пользователям, что происходит в процессе работы и на что им следует обратить внимание.
Добавить аудио технически несложно, но добавить звук, который уместен и важен для восприятия, сложно. SDK позаботится о расположении звука относительно того, где пользователь просматривает HoloLens, но слишком много звуков может сбить с толку, и слишком мало может оставить пользователя, задающегося вопросом, что делать дальше.
Фрагмент ниже добавляет два звука, один для удара объекта и один для объекта (например, вашей сферы), катящегося.
using UnityEngine; public class SphereSounds : MonoBehaviour { AudioSource audioSource = null; AudioClip impactClip = null; AudioClip rollingClip = null; bool rolling = false; void Start() { // Add an AudioSource component and set up some defaults audioSource = gameObject.AddComponent<AudioSource>(); audioSource.playOnAwake = false; audioSource.spatialize = true; audioSource.spatialBlend = 1.0f; audioSource.dopplerLevel = 0.0f; audioSource.rolloffMode = AudioRolloffMode.Custom; // Load the Sphere sounds from the Resources folder impactClip = Resources.Load<AudioClip>("Impact"); rollingClip = 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) { audioSource.clip = impactClip; audioSource.Play(); } } // Occurs each frame that this object continues to collide with another object void OnCollisionStay(Collision collision) { Rigidbody rigid = this.gameObject.GetComponent<Rigidbody>(); // Play a rolling sound if the sphere is rolling fast enough. if (!rolling && rigid.velocity.magnitude >= 0.01f) { rolling = true; audioSource.clip = rollingClip; audioSource.Play(); } // Stop the rolling sound if rolling slows down. else if (rolling && rigid.velocity.magnitude < 0.01f) { rolling = false; audioSource.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; audioSource.Stop(); } } }
События OnCollisionEnter
, OnCollisionStay
и OnCollisionExit
определяют, когда начинать аудиоклип, продолжать ли аудиоклип и когда останавливать аудиоклип. Это только один из способов добавления звука, который запускается при событии столкновения, но вы также можете добавить окружающий звук, такой как музыка, которая воспроизводится на протяжении всего опыта, или голосовые клипы, запускаемые событиями прогресса. Добавление аудио делает ваш опыт более правдоподобным и полностью погружает пользователя.
Фрагменты кода от https://developer.microsoft.com/en-us/windows/holographic/holograms_101e
Ваше будущее HoloDeck
Если вы разработчик программного обеспечения, производящего традиционное программное обеспечение для настольных, мобильных и корпоративных сред, создание приложений и приложений для HoloLens — это шаг в неизвестность. То, как вам нужно думать об опыте в трехмерном пространстве, бросит вызов вашему традиционному восприятию разработки приложений.
Хорошая вещь о создании приложений для HoloLens заключается в том, что вам не нужно расставаться с 3000 долларов США, чтобы купить HoloLens, чтобы начать. Все инструменты бесплатны, и вы можете использовать эмулятор практически для всех сценариев, которые вы хотите разработать, позже протестируйте на реальном устройстве.
HoloLens работает под управлением Windows 10, поэтому ваши существующие приложения UWP будут работать, и вы сможете расширить их, чтобы получить полный голографический опыт при работе на HoloLens.
Будущее за цифровыми реалиями светлое, и раннее понимание этого позволит вам в полной мере воспользоваться платформой, как только потребители вступят в игру.
Я очень рад услышать ваши вопросы и комментарии ниже .