Поделиться через


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

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

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

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

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

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

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

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

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

InputTracking.disablePositionalTracking = true;

Для взаимодействия с масштабируемым масштабированием, чтобы разрешить пользователю позже более поздний источник места, можно вызвать XR. Метод InputTracking.Recenter:

InputTracking.Recenter();

Создание постоянного или горизонтального взаимодействия с комнатой

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

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

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

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.
}
  • Если SetTrackingSpaceType возвращает значение true, Unity успешно переключила свою систему координат мира для отслеживания эталонной рамки этапа.
  • Если SetTrackingSpaceType возвращает значение false, Unity не удалось переключиться на промежуточный кадр ссылок, скорее всего, потому что пользователь не настроил пол в своей среде. Хотя ложное возвращаемое значение не является общим, это может произойти, если этап настроен в другой комнате, и устройство перемещается в текущую комнату без настройки пользователем нового этапа.

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

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

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

Примечание.

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

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
Тип: WorldAnchor

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

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

Добавление привязки мира

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

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

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

Удаление привязки мира

Если вы больше не хотите, чтобы GameObject заблокировано в физическом месте мира и не планируете перемещать его этот кадр, то вы можете просто вызвать Destroy на компоненте World Anchor.

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

Если вы хотите переместить gameObject этот кадр, необходимо вместо этого вызвать DestroyImmediate.

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

Перемещение world Anchored GameObject

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

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

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

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

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

  1. Подписка на событие OnTrackingChanged
  2. Обработка события

Событие OnTrackingChanged будет вызываться всякий раз, когда базовые пространственные привязки изменяются между состоянием неуклюжимы и не является locatable.

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);
}

Иногда привязки находятся немедленно. В этом случае это свойство isLocated привязки будет иметь значение true при возврате AddComponent<WorldAnchor>(). В результате событие OnTrackingChanged не будет активировано. Чистый шаблон будет вызывать обработчик OnTrackingChanged с начальным состоянием IsLocated после подключения привязки.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

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

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

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

После запуска с помощью пространственных привязок Azure можно создать и найти привязки в Unity.

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

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

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

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

См. также