пространственное сопоставление

Пространственное сопоставление обеспечивает подробное представление реальных поверхностей в среде вокруг HoloLens, позволяя разработчикам создавать убедительные возможности смешанной реальности. Объединяя реальный мир с виртуальным, приложение может сделать голограммы реальными. Приложения также могут более естественно соответствовать ожиданиям пользователей, предоставляя привычные реальные поведения и взаимодействия.


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

Компонент HoloLens (1-го поколения) HoloLens 2 Иммерсивные гарнитуры
пространственное сопоставление ✔️ ✔️

Почему пространственное сопоставление важно?

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

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

Общие сведения

Поверхности сетки, покрывающие комнату
Пример сетки пространственного сопоставления, охватывающей комнату

Для пространственного сопоставления используются два основных типа объектов: Spatial Surface Observer и Spatial Surface.

Приложение предоставляет Spatial Surface Observer с одним или несколькими ограничивающими томами, чтобы определить области пространства, в которых приложение хочет получать данные пространственного сопоставления. Для каждого из этих томов пространственное сопоставление предоставит приложению набор пространственных поверхностей.

Эти тома могут быть стационарными (в фиксированном расположении на основе реального мира) или присоединены к HoloLens (они перемещаются, но не вращаются с HoloLens при перемещении по среде). Каждая пространственная поверхность описывает реальные поверхности в небольшом объеме пространства, представленные в виде сетки треугольника, прикрепленной к мировой системе пространственных координат.

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

Демонстрация концепций проектирования пространственной осведомленности

Если вы хотите ознакомиться с основными понятиями проектирования пространственной осведомленности в действии, проверка ниже из видео о проектировании голограмм — пространственной осведомленности. По завершении продолжите изучать другие темы.

Это видео было записано из приложения Designing Holograms для HoloLens 2. Скачайте его и насладитесь всеми его возможностями здесь.

Пространственное сопоставление и распознавание сцены WorldMesh

Для HoloLens 2 можно запросить статическую версию данных пространственного сопоставления с помощью пакета SDK для распознавания сцены (параметр EnableWorldMesh). Ниже приведены различия между двумя способами доступа к данным пространственного сопоставления.

  • API пространственного сопоставления:
    • Ограниченный диапазон: данные пространственного сопоставления, доступные приложениям в ограниченном размере, кэшируются вокруг пользователя.
    • Обеспечивает обновления измененных областей сетки с помощью событий SurfacesChanged с низкой задержкой.
    • Переменный уровень сведений, контролируемый параметром "Треугольники на кубический метр".
  • Пакет SDK для распознавания сцен:
    • Неограниченный диапазон — предоставляет все отсканированные данные пространственного сопоставления в радиусе запроса.
    • Предоставляет статическую snapshot данных пространственного сопоставления. Для получения обновленных данных пространственного сопоставления требуется выполнить новый запрос для всей сетки.
    • Согласованный уровень сведений, контролируемый параметром RequestedMeshLevelOfDetail.

Что влияет на качество пространственного сопоставления?

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

Основные сценарии использования

Иллюстрации распространенных сценариев использования пространственного сопоставления: размещение, окклюзии, физика и навигация

Размещение

Пространственное сопоставление предоставляет приложениям возможность предоставлять пользователю естественные и привычные формы взаимодействия. Что может быть более привычным и естественным, чем поставить телефон на столе?

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

Важное предостережение заключается в том, что, когда приложение определяет расстояние от направления (например, путем выполнения луча вдоль направления взгляда пользователя для поиска ближайшей пространственной поверхности), это должно дать результаты, которые пользователь может надежно предсказать. В противном случае пользователь потеряет чувство контроля, и это может быстро разочаровывание. Один из способов, который помогает в этом заключается в том, чтобы выполнять несколько лучей, а не только один. Агрегированные результаты должны быть более гладкими и более предсказуемыми, менее восприимчивыми к влиянию временных результатов "выброса" (что может быть вызвано лучами, проходящими через крошечные отверстия или попаданием небольших битов геометрии, о которых пользователь не знает). Агрегирование или сглаживание также могут выполняться с течением времени; например, можно ограничить максимальную скорость, с которой голограмма может отличаться по расстоянию от пользователя. Простое ограничение минимального и максимального значений расстояния также может помочь, чтобы перемещаемая голограмма не внезапно улетела на расстояние или не врезалась обратно в лицо пользователя.

Приложения также могут использовать форму и направление поверхностей для управления размещением голограмм. Голографический стул не должен проникать через стены и должен сидеть в промыве с полом, даже если он слегка неравномерный. Такой вид функциональности, скорее всего, будет зависеть от использования физических столкновений, а не лучей, однако аналогичные проблемы будут применяться. Если голограмма, размещаемая, имеет много небольших многоугольников, которые торчат, как ноги на стуле, может иметь смысл расширить физическое представление этих многоугольников на что-то более широкое и гладкое, чтобы они могли больше скользить по пространственным поверхностям без зависания.

В крайнем случае ввод данных пользователем можно полностью упростить, а пространственные поверхности можно использовать для полностью автоматического размещения голограмм. Например, приложение может разместить голографический переключатель света где-нибудь на стене, чтобы пользователь мог нажать. То же самое предостережение о предсказуемости применяется здесь вдвойне; Если пользователь ожидает контроля над размещением голограмм, но приложение не всегда размещает голограммы там, где он ожидает (если переключатель света отображается где-то, к чему пользователь не может получить доступ), это будет разочарование. На самом деле может быть хуже сделать автоматическое размещение, которое требует исправления пользователя некоторое время, чем просто требовать от пользователя всегда делать размещение самостоятельно; Так как ожидается успешное автоматическое размещение, ручное исправление кажется бременем!

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

Визуальная обратная связь с пользователем имеет первостепенное значение при размещении. Пользователь должен знать, где голограмма основана на ближайшей поверхности с эффектами заземления. Они должны понимать, почему движение голограммы ограничивается (например, из-за столкновений с другой соседней поверхностью). Если они не могут разместить голограмму в текущем расположении, визуальные отзывы должны понять, почему нет. Например, если пользователь пытается разместить голографический диван, застрявший на полпути в стене, то части дивана, которые находятся за стеной, должны пульсировать в сердитом цвете. Или, наоборот, если приложению не удается найти пространственную поверхность в месте, где пользователь может видеть реальную поверхность, приложение должно сделать это ясно. Очевидное отсутствие заземляющего эффекта в этой области может достичь этой цели.

Загораживание

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

Occlusion также предоставляет сведения пользователю; Когда голограмма, кажется, закреплена реальной поверхностью, это обеспечивает дополнительную визуальную обратную связь о пространственном расположении этой голограммы в мире. И наоборот, окклюзии также могут с пользой скрыть информацию от пользователя; Скрытие голограмм за стенами может интуитивным образом уменьшить визуальный беспорядок. Чтобы скрыть или отобразить голограмму, пользователю нужно просто переместить голову.

Окклюзию также можно использовать для реализации естественного пользовательского интерфейса на основе знакомых физических взаимодействий; Если голограмма связана с поверхностью, это связано с тем, что она сплошная, поэтому пользователь должен ожидать, что голограмма столкнется с этой поверхностью и не пройдет через нее.

Иногда окклюзию голограмм нежелательно. Если пользователю нужно взаимодействовать с голограммой, он должен видеть ее, даже если она находится за реальной поверхностью. В таких случаях обычно имеет смысл отрисовывать такую голограмму по-другому, когда она заключит (например, путем уменьшения ее яркости). Таким образом, пользователь может визуально найти голограмму, но он по-прежнему будет знать, что она находится за чем-то.

Физика

Использование физического моделирования — это еще один способ, с помощью которого пространственное сопоставление можно использовать для усиления присутствия голограмм в физическом пространстве пользователя. Когда мой голографический резиновый шар катится реально с моего стола, отскакивает через пол и исчезает под диваном, это может быть трудно для меня поверить, что это не там.

Физическое моделирование также позволяет приложению использовать естественные и знакомые физические взаимодействия. Перемещение голографической мебели вокруг на полу, скорее всего, будет легче для пользователя, если мебель реагирует, как если бы она скользила по полу с соответствующей инерцией и трением.

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

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

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

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

Ключевыми техническими проблемами, связанными с реализацией навигационных функций, будут надежное обнаружение проходимых поверхностей (люди не ходят по столам!) и изящная адаптация к изменениям в окружающей среде (люди не проходят через закрытые двери!). Сетка может потребовать некоторой обработки , прежде чем она будет пригодна для планирования пути и навигации виртуальным символом. Сглаживание сетки и удаление галлюцинаций может помочь избежать зависания символов. Вы также можете значительно упростить сетку, чтобы ускорить планирование пути и навигацию вашего персонажа. Эти проблемы получили большое внимание в разработке технологии видеоигр, и есть множество доступной научно-исследовательской литературы по этим темам.

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

Визуализация

В большинстве случаев пространственные поверхности должны быть невидимыми; чтобы свести к минимуму визуальный беспорядок и позволить реальному миру говорить само за себя. Однако иногда полезно визуализировать поверхности пространственного сопоставления напрямую, несмотря на то, что их реальные аналоги видны.

Например, когда пользователь пытается разместить голограмму на поверхности (например, поместив голографический шкаф на стену), может быть полезно "заземлить" голограмму, отбросав тень на поверхность. Это дает пользователю гораздо более четкое представление о точной физической близости между голограммой и поверхностью. Это также пример более общей практики визуального "предварительного просмотра" изменения до того, как пользователь зафиксирует его.

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

Визуализация поверхностей может быть полезным способом показать пользователю близлежащие пространства, скрытые от просмотра. Это может предоставить пользователю доступ к кухне (и всем содержащимся в ней голограммам) из гостиной.

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

Примечание

HoloLens 2 реализует новую среду выполнения осмысления сцены, которая предоставляет разработчикам Смешанная реальность структурированное высокоуровневое представление среды, предназначенное для упрощения реализации размещения, окклюзии, физики и навигации.

Использование Surface Observer

Отправной точкой для пространственного сопоставления является поверхностный наблюдатель. Поток программы выглядит следующим образом:

  • Создание объекта surface observer
    • Укажите один или несколько пространственных томов, чтобы определить интересующие области, в которых приложение хочет получать данные пространственного сопоставления. Пространственный том — это просто фигура, определяющая область пространства, например шар или прямоугольник.
    • Используйте пространственный том с системой пространственных координат, заблокированной миром, чтобы определить фиксированную область физического мира.
    • Используйте пространственный том, обновленный для каждого кадра с помощью системы пространственных координат, заблокированной телом, чтобы определить область пространства, которая перемещается (но не вращается) с пользователем.
    • Эти пространственные тома могут быть изменены позже в любое время по мере изменения состояния приложения или пользователя.
  • Использование опроса или уведомления для получения сведений о пространственных поверхностях
    • Вы можете "опрашить" наблюдателя поверхности на наличие пространственного состояния поверхности в любое время. Вместо этого можно зарегистрировать событие surface observer "surfaces changed", которое будет уведомлять приложение об изменении пространственных поверхностей.
    • Для динамического пространственного тома, например представления frustum, или тома, заблокированного телом, приложениям потребуется опросить изменения каждого кадра, задав интересующую область, а затем получив текущий набор пространственных поверхностей.
    • Для статического тома, такого как заблокированный миром куб, охватывающий одну комнату, приложения могут регистрировать событие "поверхности изменены", чтобы получать уведомления о томе, когда пространственные поверхности внутри этого тома могли измениться.
  • Изменения поверхностей процесса
    • Итерации предоставленного набора пространственных поверхностей.
    • Классифицируйте пространственные поверхности как добавленные, измененные или удаленные.
    • Для каждой добавленной или измененной пространственной поверхности при необходимости отправьте асинхронный запрос на получение обновленной сетки, представляющей текущее состояние поверхности на требуемом уровне детализации.
  • Обработайте запрос асинхронной сетки (дополнительные сведения см. в следующих разделах).

Кэширование сетки

Пространственные поверхности представлены плотными сетками треугольников. Хранение, отрисовка и обработка этих сеток могут потреблять значительные вычислительные ресурсы и ресурсы хранилища. Таким образом, каждое приложение должно применять схему кэширования сетки, соответствующую его потребностям, чтобы свести к минимуму ресурсы, используемые для обработки и хранения сетки. Эта схема должна определять, какие сетки следует сохранять, а какие удалять, а также когда обновлять сетку для каждой пространственной поверхности.

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

При интерпретации события surfaces changed, предоставленного surface observer, базовая логика кэширования сетки выглядит следующим образом:

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

Затем каждое приложение может сделать следующее:

  • Следует ли запрашивать сетку для новых пространственных поверхностей?
    • Как правило, сетку следует запрашивать немедленно для новых пространственных поверхностей, которые могут предоставить пользователю полезные новые сведения.
    • Однако новые пространственные поверхности рядом с пользователем и перед ним должны иметь приоритет, а их сетка должна быть запрошена в первую очередь.
    • Если новая сетка не требуется, например, приложение навсегда или временно "заморозило" свою модель среды, запрашивать ее не следует.
  • Следует ли запрашивать сетку для обновленных пространственных поверхностей?
    • Обновленные пространственные поверхности рядом с пользователем и перед ним должны иметь приоритет, а их сетка должна быть запрошена в первую очередь.
    • Кроме того, может быть целесообразно уделять более высокий приоритет новым поверхностям, чем обновленным поверхностям, особенно во время сканирования.
    • Чтобы ограничить затраты на обработку, приложения могут захотеть регулировать скорость обработки обновлений пространственных поверхностей.
    • Можно сделать вывод, что изменения в пространственной поверхности являются незначительными, например, если границы поверхности малы, в этом случае обновление может быть недостаточно важным для обработки.
    • Обновления пространственных поверхностей за пределами текущей интересующей пользователя области можно полностью игнорировать, хотя в этом случае может быть эффективнее изменить пространственные ограничивающие объемы, используемые наблюдателем поверхности.
  • Следует ли удалить сетку для удаленных пространственных поверхностей?
    • Как правило, сетку следует немедленно отбрасывать для удаленных пространственных поверхностей, чтобы голограмма оставалась правильной.
    • Однако если у приложения есть основания полагать, что пространственная поверхность появится в ближайшее время (на основе структуры пользовательского интерфейса), то может быть эффективнее сохранить ее, чем удалить сетку и повторно создать ее позже.
    • Если приложение создает крупномасштабную модель среды пользователя, оно может вообще не удалять сетки. Однако по-прежнему потребуется ограничить использование ресурсов, возможно, путем создания сеток на диск по мере исчезновения пространственных поверхностей.
    • Некоторые относительно редкие события во время создания пространственной поверхности могут привести к замене пространственных поверхностей новыми пространственными поверхностями в аналогичном расположении, но с разными идентификаторами. Таким образом, приложения, которые решили не удалять удаленную поверхность, должны позаботиться о том, чтобы не получить несколько сильно перекрывающихся пространственных поверхностей сетки, охватывающие одно и то же расположение.
  • Следует ли удалять сетку для других пространственных поверхностей?
    • Даже при наличии пространственной поверхности, если она больше не полезна для взаимодействия пользователя, ее следует удалить. Например, если приложение "заменяет" комнату на другой стороне дверного проема альтернативным виртуальным пространством, то пространственные поверхности в этой комнате больше не имеют значения.

Ниже приведен пример стратегии кэширования сетки с использованием пространственного и темпорального гистереиса:

  • Рассмотрим приложение, которое хочет использовать пространственный объем в форме frustum, который следует за взглядом пользователя, когда он оглядывается и ходит вокруг.
  • Пространственная поверхность может временно исчезнуть из этого тома просто потому, что пользователь смотрит в сторону от поверхности или на шаг дальше от нее... только для того, чтобы оглянуться назад или снова приблизиться на мгновение позже. В этом случае удаление и повторное создание сетки для этой поверхности представляет собой множество избыточных процессов.
  • Чтобы уменьшить количество обработанных изменений, приложение использует два наблюдателя пространственной поверхности, один из которых содержится в другом. Больший объем сферический и следует за пользователем "лениво"; он перемещается только при необходимости, чтобы обеспечить, чтобы центр был в пределах 2,0 метра от пользователя.
  • Новые и обновленные пространственные поверхностные сетки всегда обрабатываются от меньшего внутреннего наблюдателя поверхности, но сетки кэшируются до тех пор, пока они не исчезнут из более крупного внешнего наблюдателя поверхности. Это позволяет приложению избежать обработки большого количества избыточных изменений из-за перемещения локального пользователя.
  • Так как пространственная поверхность может временно исчезнуть из-за отслеживания потерь, приложение также откладывает удаление удаленных пространственных поверхностей во время отслеживания потери.
  • Как правило, приложение должно оценить компромисс между сокращением обработки обновлений и увеличением использования памяти, чтобы определить свою идеальную стратегию кэширования.

Отрисовка

Существует три основных способа, с помощью которых сетки пространственного сопоставления, как правило, используются для отрисовки:

  • Для визуализации поверхности
    • Часто полезно визуализировать пространственные поверхности напрямую. Например, приведение "теней" от объектов к пространственным поверхностям может предоставить пользователю полезную визуальную обратную связь при размещении голограмм на поверхностях.
    • Следует иметь в виду, что пространственные сетки отличаются от типа сеток, которые может создать 3D-художник. Топология треугольника не будет так "чистой", как созданная человеком топология, и сетка будет страдать от различных ошибок.
    • Чтобы создать приятный визуальный эстетики, вы можете выполнить некоторую обработку сетки, например для заполнения отверстий или гладких норм поверхности. Вы также можете использовать шейдер для проецирования текстур, разработанных художником, на сетку вместо того, чтобы напрямую визуализировать топологию и нормы сетки.
  • Для исключения голограмм за реальными поверхностями
    • Пространственные поверхности можно визуализировать только в глубине, что влияет только на буфер глубины и не влияет на целевые объекты отрисовки цвета.
    • Это загружает буфер глубины для последующей отрисовки голограмм за пространственными поверхностями. Точное перекрытие голограмм усиливает ощущение того, что голограммы действительно существуют в физическом пространстве пользователя.
    • Чтобы включить отрисовку только для глубины, обновите состояние смешения, чтобы задать для RenderTargetWriteMask значение 0 для всех целевых объектов отрисовки цвета.
  • Для изменения внешнего вида голограмм, заключаемых реальными поверхностями
    • Обычно отображаемая геометрия скрыта при ее окклюдении. Это достигается путем установки функции глубины в состоянии трафарета глубины в значение "меньше или равно", что приводит к тому, что геометрия будет видна только там, где она ближе к камере, чем все ранее отрисованные геометрии.
    • Однако может быть полезно сохранить определенную геометрию видимой, даже если она была окклюдирована, и изменить ее внешний вид при occluded в качестве способа предоставления визуальной обратной связи пользователю. Например, это позволяет приложению показать пользователю расположение объекта, прояснив при этом, что находится за реальной поверхностью.
    • Для этого отрисуйте геометрию во второй раз с помощью другого шейдера, который создает требуемый внешний вид occluded. Перед отрисовкой геометрии во второй раз внесите два изменения в состояние трафарета глубины. Сначала задайте для функции depth значение "больше или равно", чтобы геометрия была видна только там, где она находится дальше от камеры, чем все ранее отрисованные геометрические объекты. Во-вторых, задайте для параметра DepthWriteMask значение 0, чтобы буфер глубины не изменялся (буфер глубины должен по-прежнему представлять глубину геометрии , ближайшей к камере).

Производительность является важной проблемой при отрисовке сеток пространственного сопоставления. Ниже приведены некоторые методы повышения производительности отрисовки, относящиеся к сеткам пространственного сопоставления.

  • Настройка плотности треугольника
    • При запросе пространственных сеток поверхности от наблюдателя поверхности запрашивайте наименьшую плотность сеток треугольника, которая будет достаточно для ваших потребностей.
    • Возможно, имеет смысл изменять плотность треугольников на поверхности по поверхности в зависимости от расстояния поверхности от пользователя и ее релевантности для взаимодействия с пользователем.
    • Уменьшение количества треугольников приведет к сокращению использования памяти и затрат на обработку вершин на GPU, хотя это не повлияет на затраты на обработку пикселей.
  • Использование отбраковки frustum
    • Выбраковка Frustum пропускает объекты рисования, которые не могут быть видны, так как они находятся за пределами текущей области отображения. Это сокращает затраты на обработку ЦП и GPU.
    • Так как отбраковка выполняется на основе сетки, а пространственные поверхности могут быть большими, разбиение каждой сетки пространственной поверхности на более мелкие блоки может привести к более эффективной отбраковке (в этом случае отрисовывается меньше треугольников вне экрана). Однако есть компромисс; Чем больше сеток, тем больше вызовов draw необходимо выполнить, что может увеличить затраты на ЦП. В крайнем случае сами вычисления отбраковки frustum могут даже иметь измеримую стоимость ЦП.
  • Настройка порядка отрисовки
    • Пространственные поверхности, как правило, большие, так как они представляют всю окружающую среду пользователя. Затраты на обработку пикселей на GPU могут быть высокими, особенно в случаях, когда имеется более одного слоя видимой геометрии (включая как пространственные поверхности, так и другие голограммы). В этом случае ближайший к пользователю слой будет отключать все более удаленные слои, поэтому любое время GPU, затрачиваемое на отрисовку этих более удаленных слоев, будет потрачено впустую.
    • Чтобы сократить эту избыточную работу на GPU, она помогает визуализировать непрозрачные поверхности в порядке передней части к спине (первые более близкие, более удаленные — последние). Под "непрозрачным" мы имеем в виду поверхности, для которых DepthWriteMask имеет значение в состоянии глубины трафарета. Когда ближайшие поверхности отрисовываются, они будут загругнут буфер глубины, чтобы более удаленные поверхности эффективно пропускались процессором пикселей на GPU.

Обработка сетки

Приложению может потребоваться выполнять различные операции с пространственными сетками поверхности в соответствии со своими потребностями. Данные индекса и вершин, предоставляемые каждой сеткой пространственной поверхности, используют тот же привычный макет, что и буферы вершин и индексов , которые используются для отрисовки сеток треугольника во всех современных API отрисовки. Однако один из ключевых фактов, о которых следует помнить, заключается в том, что треугольники пространственного сопоставления имеют порядок обмотки спереди по часовой стрелке. Каждый треугольник представлен тремя индексами вершин в буфере индекса сетки, и эти индексы будут определять вершины треугольника в порядке часовой стрелки при просмотре треугольника с передней стороны. Передняя сторона (или внешняя) сеток пространственной поверхности соответствует ожидаемой передней (видимой) стороне реальных поверхностей.

Приложения должны выполнять упрощение сетки только в том случае, если плотность грубого треугольника, предоставляемая поверхностным наблюдателем, по-прежнему недостаточно груба. Эта работа является ресурсоемкой и уже выполняется средой выполнения для создания различных предоставленных уровней детализации.

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

Рэйкастик и столкновение

Чтобы API физики (например , Havok) предоставлял приложению функции лучевого вещания и столкновений для пространственных поверхностей, приложение должно предоставлять пространственные сетки поверхностей для API физики. Сетки, используемые для физики, часто имеют следующие свойства:

  • Они содержат только небольшое количество треугольников. Физические операции более ресурсоемкие, чем операции отрисовки.
  • Они "водонепроницаемые". Поверхности, предназначенные для того чтобы быть твердыми, не должны иметь небольших отверстий в них; даже слишком маленькие отверстия, чтобы быть видимыми, могут вызвать проблемы.
  • Они преобразуются в выпуклые оболочки. Выпуклые корпуса имеют мало многоугольников и свободны от отверстий, и они гораздо эффективнее вычислений, чем необработанные сетки треугольников.

Делая лучи против пространственных поверхностей, имейте в виду, что эти поверхности часто сложные, загроможденных форм, полных грязных маленьких деталей - так же, как ваш стол! Это означает, что одного луча часто недостаточно, чтобы дать вам достаточно информации о форме поверхности и форме пустого пространства рядом с ней. Обычно рекомендуется делать много лучей в пределах небольшой области и использовать агрегированные результаты для получения более надежного понимания поверхности. Например, использование среднего значения 10 лучей для направления размещения голограммы на поверхности даст гораздо более гладкий и менее "дрожный" результат, чем при использовании одного луча.

Однако имейте в виду, что каждый raycast может иметь высокие вычислительные затраты. В зависимости от сценария использования следует учитывать вычислительные затраты на дополнительные лучи (выполненные каждый кадр) и вычислительные затраты на обработку сетки для сглаживания и удаления отверстий в пространственных поверхностях (при обновлении пространственных сеток).

Проверка среды

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

Пример сканирования
Пример сканирования

Характер такого сканирования может сильно отличаться в зависимости от потребностей каждого приложения, но его проектирование должно руководствоваться двумя принципами main.

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

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

Чтобы спроектировать правильный интерфейс сканирования, рассмотрите, какие из следующих возможностей применимы к вашему приложению:

  • Нет возможностей сканирования

    • Приложение может прекрасно работать без интерактивного сканирования; он узнает о поверхностях, которые наблюдаются в ходе естественного перемещения пользователя.
    • Например, приложение, которое позволяет пользователю рисовать на поверхностях с голографической краской распыления, требует знания только о поверхностях, видимых в настоящее время пользователю.
    • Среда уже может быть проверена, если в ней пользователь уже провел много времени с помощью HoloLens.
    • Однако имейте в виду, что камера, используемая для пространственного сопоставления, может видеть только 3,1 м перед пользователем, поэтому пространственное сопоставление не будет знать о более удаленных поверхностях, если пользователь не наблюдал их с более близкого расстояния в прошлом.
    • Таким образом, пользователь понимает, какие поверхности были проверены, приложение должно предоставлять визуальную обратную связь по этому эффекту, например, отбрасывания виртуальных теней на отсканированные поверхности может помочь пользователю разместить голограммы на этих поверхностях.
    • В этом случае ограничивающие тома наблюдателя пространственной поверхности должны быть обновлены для каждого кадра до системы пространственных координат, заблокированной телом, чтобы они следовали за пользователем.
  • Поиск подходящего расположения

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

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

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

    • Приложению может потребоваться сканирование всех поверхностей в текущей комнате, включая поверхности позади пользователя.
    • Например, игра может поставить пользователя в роль Гулливера, в осаде от сотен крошечных лилипутов, приближающихся со всех сторон.
    • В таких случаях приложению потребуется определить, сколько поверхностей в текущей комнате уже отсканировано, и направить взгляд пользователя на заполнение значительных пробелов.
    • Ключом к этому процессу является предоставление визуальной обратной связи, которая позволяет понять пользователю, какие поверхности еще не были проверены. Например, приложение может использовать туман на основе расстояния для визуального выделения областей, которые не охвачены поверхностями пространственного сопоставления.
  • Начальное snapshot среды

    • Приложение может захотеть игнорировать все изменения в среде после первоначального snapshot.
    • Это может быть целесообразно, чтобы избежать нарушения работы созданных пользователем данных, тесно связанных с начальным состоянием среды.
    • В этом случае приложение должно создать копию данных пространственного сопоставления в исходном состоянии после завершения сканирования.
    • Приложения должны продолжать получать обновления данных пространственного сопоставления, если голограммы по-прежнему должны быть правильно включены в среду.
    • Постоянные обновления данных пространственного сопоставления также позволяют визуализировать все произошедшие изменения, уточняя пользователю различия между предыдущим и нынешним состояниями среды.
  • Создание моментальных снимков среды, инициированных пользователем

    • Приложение может захотеть реагировать на изменения среды только по указанию пользователя.
    • Например, пользователь может создать несколько трехмерных "статуй" друга, захватывая его позы в разные моменты.
  • Разрешить пользователю изменять среду

    • Приложение может быть разработано для реагирования в режиме реального времени на любые изменения, внесенные в среде пользователя.
    • Например, пользователь, рисующий занавес, может вызвать "изменение сцены" для голографической игры, происходящей на другой стороне.
  • Руководство пользователя, чтобы избежать ошибок в данных пространственного сопоставления

    • Приложение может захотеть предоставить рекомендации пользователю во время сканирования своей среды.
    • Это может помочь пользователю избежать определенных ошибок в данных пространственного сопоставления, например, держаться подальше от освещенных солнцем окон или зеркал.

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

Обработка сетки

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

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

Ниже приведены некоторые примеры различных типов обработки сетки, которые могут оказаться полезными:

  • Заполнение отверстия

    • Если небольшой объект, сделанный из темного материала, не сможет сканировать, он оставит отверстие на окружающей поверхности.
    • Отверстия влияют на окклюзию: голограммы можно увидеть "через" отверстие в якобы непрозрачной реальной поверхности.
    • Отверстия влияют на лучи: если вы используете лучи, чтобы помочь пользователям взаимодействовать с поверхностями, эти лучи могут быть нежелательными для прохождения отверстий. Одним из способов устранения рисков является использование пакета из нескольких лучей, охватывающих регион соответствующего размера. Это позволит отфильтровать результаты "выброса", чтобы даже если один луч проходит через небольшое отверстие, агрегированный результат по-прежнему будет действительным. Однако этот подход стоит за счет вычислительных затрат.
    • Отверстия влияют на физические столкновения: объект, контролируемый физическим моделированием, может упасть через отверстие в полу и потеряться.
    • Такие отверстия в поверхностной сетке можно алгоритмически заполнить. Однако вам потребуется настроить алгоритм так, чтобы не заполнялись "реальные отверстия", такие как окна и дверные проемы. Может быть трудно надежно отличить "реальные дыры" от "мнимых отверстий", поэтому вам придется поэкспериментировать с различными эвристиками, такими как "размер" и "граница формы".
  • Удаление галлюцинации

    • Отражения, яркие огни и движущиеся объекты могут оставить небольшие затяжные галлюцинации, плавающие в воздухе.
    • Галлюцинации влияют на окклюзию: галлюцинации могут быть видны как темные фигуры, движущиеся перед другими голограммами.
    • Галлюцинации влияют на лучи: если вы используете лучи, чтобы помочь пользователям взаимодействовать с поверхностями, эти лучи могут попасть в галлюцинацию, а не на поверхность позади нее. Как и в случае с отверстиями, одной из мер по устранению рисков является использование нескольких лучей вместо одного луча, но опять же это будет стоить вычислений.
    • Галлюцинации влияют на физические столкновения: объект, контролируемый физической имитацией, может застрять против галлюцинации и быть не в состоянии перемещаться через, казалось бы, четкую область пространства.
    • Такие галлюцинации можно фильтровать из поверхностной сетки. Однако, как и в случае с отверстиями, вам нужно настроить алгоритм, чтобы реальные небольшие объекты, такие как лампы и дверные ручки, не были удалены.
  • Сглаживание

    • Пространственное сопоставление может возвращать поверхности, которые кажутся грубыми или "шумными" по сравнению с их реальными аналогами.
    • Гладкость влияет на физические столкновения: если пол грубый, физически смоделированный мяч для гольфа не может плавно катиться по нему по прямой линии.
    • Гладкость влияет на отрисовку: если поверхность визуализирована напрямую, шероховатые нормы поверхности могут повлиять на ее внешний вид и нарушить "чистый" вид. Это можно устранить, используя соответствующее освещение и текстуры в шейдере, который используется для отрисовки поверхности.
    • Можно сгладить шероховатость в поверхностной сетке. Однако это может оттолкнуть поверхность дальше от соответствующей реальной поверхности. Поддержание тесного соответствия важно для создания точной окклюзии голограммы и для того, чтобы пользователи могли достичь точного и предсказуемого взаимодействия с голографическими поверхностями.
    • Если требуется только косметическое изменение, этого может быть достаточно, чтобы сгладить нормали вершин без изменения положения вершин.
  • Поиск плоскости

    • Существует множество форм анализа, которые приложение может захотеть выполнить на поверхностях, предоставляемых пространственным сопоставлением.
    • Одним из простых примеров является "обнаружение плоскости"; определение ограниченных, в основном плоских областей поверхностей.
    • Планарные области можно использовать в качестве голографических рабочих поверхностей, областей, в которых голографическое содержимое может автоматически размещаться приложением.
    • Планарные регионы могут ограничивать пользовательский интерфейс, чтобы помочь пользователям взаимодействовать с поверхностями, которые лучше всего соответствуют их потребностям.
    • Планарные области можно использовать как в реальном мире для голографических аналогов функциональных объектов, таких как ЖК-экраны, таблицы или доски.
    • Планарные регионы могут определять игровые зоны, формируя основу уровней видеоигр.
    • Планарные регионы могут помочь виртуальным агентам ориентироваться в реальном мире, определяя области пола, по которым реальные люди, скорее всего, будут ходить.

Создание прототипов и отладка

Полезные инструменты

  • Эмулятор HoloLens можно использовать для разработки приложений с использованием пространственного сопоставления без доступа к физическому HoloLens. Это позволяет имитировать динамический сеанс на HoloLens в реалистичной среде со всеми данными, которые обычно использует приложение, включая движение HoloLens, системы пространственных координат и сетки пространственного сопоставления. Это можно использовать для предоставления надежных и повторяемых входных данных, которые могут быть полезны для отладки проблем и оценки изменений в коде.
  • Чтобы воспроизвести сценарий, запишите данные пространственного сопоставления по сети из динамического HoloLens, а затем сохраните их на диск и повторно используйте в последующих сеансах отладки.
  • Трехмерное представление портала устройств Windows позволяет просматривать все пространственные поверхности, доступные в настоящее время через систему пространственного сопоставления. Это обеспечивает основу для сравнения пространственных поверхностей в приложении; например, можно легко определить, отсутствуют ли какие-либо пространственные поверхности или отображаются ли они в неправильном месте.

Общие рекомендации по прототипам

  • Так как ошибки в данных пространственного сопоставления могут сильно повлиять на работу пользователя, рекомендуется протестировать приложение в самых разных средах.
  • Не попадайте в ловушку привычки всегда тестировать в одном и том же месте, например на вашем столе. Обязательно протестируйте на различных поверхностях разных позиций, форм, размеров и материалов.
  • Аналогичным образом, хотя искусственные или записанные данные могут быть полезны для отладки, не будьте слишком зависимы от тех же нескольких тестовых случаев. Это может задержать поиск важных проблем, которые более разнообразные тесты были бы пойманы ранее.
  • Рекомендуется выполнять тестирование с реальными (и в идеале незащищенными) пользователями, так как они могут не использовать HoloLens или ваше приложение точно так же, как вы. На самом деле, это может удивить вас, насколько разное поведение людей, знания и предположения могут быть!

Устранение неполадок

  • Чтобы сетки поверхности правильно ориентировались, каждый объект GameObject должен быть активным перед отправкой на SurfaceObserver для создания сетки. В противном случае сетки будут отображаться в вашем пространстве, но вращаются под странными углами.
  • GameObject, запускающий скрипт, который взаимодействует с SurfaceObserver, должен быть задан в качестве источника. В противном случае все объекты GameObject, создаваемые и отправляемые в SurfaceObserver для создания сеток, будут иметь смещение, равное смещению родительского объекта игры. Это может сделать сетки отображаться в нескольких метрах, что затрудняет отладку происходящего.

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