
Что можно с этим сделать
Для начала несколько демонстраций того, что уже написано с использованием этого простенького инструмента. Все примеры находятся в открытом доступе (как и сам движок) на GitHub с MIT лицензией.
- Hello World – маленький пример создания world-locked голограмм Земли с Луной.
 
 
- Hello World Advanced – усложненный первый пример, показывающий как писать свои шейдеры, для примера, вот такой. Он меняет примитивную Землю из первого во что-то более сложное (склеивая 5 текстур в одном шейдере). Если еще чуть-чуть дофантазировать, то в одном шейдере можно сделать такое:
 
  
 
 А вот еще вариация этого примера, которая показывает реальное относительное расстояние между Луной и Землей:
 
 Показать 
 
 
- Пример использования голосовых команд Cortana, управления жестами и демонстрация высокополигонной фигурки со скелетной анимацией:
 
 
 
- Небольшой пример использования физики (под капотом – Bullet) – окружение сканируется и ко всем стенам, полу и потолку добавляются компоненты RigidBody + CollisionShape.
 
  
 
 
- Управление толпой (под капотом библиотека Recast & Detour). При желании можно довольно быстро сделать какой-нибдь HoloCraft ).
 
 Показать 
 
 
- Сканирование окружения и создание миниатюры. Выглядит примерно так:
 
   
 
 
- Связка с Microsoft Cognitive Services для получения информации об окружении и распознавания текста.
 
 Показать
 
 
- Ну и последнее демо сейчас в разработке — помощь в планировании ремонта.
 
 
 
Создаем свою голограмму
Теперь немного подробнее о том, как же создать первую голограммку. Нам понадобятся:
- Windows 10,
- Visual Studio 2015 Update 3
- 3000$ или HoloLens Emulator
Создаем новый проект. Лучше всего это сделать при помощи подготовленного шаблона. Либо можно создать из шаблона “Hologrphic DirectX 11 App” и выкинуть оттуда почти всё, добавив нугет пакет UrhoSharp.HoloLens.
Весь код всего проекта умещается в пару десятков строк кода:
using System;
using System.Collections.Generic;
using Windows.ApplicationModel.Core;
using Urho;
using Urho.HoloLens;
using Urho.Shapes;
namespace HelloHabr
{
    internal class Program
    {
        [MTAThread]
        static void Main() => CoreApplication.Run(
            new UrhoAppViewSource<App>());
    }
    public class App : HoloApplication
    {
        public App(ApplicationOptions opts) : base(opts) { }
        protected override async void Start()
        {
            base.Start();
            
            var node = Scene.CreateChild();
            node.Position = new Vector3(0, 0, 1);
            node.SetScale(0.2f);
            var sphere = node.CreateComponent<Sphere>();
            sphere.Color = Color.Red;
        }
    }
}
Если запустить — увидим сферу красного цвета в метре от себя (координаты — в метрах, в качестве точки отсчета используется первый кадр) диаметром 20см. Довольно просто, не так ли? Urho использует некоторую вариацию популярной архитектуры Entity component system. В качестве Entity выступает Node. Из иерархии узлов и состоит сцена. Каждый узел может иметь коллекцию компонентов, отвечающих за физику, анимации, отображение моделек и т.п. Но также в него вынесены Position, Scale и Rotation. В нашем сниппете за базовую подготовку сцены отвечает base.Start(), который и создаст сцену (корневой Node), настроит камеры для глаз, освещение и тому подобное. Вам лишь остается дальше развивать подготовленную сцену. При желании, сцену можно описать в Shared Projects или PCL и сделать ее доступной сразу ко всему ряду поддерживаемых платформ:
- iOS, tvOS (в виде UIView)
- macOS (Cocoa, в виде NSView)
- UWP, WPF, WinForms (в виде контрола)
- Android (SurfaceView виджет)
- Xamarin.Forms
- Планируется: Google Cardboard, Daydream, Oculus, Vive
Рассмотрим некоторые HoloLens специфичные возможности. И хотя никто не запрещает использовать все системные API напрямую, основные вещи вынесены для удобства в базовый класс.
Text-to-speech.
Ну тут всё просто как грабли, один асинхронный метод базового класса:
await TextToSpeech("Hello World");
К сожалению, самим устройством поддерживается только английский язык.
Speech-to-text
Нужно не забыть добавить «Микрофон» как Device Capability в манифесте и использовать это простое API для регистрации команд:
RegisterCortanaCommands(new Dictionary<string, Action>
    {
        {"idle", () => PlayAnimation(IdleAni)},
        {"die", () => PlayAnimation(KillAni)},
        {"look at me", LookAtMe },
        {"help", Help }
    });
Т.е. просто словарик из «команда» — действие.
Spatial mapping.
Для этого необходимо сперва его запустить через
await StartSpatialMapping(extents: new Vector3(50, 50, 50), 
      trianglesPerCubicMeter: 1200);
Требуется задать объем «наблюдения» и желаемое количество треугольников на кубический метр.
Девайс возвращает окружение в виде коллекции поверхностей (поверхностью может быть часть пола + часть стены + часть потолка, т.е. они не плоские). Каждая коллекция имеет id и сохраняется во внутреннюю память самого устройства. По этому же id оно потом сообщает об изменениях. Поверхность состоит из большого количества вершин, нормалей и индексов (стандартный способ задания геометрии). Превращение этого добра в статичную модель уже реализовано в базовом классе, но при желании можно переопределить поведение.
Жесты
На данный момент есть четыре жеста: Tap, Double tap, Hold, Hold & Move. Пример для обработки «клика»:
EnableGestureTapped = true;
public override void OnGestureTapped()
{
    Ray cameraRay = LeftCamera.GetScreenRay(0.5f, 0.5f);
    RayQueryResult? result = Octree.RaycastSingle(cameraRay);
}
Этим сниппетом можно узнать на какую именно геометрию (координаты, нормаль, компонент, узел) смотрит сейчас пользователь (Ray cast). К примеру, если по узлу вы поймете, что это часть Spatial geometry, то по нормали можно понять является ли это горизонтальной или вертикальной плоскостью. Пример с урной выше разрешает пользователю ставить урну только на горизонтальных плоскостях по этому принципу (код).
В качестве заключения
Движок не является конкурентом известным монстрам, но если интерес к неигровому 3д из-за VR/AR растет, то чем больше выбор инструментов (особенно простых и открытых) — тем лучше, не правда ли? По самому движку так же можно найти несколько интересных статей на Хабре.
Комментарии (24)
- 3aicheg31.10.2016 15:24+2- Отлично. Терпеть не могу туториалы по программированию в стиле «поставьте развесистую хрень и потыкайте мышкой в сто мест в нужной последовательности», а по хололенсу что-то другое не особо находится. Если запилите нормальных туториалов небольших, где надо писать код самому руками — лично я буду рад. 
 
 На С++ под хололенс на этом движке тоже можно писать? - Nagg31.10.2016 15:34- Да, можно но надо будет потратить время на настройку cmake, но уже сейчас с C# можно легко смешивать плюсы и сишарп (причем с возможностью одновременной отладки обоих). 
 
 - TimeCoder31.10.2016 19:27+1- Классный код! И все-таки, если сравнивать очки от MS и Sony PS4 — что перспективней?  - Nagg31.10.2016 19:41- Вы имеет ввиду Sony VR? Это принципиально разные устройства. С Sony VR надо будет сравнить очки, которые на днях анонсировали партнеры Microsoft (Dell, Asus, etc), там обещали цену, меньшую чем Sony VR. В принципе VR очки все одинаковые, так что их сравнивать надо по цене и контроллерам :-). 
 
 - ad1Dima31.10.2016 20:06+1- Спасибо, шикарные примеры для понимания, как работает и что может HoloLens. 
 - semenyakinVS31.10.2016 21:49- Очень круто. Спасибо за уроки и за движочек!.. Вообще, честно говоря, удивлён насколько точно сканируется положение в пространстве и, что ещё круче, форма окружения. Почти как в рекламе. Впечатляет.  - Nagg31.10.2016 23:04- Ну ему не нужно прямо детальное сканирование, скорее просто чтобы определить поверхности. Но разобрать детали из геометрии можно, для примера: 
  
 - :-)  - semenyakinVS01.11.2016 00:12- А оно работает с помощью бинокулярного зрения? Или там какой-то сканер используется?  - keydon201.11.2016 00:19+1- Осмелюсь предположить, что инфракрасная сетка накладывается и по ее искажениям смотрят поверхности.  - Nagg01.11.2016 01:25- Не владею информацией о конкретной реализации в устройстве, но можете почитать этот тред https://forums.hololens.com/discussion/413/hololens-depth-sensor-and-technology 
 - 3aicheg01.11.2016 03:54- Пишут, что нет — по скорости света. https://en.wikipedia.org/wiki/Time-of-flight_camera 
 
 
 
 
 - keydon201.11.2016 00:22- Майкрософт так старается продвигать свои хололенз, столько туториалов, такие возможности обещают. 
 Вот только слишком уж многое — чисто на эмуляторе, цена устройства под 200к ставит крест на каком-либо применении в ближайшем будущем.
 Поэтому я не очень понимаю людей, которые сейчас разрабатывают под хололенз. Для кого они пишут ПО? - Nagg01.11.2016 01:17- 1) Это developer edition, зачем судить по нему о цене? Это дорого для какого-нибудь инди, но на средне-большую компанию это копейки, за которые можно впечатлить и получить вау-эффект, а то и найти реальное применение (такие уже есть). 
 2) Платформа, на которой это всё работает будет работать и в VR шлемах, которые уже анонсированы (и стоят от 299$).
 3) Кто знает взлетит оно или нет, обучаться и разрабатывать сейчас — это инвестиции с риском. Можно конечно пойти в какие-нибудь iOS/Android разработчики и писать скучные 2Д интерфейсы которые изжили себя среди таких же миллионов разработчиков мало чем среди них выделяясь, а можно попытаться заглянуть в будщее и представить как же привычные сейчас вещи и будут выглядить завтра.
 Не будьте луддитом ;-)
 
- 3aicheg01.11.2016 08:43- 01_HelloWorld\Program.cs(14,90,14,96): error CS1503: Argument 1: cannot convert from 'string' to 'Urho.ApplicationOptions' 
 
 на строку
 
 static void Main() => CoreApplication.Run(new UrhoAppViewSource(«Data»));
 
 Остальные проекты, вроде, собираются. Что нажать в студии, чтобы деплоила Урхо на девайс? Если я правильно понял, по-дефолту она этого не делает, выдаёт следующее: DEP0700: Registration of the app failed. Deployment Register operation with target volume C: on Package HoloUrho_1.0.0.0_x86__z10v2vk4de6hc from: (AppxManifest.xml) failed with error 0x80073CFD.
 
           
 

begemot_sun
Круто. Такие технологии и в массы.
andy_pu
В массы пока не получится, всё-таки очёчки около $3500 стоят, но выглядит это всё очень круто