- PVSM.RU - https://www.pvsm.ru -
Хочу поделиться самым простым способом создания голограммок для HoloLens, для которых не потребуется сторонних редакторов. Всего лишь маленький нугет пакет и чуть-чуть документации. С возрастающим интересом к AR/VR, думаю, наличие простого инструмента для создания в частности и неигровых 3д приложений — никому не повредит. Основным рекомендуемым способом разработки под HoloLens является Unity. Да-да, большой редактор, программирование мышкой, закрытый код. Но также есть и шаблон проекта на чистом DirectX11 C++ (или C# через SharpDX), который, собственно показывает каким образом можно адаптировать любой движок (даже OpenGL only + ANGLE). Процесс довольно непростой, если будет интерес — могу подробно описать через какие грабли мне пришлось пройти.
Для начала несколько демонстраций того, что уже написано с использованием этого простенького инструмента. Все примеры находятся в открытом доступе (как и сам движок) на GitHub [1] с MIT лицензией.
А вот еще вариация этого примера, которая показывает реальное относительное расстояние между Луной и Землей:
Теперь немного подробнее о том, как же создать первую голограммку. Нам понадобятся:
Создаем новый проект. Лучше всего это сделать при помощи подготовленного шаблона [6]. Либо можно создать из шаблона “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 [7]. В качестве Entity выступает Node. Из иерархии узлов и состоит сцена. Каждый узел может иметь коллекцию компонентов, отвечающих за физику, анимации, отображение моделек и т.п. Но также в него вынесены Position, Scale и Rotation. В нашем сниппете за базовую подготовку сцены отвечает base.Start(), который и создаст сцену (корневой Node), настроит камеры для глаз, освещение и тому подобное. Вам лишь остается дальше развивать подготовленную сцену. При желании, сцену можно описать в Shared Projects или PCL и сделать ее доступной сразу ко всему ряду поддерживаемых платформ:
Рассмотрим некоторые HoloLens специфичные возможности. И хотя никто не запрещает использовать все системные API напрямую, основные вещи вынесены для удобства в базовый класс.
Ну тут всё просто как грабли, один асинхронный метод базового класса:
await TextToSpeech("Hello World");
К сожалению, самим устройством поддерживается только английский язык.
Нужно не забыть добавить «Микрофон» как Device Capability в манифесте и использовать это простое API для регистрации команд:
RegisterCortanaCommands(new Dictionary<string, Action>
{
{"idle", () => PlayAnimation(IdleAni)},
{"die", () => PlayAnimation(KillAni)},
{"look at me", LookAtMe },
{"help", Help }
});
Т.е. просто словарик из «команда» — действие.
Для этого необходимо сперва его запустить через
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, то по нормали можно понять является ли это горизонтальной или вертикальной плоскостью. Пример с урной выше разрешает пользователю ставить урну только на горизонтальных плоскостях по этому принципу (код [8]).
Движок не является конкурентом известным монстрам, но если интерес к неигровому 3д из-за VR/AR растет, то чем больше выбор инструментов (особенно простых и открытых) — тем лучше, не правда ли? По самому движку так же можно найти несколько интересных статей на Хабре [9].
Автор: Nagg
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/204666
Ссылки в тексте:
[1] GitHub: https://github.com/xamarin/urho-samples/tree/master/HoloLens
[2] такой: https://github.com/xamarin/urho-samples/blob/master/HoloLens/02_HelloWorldAdvanced/Data/Shaders/HLSL/CustomLitSolid.hlsl
[3] Bullet: http://bulletphysics.org/wordpress/
[4] Recast & Detour: https://github.com/recastnavigation/recastnavigation
[5] HoloLens Emulator: https://developer.microsoft.com/en-us/windows/holographic/install_the_tools
[6] шаблона: https://visualstudiogallery.msdn.microsoft.com/8c04e1cc-63fa-49d5-9172-1a57f1a1ec6d
[7] Entity component system: https://en.wikipedia.org/wiki/Entity_component_system
[8] код: https://github.com/xamarin/urho-samples/blob/master/HoloLens/05_Physics/Progam.cs#L91-L92
[9] Хабре: https://habrahabr.ru/search/?q=urho3d
[10] Источник: https://habrahabr.ru/post/314010/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.