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


Основные сведения о SessionOrigin

SessionOrigin является относительно новой реализацией — она представлена в AR Foundation, — но сама идея появилась еще для камерных установок за десятки лет до появления подсистем визуализации. Возможно, вы уже знакомы с ней как с узлом Playspace в MRTK. Его возможности довольно широки, но, к сожалению, его использование недостаточно хорошо разъяснено для эффективного использования.

Что такое SessionOrigin?

SessionOrigin — это просто объект преобразования (Transform), к которому присоединена камера. Говоря простыми словами, он позволяет размещать камеру в виртуальной сцене. Если выразить его суть в технических терминах, он определяет специальное пространство координат.

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

В этом смысле камера довольно необычна, так как она не отображается. Он определяет точку зрения подсистемы отрисовки. Конкретный пример поможет объяснить это.

Простейший пример SessionOrigin

Представьте очень простую сцену, в которой камера находится в источнике при запуске (как обычно в приложениях AR), и в 10 метрах по оси Z перед камерой размещен один красный шар (положение=(0,0,10)).

Простейшая виртуальная сцена

Допустим, мы хотим, чтобы пользователь в исходном положении находился на расстоянии 1 метр от шара.

У нас есть два интересных варианта:

  1. переместить камеру в новое положение (0,0,9);
  2. переместить шар в новое положение (0,0,1).

два параметра;

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

Если мы выберем вариант 1, что нужно делать? Если задать координаты камеры, они будут перезаписаны системой отслеживания. Вместо этого мы присоединяем камеру к родительскому объекту, а затем перемещаем его. Средство отслеживания задает локальную позу камеры, которая перемещает ее по отношению к родительскому объекту. Родителем теперь является SessionOrigin.

Зачем перемещать камеру, а не сферу?

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

Более того, существуют типы объектов, которые трудно или невозможно переместить, например системы частиц или сетки навигации. Но даже если вы не используете ни один из таких объектов, существуют очевидные преимущества изменения координат одного объекта в сцене — SessionOrigin — вместо изменения глобальных координат всех остальных объектов.

SessionOrigin не должен перемещать все объекты

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

Виртуальные и физические объекты

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

Физические объекты, зафиксированные относительно физического пользователя

Что делать, если на сиденье кресла есть привязка? Переместится ли привязка с красным шаром или остается фиксированной относительно сиденья кресла? Вся суть привязки заключается в том, что она должна оставаться фиксированной относительно физического мира, поэтому очевидно, что она останется на месте вместе с креслом.

Еще один пример — виртуальная сетка. Это сетка, созданная для обеспечения виртуальной версии физической среды для контекста, отрисовки лучей и т. д. Мы, безусловно, хотим, чтобы виртуальная сетка оставалась фиксированной в физическом мире.

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

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

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

Пояснение с математической точки зрения

По умолчанию в приложении AR глобальная система координат Unity находится в произвольном месте. Не считая сопоставления вектора силы притяжения (ось Y) с направлением "вверх", положение и ориентация полностью определяются местом, где средство отслеживания помещает камеру при запуске.

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

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

Нужный макет

Если требуется, чтобы шар, расположенный в точке (0,0,10) находился на расстоянии 1 метр по оси X от стула, необходимо, чтобы стул находился в точке (-1,0,10). Если мы определим, что камера в исходной точке находится в 2 метрах сзади от стула непосредственно вдоль отрицательной оси Z, то кресло в этот момент будет находиться в точке (0,0,2). (Помните, что физические объекты не имеют присущих им координат, а только координаты, подразумеваемые по расстоянию от камеры и виртуальных объектов).

Первоначальный макет

Однако, если задать для преобразования SessionOrigin значение (-1,0,8), теперь расположение камеры будет равно (-1,0,8). Кресло, которое находится на расстоянии 2 метров прямо спереди, имеет положение (-1,0,10). А красный шар в точке (0,0,10) будет отображаться на расстоянии 1 метра справа от кресла.

Откорректированный макет

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

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

См. также