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

Я хотел бы создать программу рисования GPS в аргоне и A-Frame, которая рисует линии на основе движений людей.

Линии могут быть нарисованы в A-кадре, например, с помощью компонента meshline, который использует декартовы точки:

<a-entity meshline="lineWidth: 20; path: -2 -1 0, 0 -2 0</a-entity>

Если бы я делал это с устройством GPS, я бы взял координаты GPS и сопоставил их непосредственно с чем-то вроде карт Google. Имеет ли Argon аналогичную функциональность, так что я могу использовать GPS-координаты непосредственно в качестве пути следующим образом:

<a-entity meshline="lineWidth: 20; path: 37.32299 -122.04185 0, 37.32298 -122.03224</a-entity>

Поскольку можно указать точку LLA для отсчета я полагаю, один из способов сделать это было бы представить себе точку центра ГЛПА, как "0, 0, 0", а затем использовать функцию для отображения домена LLA декартова диапазона.

Однако было бы предпочтительнее использовать гео-координаты напрямую. Возможно ли это в Аргоне?

1 ответ

Решение

Чтобы понять ответ, вам нужно сначала понять различные системы отсчета, используемые Argon.

Во-первых, Argon использует геопространственные математические библиотеки caesiumjs.org и Entity, так что все "местоположения" в Argon должны быть либо выражены геопространственно, либо относительно геопространственной сущности. Они коренятся в центре земли, в том, что Цезий называет FIXED координаты, но также известны как координаты ECEF или ECF. В этой системе координаты указываются в метрах: вверх / вниз по полюсам, восток / запад по меридиану (я полагаю). Любая точка на поверхности земли представлена ​​довольно большими числами.

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

Но это неудобно при выполнении AR по нескольким причинам:

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

  2. Координаты, о которых мы "думаем", когда мы думаем об окружающем нас мире, имеют землю как "плоскую" и "вверх", как указывающую... ну, вверх. Таким образом, в трехмерной графике объект над другим объектом обычно имеет те же значения X и Z, но имеет Y, который больше. В координатах ECEF все числа меняются, потому что то, что мы воспринимаем как "вверх", на самом деле является вектором от центра Земли, хотя мы и только "вверх", если мы на севере (или юге, в зависимости от вашего +/-) столб. Большинство библиотек трехмерной графики, которые вы, возможно, захотите использовать (например, библиотеки физики), предполагают мир, в котором земля - ​​это одна плоскость (обычно плоскость XZ), а Y - вверх (некоторые аэронавтики и другие инженерные приложения используют Z как и есть XY в качестве земли, но проблема та же).

Аргон справляется с этим, как и многие геопространственные системы AR, создавая локальную систему координат для использования графики и приложения. Для этого есть три варианта:

  1. Выберите произвольное (но фиксированное) локальное место в качестве источника. Некоторые системы, которые созданы для работы в одном месте, имеют это жестко закодированное. Другие позволяют приложению установить его. Мы этого не делаем, потому что это побудит приложения идти по простому пути и работать только в одном месте (мы видели это в прошлом).

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

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

Аргон использует open 3. Когда приложение запускается, мы создаем новую локальную систему координат в местоположении пользователя, на плоскости, касательной к земле. Если пользователь перемещается далеко от этого местоположения, мы обновляем источник и отправляем событие в приложение (в настоящее время мы центрируемся, если вы находитесь в 5 км от источника). Во многих простых приложениях только с несколькими кадрами или ссылкой, выраженными в геопространственных координатах (а остальные данные приложения выражены относительно известных геопространственных местоположений), преобразование из геопространственного в локальное можно просто выполнить для каждого кадра, что позволяет разработчику приложения игнорировать вновь возникающую проблему. Программист может использовать в качестве своей системы координат ENU (восток-север) или EUS (восток-юг); мы склонны использовать EUS, потому что это похоже на то, что используют большинство систем трехмерной графики (Y вверх, Z указывает на юг, а X на восток).

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

Итак, теперь к вашему вопросу. Ваша проблема заключается в том, что вы хотите использовать геопространственные (координаты цезия, которые использует аргон) координаты в AFrame. Краткий ответ: вы не можете использовать их напрямую, поскольку AFrame построен с использованием локальной системы координат трехмерной графики. Пакет argon-aframe связывает кадр с аргоном, позволяя вам указать referenceframe компоненты, которые позиционируют a-сущность в геопространственном местоположении аргон / цезий, и заботятся обо всех внутренних преобразованиях для вас.

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

Чтобы отдельные координаты в AFrame соответствовали геопространственным местам, вам нужно будет управлять этим самостоятельно, возможно, создав компонент, который сделает это за вас, или (если данные известны в начале), преобразовав его заранее.

Вот что я сделаю.

Предполагая, что у вас есть список геопространственных координат (выраженный как LLA), я бы преобразовал каждую в локальные координаты (сначала преобразовав из LLA в FIXED ECEF координаты Цезия и создав Цезиевый объект, а затем вызвав Аргон context.getEntityPose() на этой сущности (которая будет возвращать свои локальные координаты). Я бы выбрал одно геопространственное местоположение в наборе (возможно, первое?), А затем вычел бы его локальные координаты из каждого из них, чтобы они все были выражены в локальных координатах относительно этого известного геопространственного местоположения.

Тогда, я бы создать объект AFRAME, прикрепленный к referenceframe этого уникального геопространственной объекта, а также создать графическое содержимое внутри него, используя локальные координаты, которые выражаются по отношению к нему. Например, скажем, геопространственное местоположение LongLat = "-84.398881 33.778463" и вы сохранили эти точки (локальные координаты, относительно LongLat) в userPathВы могли бы сделать что-то вроде этого:

<ar-scene>
  <ar-geopose id="GT" lla=" -84.398881 33.778463" userotation="false"> 
    <a-entity meshline="lineWidth: 20; path: userPath; color: #E20049"></a-entity>
 </ar-geopose>    
</ar-scene>
Другие вопросы по тегам