> For the complete documentation index, see [llms.txt](https://lahmeneffaa.gitbook.io/nto.game.vr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lahmeneffaa.gitbook.io/nto.game.vr/ar/modul-5.-geolokacionnaya-dopolnennaya-realnost-kvest-tainy-moego-goroda/sozdanie-geolokacionnogo-prilozheniya-s-ispolzovaniem-biblioteki-ar.js.md).

# Создание геолокационного приложения с использованием библиотеки AR.JS

**Ключевые слова:** *AR.js, Glitch, A-frame, gps-camera, Яндекс.карты, JavaScript, simulateLatitude, simulateLongitude*​

В этой теме рассмотрим основы работы в Aframe и как на основе библиотеки ar.js создать геолокационное приложение.

**AR.js** — это библиотека для создания проектов дополненной реальности в браузере (отслеживание маркеров, отслеживание местоположения). Она проста в использовании, имеет открытый исходный код, проекты запускаются достаточно быстро даже на относительно старых телефонах.&#x20;

AR.js разработана на основе библиотеки **three.js** и **jsartoolkit** и объединена с A-frame (библиотекой для разработки VR в web)

**Шаги создания первого проекта AR.**<br>

1. Хостинг (локальный, <https://glitch.com/>).
2. Создание VR сцены (<https://aframe.io/>).
3. Добавление Камеры для создания AR (<https://ar-js-org.github.io/AR.js-Docs/>).
4. Отслеживание геолокации (<https://yandex.ru/map-constructor/location-tool/>).

Для выполнения первого шага, необходимо зарегистрироваться в web-сервисе Glitch. Далее откроем ссылку из второго шага, перейдем в документацию Aframe и выберем ознакомительный проект "Hello, World!" (Рис. 1).&#x20;

![](https://sun4-16.userapi.com/s/v1/if2/juVPGVudmlbWoHON-xwMRhe_RS9rLBU11Uq3QMcb_I8n-JhWpxm5SP7sAJ_eRfwPSGBwqeMBCBlI5O9REoq-i7kc.jpg?size=1280x490\&quality=96\&type=album)<br>

Рис. 1 Запуск стартового проектаДалее появляется предложение открыть проект в Glitch, необходимо на него согласиться (Рис. 2). &#x20;

![](https://sun9-85.userapi.com/s/v1/if2/I0fMNIHSO3SnfNfI9F6rwPXuwTNnteYBOMRJxyiCOHvxXnO8ztOc-XklXuYaqOlNHxmlxWQBsRcntJ-z2plbVOQt.jpg?size=1280x412\&quality=96\&type=album)<br>

Рис. 2 Окно Remix project

Перед нами открывается интерфейс рабочего пространства Glitch. Слева находятся папки и наши файлы, по центру — редактор кода, справа — превью (Рис. 3).

![](https://sun9-17.userapi.com/s/v1/if2/L58BkigPBeQ9hF2Hegtmeho_xBeALBpdks6chGlfMRt8oQQ0Z2DSnYX6qn9g2ZbmBVjP8AQ3zhgcayy7NQu-CWoH.jpg?size=2560x1182\&quality=96\&type=album)<br>

Рис. 3 Проект Glitch<br>

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

Первое, что нам необходимо сделать, это подключить библиотеку Aframe. Подключение библиотеки можно взять из примера или из документации. В ней обычно выложена самая последняя версия с примером, поэтому можно скопировать строчку отсюда (Рис. 4).

![](https://sun4-15.userapi.com/s/v1/if2/iKEZ3LArvFHArEYyPzkczAyEmZUVdpnwLV6ECmT_ROJGw6OaIqWwffqy-dLfaBXVM0jkQTJJEcEkl05mHNedci1x.jpg?size=1280x790\&quality=96\&type=album)<br>

&#x20;Рис. 4 Подключение библиотеки

В теле нашего кода необходимо выставить следующие теги. ***\<a-scene>***  — все, что расположена внутри него, отображается на нашей сцене, которая и будет являться в дополненной реальности. Если вы укажете что-то вне сцены, то это отображаться не будет. Этот объект будет вне зоны видимости нашего устройства.&#x20;

Далее представлены несколько примитивных объектов:

* \<a-box>  —  представляет из себя примитив в виде куба либо прямоугольника. У него есть несколько атрибутов. Это позиция по x y и z, так как мы находимся в трехмерном пространстве, rotation - это угол поворота нашего куба и свойства color, которое указывает на цвет нашего объекта.
* \<a-sphere> —  примитив сферы.
* \<a-cylinder> —  примитив цилиндра.
* \<a-plane> —  представляет из себя плоскость и имеет другие атрибуты. Это ширина и высота данной плоскости.
* \<a-sky> — заполняет пространство цветом. В дополненной реальности он нам не понадобится (Рис. 5).

![](https://sun4-10.userapi.com/s/v1/if2/iCvICRRqgFO2vZ_mfKwQoxlFuSyqloupydMaAvMTxQd4w-vueush4m_p9Ic260eGv1feIYqhFUHvOcZeeeEpakiZ.jpg?size=1653x519\&quality=96\&type=album)<br>

&#x20;Рис. 5 Пример кода<br>

**Теперь посмотрим на пример с отображением текста.**

Сцена осталась прежней, только теперь у нас есть дополнительный тег ***\<a-text>,*** который отображает какое-то содержание.&#x20;

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

Изначально все шрифты, которые идут по умолчанию для библиотеки aframe, поддерживают только английские символы. Поэтому нам придется создать собственный шрифт, подгрузить его в наш проект, и только после этого у нас будут отображаться русские буквы.&#x20;

Нам необходимо вернуться в документацию aframe, в поиске вбить "***text*** " и перейти на страницу с описанием данного тега. Оттуда мы перейдем на [страницу для создания новых шрифтовых решений](https://msdf-bmfont.donmccurdy.com/). Для работы с данным компилятором, нам понадобится найти любой шрифт поддерживающий русские символы. Для этого вы можете зайти на [google fonts](https://fonts.google.com/).&#x20;

Для примера скачаем шрифт Roboto. После загрузки перейдем во вкладку ***Glyphs*** (Рис. 6).

![](https://sun9-24.userapi.com/s/v1/if2/3xLzzALLec9u_Gd3iG-GcqjcAlB2iTDmPhM-5_jmIGctnqA2gFwmt19PXKr6StD2fJlooZFjhih6c0Ngl7f-0BsR.jpg?size=1280x964\&quality=96\&type=album)<br>

&#x20;Рис. 6 Вкладка Glyphs​

Здесь необходимо скопировать таблицу символов (Рис. 7).

![](https://sun9-12.userapi.com/s/v1/if2/CZG3gzjb4wF2pzE1Cz-f92v1ReIhw8NzjEsMoL19XqEIv8yZu1Y1KxeXoHqWozXH3vBRo1MONloOQuHM0t5baOwt.jpg?size=2560x1145\&quality=96\&type=album)<br>

&#x20;Рис. 7 Таблица символов<br>

Затем возвращаемся на страничку с созданием нашего шрифта. Вставляем в поле ***"Select character set"*** скопированные раннее символы. Не забываем вставить в конце пробел (Рис. 8).

![](https://sun9-48.userapi.com/s/v1/if2/WxmMYYzW1djTEZ3tsWxDXSly5eYAp9GsVpo_hEUedz0bmglnVicBKdc1W6XAu85MXcO5lDSsWdC9f2e1z5eKHhSi.jpg?size=1280x299\&quality=96\&type=album)<br>

Рис. 8 Заполнение поля Select character set<br>

В первом пункте "***Select font"***  прикрепим раннее скачанный файл со шрифтом, предварительно его распаковав. Файл имеет расширение **.ttf**&#x20;

В третьем пункте нажимаем на кнопку "**Create MSDF".**\
После того, как шрифт сгенерировался, смотрим на отображение. У вас должны отображаться первые символы введенные во второй пункт. Если отображаются какие-то другие символы или нечто непонятное, необходимо изменить размерность нашего MSDF шрифта (Рис. 9).

![](https://sun4-10.userapi.com/s/v1/if2/Ed1SPbks-XRrkfMbd4MgmNaRUCVBT6ulVaJmidfhszRoHJ2Xv5l2OhE9mJh1vwbDXYU2G4ezSb8CRPaUYKFA9wEq.jpg?size=1196x482\&quality=96\&type=album)<br>

Рис. 9 Изменение размера​

После того, как отображение текста нас удовлетворило, можем переходить к скачиванию.&#x20;

В пятом пункте присутствует пример того, как можно вставить текст в проект. Давайте его скопируем и вставим в наш код (Рис. 10).&#x20;

![](https://sun9-86.userapi.com/s/v1/if2/CKH3yjQQlzAgsi5R30_yfwL6MCAbouJwtWZvP8QVYXlpWGKOGznMjDWcFfJmjOc7vxeTVAMxZTI4st4sLmUD71Xd.jpg?size=1280x635\&quality=96\&type=album)<br>

Рис. 10 Подключение русского языка<br>

Далее необходимо подгрузить два ранее скачанных файла. Файл .json мы можем импортировать воспользовавшись перетаскиванием объектов в левую панель Glitch, либо плюсом и кнопкой "**загрузить файл**" (Рис. 11).&#x20;

![](https://sun9-49.userapi.com/s/v1/if2/s-RL3QZQRx7YhD7xTKUz3TE4zLx5erU3L2aNbPW5GQm5T9Un2Xc6vIjSuzGerodsdaqsZWXgBcY9JZIcwELspMU6.jpg?size=589x397\&quality=96\&type=album)<br>

Рис. 11 Импорт json файла<br>

Для того чтобы загрузить второй файл **.png**, перейдем во вкладку Assets и перетащим туда нашу картинку. Дожидаемся загрузки и после нажатия на нашу картинку копируем url (Рис. 12).&#x20;

![](https://sun4-10.userapi.com/s/v1/if2/XagEtSP9JXKWdjwNTa8j6QkHAwqbKYqFa6ZDw0sZmBMa3Q70fW77cXiF2zB5LgQUtr7BJpaoPcKiu7QUmMGllNRf.jpg?size=1280x1204\&quality=96\&type=album)

Рис. 12 Получение ссылки на картинку<br>

Так как мы работаем в Glitch, у нас несколько нестандартное расположение файлов. Так как картинка и json-файл лежат в разных директориях, необходимо указать дополнительный атрибут которой будет ссылаться на нее. Нам потребуется атрибут <***font-image>,*** внутрь которого мы вставляем ранее скопированную ссылку (Рис. 13). &#x20;

![](https://sun9-26.userapi.com/s/v1/if2/m8VnQL3qDJeD7q__zNsn7xs51GlBtKWVzv2xz-zusXGPw15D4FRHLkqWr5yjxiOPvGTCd98LCFoBFkgkjnZYMP6D.jpg?size=1280x571\&quality=96\&type=album)<br>

Рис. 13 Вставка текста<br>

Однако, мы не видим нашего текста. Это происходит потому, что его позиция находится под plane. Ее необходимо скорректировать (Рис. 14). <br>

![](https://sun4-17.userapi.com/s/v1/if2/tK6L3j_BFeaylqTQ6866_CMIYLo27ODunNwBypcjAUx9nYRjsOfs28UuqveJ6p0wt_AhYaagiSU5pT1h76SzyUVa.jpg?size=1280x464\&quality=96\&type=album)<br>

Рис. 14 Корректировка позиционирования текста<br>

Для того, чтобы создавать проекты дополненной реальности, нам потребуется подключить еще две библиотеки связанные с AR.js. &#x20;

[На главной странице](https://ar-js-org.github.io/AR.js-Docs/) документации библиотеки AR.js есть кусочки кода для подключения библиотек. Нам потребуется отслеживать маркеры и позицию людей, поэтому находим **AR.js with Marker Tracking + Location Based AR** и копируем 2 строчки оттуда (Рис. 15).&#x20;

![](https://sun9-65.userapi.com/s/v1/if2/lzmv7sfDqBjBGtVxmYAl6cN1Rxu0YdnjSbvv5AV-gUXQCObcPrtrkvRfcwDyqOBgqwXve0uq3ir1RUHOayn2utLx.jpg?size=1280x461\&quality=96\&type=album)<br>

Рис. 15 Скрипты для подключения библиотек<br>

Переходим обратно в проект и добавляем скрипты в ***\<head>*** (Рис. 16).&#x20;

![](https://sun9-79.userapi.com/s/v1/if2/iLiJ4m6VUyluhXw0k5_PgfsLF89b-DdJoDHD8UOchoAKo9AOkMv84sCFQ5w0_0hb1gJ-4LQQF34BQ4IhVRJpK99D.jpg?size=1280x128\&quality=96\&type=album)<br>

Рис. 16 Подключение библиотек<br>

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

Для создания дополненной реальности нам понадобится еще одни тег — **\<a-camera>.** Он позволит нам отслеживать позицию камеры и ее повороты, что позволит ей отображать наш контент так, как нужно именно нам.

Перейдем в [документацию](https://ar-js-org.github.io/AR.js-Docs/location-based/) AR.js в заголовок ***Location Based.*** В примере написано, что к нашему тегу *\<a-camera>*  необходимо дописать атрибуты ***gps-camera***,  для того чтобы отслеживать позицию человека, и советуют дописывать ***rotation-reader,*** которая отвечает за позиционирование и отслеживание поворотов в пространстве. В целом, данную строчку можно полностью скопировать и вставить в свой проект (Рис. 17).&#x20;

![](https://sun9-25.userapi.com/s/v1/if2/SilDdw3wziOgfq2-A4Tifa99USWoEb5n-s3EUdlzciEyRx79JbT1VsxtL6DXskHMvWpHy9g_KCLGvVKh8YFTMuMQ.jpg?size=1280x625\&quality=96\&type=album)<br>

Рис. 17 Location Based - gps-camera<br>

Gps-camera имеет множество атрибутов. Но нам понадобятся только несколько из них. Первый это ***simulateLatitude*** - симуляция долготы и широты, она позволит нам произвести быструю отладку относительно той местности, на которой мы будем выстраивать дополнительные точки, которые будут отображаться в дополненной реальности.

Посмотрим как узнать свою долготу и широту на примере яндекс.карт (Рис. 18).&#x20;

![](https://sun4-11.userapi.com/s/v1/if2/0z8UuFZMzvBDZI3sKSXogl2X7uCDriHm2gzpoMKOLqXgQSxpfjgIlgISyE7u1PJ6zKGIXJCnbV620RICyPfFjRxO.jpg?size=1280x667\&quality=96\&type=album)<br>

Рис. 18 Определение координат от яндекс.карт<br>

Введем нужный нам адрес в поисковую строку. И настроим местоположение так, чтобы плюсик указывал на нужную нам точку. Окошко в правом нижнем углу выводит массив из двух переменных - долготы и широты (Рис. 19).&#x20;

![](https://sun9-61.userapi.com/s/v1/if2/LgcCjV1AqaaunXrUKfBIH17gUjPRDGzDRwBBwQ0pH88syQSvKQsz2l7s9a21NofUNLn497iXXK1vW5lanCQg7_7Q.jpg?size=1280x588\&quality=96\&type=album)<br>

Рис. 19 Координаты выбранной позиции

Скопируем  координаты и перенесем их в свой проект. Пока в закомментированном виде (Рис. 20). &#x20;

<br>

<figure><img src="https://sun9-44.userapi.com/s/v1/if2/5_WU4VQJSQ3Wr87BPZoi-cuhtrRU5ZWckwg0Cl1Q1mYDtxqJaneg3LwBmFIlMmKiK5KlD9QjqvSTW-wF0uB0Opfd.jpg?size=1097x159&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 20 Перенос координат в проект<br>

Вернемся к атрибутам из нашей документации. У нас есть ***simulateLatitude*** и ***simulateLongitude.*** Скопируем эти атрибуты и вставим из в проект. Примитивы из кода мы можем удалить (Рис. 21).

<br>

<figure><img src="https://sun9-45.userapi.com/s/v1/if2/8sp6tIi44llK-MHbdrBe-d9LNpRmD6LBm3ziH5SIvCOI1ApTS3ZsY0NhTrLR5RFtG-dPqkt3rTTMkoGLvPtL3SVi.jpg?size=1280x468&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 21 Работа с кодом<br>

Вернемся обратно в документацию и увидим еще один тег - ***gps-entity-place***. Он позволяет  указывать местоположение наших примитивов. Скопируем пример и вставим его в проект.  Вернемся в яндекс.карты и заменим ***\<your-latitude>*** и ***\<your-longitude>*** на новую точку (Рис. 22).

<br>

<figure><img src="https://sun9-40.userapi.com/s/v1/if2/Vuqn2lUghmXO9eJe0hFBlc_7pIRzxhnlbKkkUkDd_fTi95SWrminfYlrVb6SJSexeD3T29jZNV4spoIX-zE7p--e.jpg?size=1280x457&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 22 Работа с кодом<br>

Обновим превью. Можно заметить, что объект очень маленький, это необходимо исправить. Для этого подкорректируем тег \<a-box> добавив к нему свойство **scale.** Атрибут **scale** имеет три параметра: это увеличение по оси X, увеличение по оси Y, и увеличения по оси Z (Рис. 23).&#x20;

<br>

<figure><img src="https://sun9-49.userapi.com/s/v1/if2/yJffHaBydc5rh8X867gVCqHJB6PFCwS1glg44PJ-yzrKIekyywLQV-Sadq9Atgr-EeVlA7jygavq8CNPfHhNGvfS.jpg?size=1280x482&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 23 Увеличение размера куба<br>

В библиотеке Aframe также есть тег \<a-entity>. Он позволяет с помощью атрибута геометрия присваивать абсолютно любую форму объекту. Создадим вторую точку которая тоже будет кубом. Перейдем [в документацию Aframe](https://aframe.io/docs/1.3.0/core/entity.html#sidebar) .

Cкопируем первый пример и вставим его в наш проект. Добавим новую геопозицию (Рис. 24).&#x20;

![](https://sun9-87.userapi.com/s/v1/if2/naHdYcsvezi2zq4BQrqK0RdVc3XUx9mdpJ1faEX7E393QVCycvwYdetMOOPh-aUY5Xpvj9ksa7I0wZdqzDugbY9u.jpg?size=1280x763\&quality=96\&type=album)<br>

Рис. 24 Работа с кодом<br>

Давайте посмотрим, как вставлять наши объекты в цикле. Допустим, у нас есть массив, где указано название, долгота и широта нашего объекта. Мы будем создавать блоки, которые отображаются, с помощью Java Script и добавлять их на сцену . Создаем новый тег \<scrip>  сразу после подключаемых библиотек. Первым делом мы создадим массив "*places"* у нас он выглядит следующим образом (Рис. 25).

![](https://sun9-84.userapi.com/s/v1/if2/_xof4UCLnk0P0hRKs2Cb9e1B_5vO2ETSUe5EnFoYaW8m2iZKrl2LurQt4Kmr5rw3H2UM1fPqM4jkCS2XKiVMpNxu.jpg?size=1141x476\&quality=96\&type=album)<br>

Рис. 25 Создание массива<br>

После массива введем команду ***window\.onload,*** которая дожидается полной загрузки страницы и  выполняет алгоритм, который в нее вложен. Внутри мы ссылаемся на тег ***a-scene*** и записываем его в переменную *scene (Рис. 26).*&#x20;

<br>

<figure><img src="https://sun9-51.userapi.com/s/v1/if2/4HFZ3cNsKDicxbxhYLghYwJ3KquI069Gd0Ps0I3lWkZunXZLJySWf8xGB5CABf-5Jne4DQzvm-ZFcTr5tJEv-pwl.jpg?size=946x114&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 26 Работа с кодом<br>

После этого мы перебираем наш массив *place* с помощью функции ***for each*** и в скобках указываем, как будет называться один элемент данного массива. После чего мы начинаем создавать новые элементы, которые будут типа ***а-entity** (Рис. 27).*&#x20;

![](https://sun9-65.userapi.com/s/v1/if2/FOD2SiiCRukNzdy2wuB_-ZpL6JACQd_N_k0v4iWRQTQpiKHgGaPRzKC8WCopWstY4YDyk4v0DUh7fN9BPf3F-GBx.jpg?size=1280x817\&quality=96\&type=album)<br>

Рис. 27 Работа с кодом<br>

&#x20;Давайте подгрузим какую-нибудь картинку. Для этого добавим в атрибут **material** свойство **src,** где сошлемся на добавленную картинку в \<a-assets> (Рис. 28).&#x20;

<br>

<figure><img src="https://sun9-27.userapi.com/s/v1/if2/VFj23T4KCbbWmchHWrQe4HFL5PjitBOkwMOEG3CjX4ESt2rf1i7505QcOjCrWDccibADL9PjYats46Q6q1rJQnpd.jpg?size=1280x250&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 28 Работа с кодом<br>

Для того, чтобы подгружаемое изображение поддерживало прозрачность, добавим стиль наложения в скрипте (Рис. 29).&#x20;

<br>

<figure><img src="https://sun4-15.userapi.com/s/v1/if2/WisPU5ik7KZ1F2tltj7X9-g9mb2FETxv0GsCkX15-BdsuB7Cii-1yvd7aVMe65_5ZpsRIReF8JS42kTAFLQgOh7Q.jpg?size=1280x103&#x26;quality=96&#x26;type=album" alt=""><figcaption></figcaption></figure>

Рис. 29 Работа с кодом<br>

Запустим превью. Видим, что локации отображаются и они на разном расстоянии, как мы и прописывали (Рис. 30).&#x20;

![](https://sun9-39.userapi.com/s/v1/if2/1iK_J7m02qyrwdwArr_Mb3uWsIxClpUf9ukv0w9pCXxVauMt6wtaaaOoUFTiaSbd0aSE8fPt4nP5JVtbycE0gWkN.jpg?size=1280x1138\&quality=96\&type=album)<br>

Рис. 30 Отображение локаций<br>

Добавим наименование к каждой локации. Для этого воспользуемся атрибутом **text**. Давайте добавим и подключим наш кастомный шрифт с русскими символами. Для того, чтобы мы могли работать с массивом наименований, поставим косые скобки и сошлемся на вторые элементы массива. Также добавим черный цвет текста, подкорректируем размер с положением и контур (Рис. 31).&#x20;

![](https://sun9-76.userapi.com/s/v1/if2/fbfdKrxWhoNgIY4M23doNakP9Zorx_oRhw-3uxOuHI2RqFQl0gu_D52R4sq6N5TSW7cmQ9ecS3MyaLBUfng_qPso.jpg?size=1280x85\&quality=96\&type=album)<br>

Рис. 31 Работа с кодом<br>

Перейдем в превью. Камера дергается, так как находится в статичном устройстве. Однако, мы работаем с мобильными устройствами, поэтому нашу камеру нужно контролировать. Для этого у нас в камере есть несколько параметров, которые смогут нам помочь (Рис. 32).&#x20;

![](https://sun9-54.userapi.com/s/v1/if2/j4XMH3sj9BhHUolVJVyXUofuS-dIgCR1ONzZhYKhEIF1Asl54es9hyfzBcoIe0ZPkeAZ4P6aO9KWwm-131_4iqwJ.jpg?size=1280x936\&quality=96\&type=album)<br>

Рис. 32 Добавление текста<br>

Вернемся к [документации AR.js](https://ar-js-org.github.io/AR.js-Docs/location-based/#gps-camera) . У нас есть минимальная (minDistance) и максимальная (maxDistance) дистанции, это относится к тому, сколько у нас видит камера на текущий момент.&#x20;

Допустим, ***minDistance*** = 2 м, тогда пользователь не будет видеть метки, которые ближе к нему, чем два метра. Это делается для того, чтобы контент не перекрывал друг или, возможно, в этом месте вы хотите, чтобы пользователь нашел что-то уже без ваших подсказок. Максимальная дистанция - это то, насколько далеко пользователь будет видеть метки. В некоторых случаях эта дистанция увеличится до такой степени, что наши 3d-объекты станут очень маленькими, но если вы работаете с картой всего города, то максимальную дистанцию тоже следует ограничивать. Так как элементы прогружаются и занимают память устройства.&#x20;

Еще одно свойства камеры - ***gpsMinDistance***, которое следует указывать, когда мы работаем с мобильными устройствами. Оно позволяет нам отслеживать камеру и ее движение не постоянно, а на определенной дистанции. Условная дистанция это 5 метров, чем больше число,  тем меньше движений и колебаний будет учитываться.&#x20;

Добавим значения **\<a-camera>** и удалим не нужные нам, так как симуляция нам больше не потребуется, мы начинаем работать с телефоном (Рис. 33).&#x20;

![](https://sun9-50.userapi.com/s/v1/if2/OGGIgBu2RLF67HhV5LndEdg0lnnGSxCCmHFzYAZC3Qtsp8c5z5g9K_Uhpc68nCP6ryA5SRnWedTKYlan36h2U1WM.jpg?size=699x164\&quality=96\&type=album)<br>

Рис. 33 Работа с кодом<br>

Запустим превью и скопируем ссылку на демонстрацию с мобильного устройства.
