Створення голограм для HoloLens без Unity

Хочу поділитися найпростішим способом створення голограммок для HoloLens, для яких не потрібно сторонніх редакторів. Всього лише маленький нугет пакет і трохи документації. З зростаючим інтересом до AR/VR, думаю, наявність простого інструменту для створення зокрема і неігрових 3д додатків — нікому не зашкодить. Основним рекомендованим способом розробки під HoloLens є Unity. Так-так, великий редактор, програмування мишкою, закритий код. Але також є і шаблон проекту на чистому DirectX11 C++ (або C# через SharpDX), який, власне показує, яким чином можна адаптувати будь-движок (навіть OpenGL only + ANGLE). Процес досить непростий, якщо буде інтерес — можу детально описати через які граблі мені довелося пройти.



Що можна з цим зробити
Для початку кілька демонстрацій того, що вже написано з використанням цього простенького інструменту. Всі приклади знаходяться у відкритому доступі (як і сам движок) на GitHub з ліцензією MIT.

  1. Hello World – маленький приклад створення world-locked голограм Землі з Місяцем.

  2. Hello World Advanced – ускладнений перший приклад, який показує як писати свої шейдери, для прикладу, ось такой. Він змінює примітивну Землю з першого у щось більш складне (склеюючи 5 текстур в одному шейдере). Якщо ще трохи дофантазувати, то в одному шейдере можна зробити таке:



    А ось ще варіація цього прикладу, яка показує реальне відносне відстань між Місяцем і Землею:

    Показати

  3. Приклад використання голосових команд Cortana, управління жестами і демонстрація высокополигонной фігурки зі скелетної анімацією:


  4. Невеликий приклад використання фізики (під капотом – Bullet – оточення сканується і до всіх стін, підлоги і стелі додаються компоненти RigidBody + CollisionShape.



  5. Управління натовпом (під капотом бібліотека Recast & Detour). При бажанні можна досить швидко зробити який-нибдь HoloCraft ).

    Показати

  6. Сканування оточення і створення мініатюри. Виглядає приблизно так:



  7. Зв'язка з Microsoft Cognitive Services для отримання інформації про оточення і розпізнавання тексту.

    Показати

  8. Ну і останнє демо зараз в розробці — допомога в плануванні ремонту.


Створюємо свою голограму
Тепер трохи докладніше про те, як же створити першу голограммку. Нам знадобляться:

Створюємо новий проект. Краще всього це зробити за допомогою підготовленого шаблона. Або можна створити з шаблону «Hologrphic DirectX 11 App» і викинути звідти майже все, додавши нугет пакет UrhoSharp.HoloLens.

Весь код всього проекту вміщується в пару десятків рядків коду:

using System;
using System.Collections.Generic;
Windows using.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.2 f);

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.5 f, 0.5 f);
RayQueryResult? result = Octree.RaycastSingle(cameraRay);
}

Цим фрагментів можна дізнатися на яку саме геометрію (координати, нормаль, компонент, вузол) дивиться зараз користувач (Ray cast). Наприклад, якщо на сайті ви зрозумієте, що це частина Spatial geometry, то по нормалі можна зрозуміти чи є це горизонтальною або вертикальною площиною. Приклад з урною вище дозволяє користувачеві ставити урну тільки на горизонтальних площинах за цим принципом (код).

висновки
Движок не є конкурентом відомим монстрам, але якщо інтерес до неигровому 3д через VR/AR зростає, то чим більше вибір інструментів (особливо простих і відкритих) — тим краще, чи не правда? По самому движка так само можна знайти кілька цікавих статей на Хабре.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.