Системы координат в Unity

Windows Mixed Reality поддерживает приложения в различных масштабах, начиная с приложений с ориентацией на страницы и до крупномасштабных приложений. на HoloLens вы можете создавать приложения для мирового уровня, которые позволяют пользователям проходить более чем за 5 метров, изучая целый этаж здания и за его пределами.

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

Создание интерфейса, поддерживающего только ориентацию, или с возможностями масштабирования

Пространство имен:UnityEngine. XR
Тип:ксрдевице

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

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Пространство имен:UnityEngine. XR
Тип:инпуттраккинг

Для чистой ориентации , такой как видео-средство просмотра 360 (если позиционированные головные обновления насмарку иллюзию), можно установить XR. Инпуттраккинг. Дисаблепоситионалтраккинг имеет значение true:

InputTracking.disablePositionalTracking = true;

Для работы с возможностями масштабирования, чтобы пользователь мог позже изменить центр исходного места, можно вызвать XR. Метод Инпуттраккинг. recenter :

InputTracking.Recenter();

Создание фиксированного масштаба или возможностей для масштабирования комнаты

Пространство имен:UnityEngine. XR
Тип:ксрдевице

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

Чтобы обеспечить работу Unity с своей мировой системой координат на уровне пола, можно установить и проверить, что Unity использует тип пространства отслеживания Румскале:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • Если Сеттраккингспацетипе возвращает значение true, Unity успешно переключил свою систему координат мира для мониторинга промежуточного кадра ссылки.
  • Если Сеттраккингспацетипе возвращает значение false, Unity не смог переключиться на промежуточный кадр ссылки, скорее всего потому, что пользователь не настроил этаж в своей среде. Хотя возвращаемое значение false не является распространенным, оно может произойти, если этап настраивается в другой комнате, и устройство перемещается в текущую комнату без настройки нового этапа пользователем.

После того как приложение успешно установит тип пространства отслеживания Румскале, на этаж будут отображаться содержимое, помещенное на плоскости y = 0. Источник 0, 0, 0 будет определять конкретное место в этаже, где пользователь стояли во время настройки комнаты, с параметром-Z, который соответствует направлению вперед во время установки.

Пространство имен:UnityEngine. ЭКСПЕРИМЕНТАЛЬно. XR
Тип:граница

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

Примечание

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

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

Создание возможностей для мирового масштабирования

Пространство имен:UnityEngine. XR. WSA
Тип:ворлданчор

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

В Unity вы создаете пространственное привязку, добавив компонент Unity ворлданчор в GameObject.

Добавление универсальной привязки

Чтобы добавить привязку к международному обзвонку, вызовите метод AddComponent < ворлданчор > () для игрового объекта с преобразованием, которое необходимо привязать в реальном мире.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

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

Удаление универсальной привязки

Если вы больше не хотите, чтобы GameObject заблокировались в физическом расположении и не планировали перемещать его, то можно просто вызвать Destroy в компоненте «Универсальная привязка».

Destroy(gameObject.GetComponent<WorldAnchor>());

Если вы хотите переместить GameObject этот кадр, необходимо вызвать Дестройиммедиате.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Перемещение привязанного GameObject по всему миру

GameObject нельзя переместить, пока на нем есть универсальная привязка. Если вам нужно переместить GameObject этот кадр, сделайте следующее:

  1. Дестройиммедиате компонент «мировая привязка»
  2. Перемещение GameObject
  3. Добавьте новый компонент универсальной привязки к GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Обработка изменений Локатабилити

Ворлданчор не может быть размещаемые в физическом мире на момент времени. В таком случае Unity не будет обновлять преобразование привязанного объекта. Это также можно изменить во время работы приложения. Сбой при обработке изменения в локатабилити приведет к тому, что объект не будет отображаться в правильном физическом расположении в мире.

Чтобы получать уведомления об изменениях локатабилити:

  1. Подпишитесь на событие Онтраккингчанжед
  2. Обработайте событие

Событие онтраккингчанжед будет вызываться при каждом изменении базовой пространственной привязки между состояниями размещаемые и not размещаемые.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Затем обработайте событие:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

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

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Совместное использование привязок на разных устройствах

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

Чтобы приступить к созданию общих интерфейсов в Unity, ознакомьтесь с пошаговыми руководствами Unity по 5-минутной пространственной привязке Azure.

После завершения работы с пространственными привязками Azure можно создавать и искать привязки в Unity.

Следующий этап разработки

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

Или перейдите к возможностям и API платформы смешанной реальности:

Вы можете в любой момент вернуться к этапам разработки для Unity.

См. также: