Создание AR из 10 строк HTML-кода (AR.js)

AR.js — это библиотека для создания опыта Web-AR. Она очень проста в использовании и может стать вашей площадкой для экспериментов. Мы подготовили перевод отличной статьи, которая поможет вам изучить эту библиотеку быстрее и сделать первый проект Web-AR.

Создание AR из 10 строк HTML-кода (AR.js)

Дополненная реальность (AR) прямо сейчас задает тренды в техническом пространстве и многие крупные компании, такие как IKEA, Coca-Cola и ZARA внедряют AR-технологии в свои продукты и маркетинг. Как веб-дизайнер/разработчик из Webpuppies я был чрезвычайно очарован количеством возможностей, которые может предложить AR. Однако у меня было очень мало знаний касаемо того, как они были разработаны.

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

Я хорошенько поискал и нашел ответ; AR на базе веб-технологий с использованием библиотеки AR.js. Для тех, кто хочет окунуться в пространство дополненной реальности, но боится того, что будет сложно, хочу уверить — сложно не будет. Вам нужно всего лишь написать несколько строк HTML-кода и вуаля! Вы можете создать свой самый первый AR-проект менее чем за 10 минут!

Что из себя представляет AR на базе Web?

Как следует из названия, AR на базе веб-технологий в основном позволяет пользователям запускать специализированную камеру, которая может обнаруживать и отображать AR-объекты, просто перейдя по ссылке. Создавая AR в web, пользователям не нужно загружать дополнительные приложения для того, чтобы просто увидеть AR в действии.

Что такое AR.js?

AR.js — это облегченная библиотека для AR, созданная Jerome Etienne и поддерживаемая Nicolò Carpignoli. Она построена на основе библиотеки three.js и jsartoolkit и объединена с A-frame (библиотекой для разработки VR в web) для AR экспириенса. Тут используются маркеры, чтобы камера могла обнаруживать и отображать AR объект. В этом методе создания дополненной реальности замечательно то, что он:

  1. На все 100% базирован на web.
  2. Очень быстро запускается даже на относительно старых телефонах.
  3. Имеет открытый исходный код (а главное бесплатный!)
  4. И последнее, но не менее важное: для его запуска и работы требуется всего около 10 строк HTML-кода!
Создание AR из 10 строк HTML-кода (AR.js)

Круто! Итак, как мне начать?

Во-первых, вам нужно настроить несколько вещей:

  • Веб-сервер для размещения вашего HTML-кода или настройте его на своем собственном http: // localhost / сервере. Вы также можете зарегистрировать учетную запись sandbox на codepen.io для легкого размещения своего кода в интернете или использовать быстрый и бесплатный glitch.com. Если вы будете использовать glitch, то для начала вам достаточно создать html проект (hello web-page).
  • Скопируйте и вставьте эти несколько строк HTML-кода в свой файл index.html:
<!doctype HTML> <html> <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script> <script src="https://raw.githack.com/jeromeetienne/AR.js/2.0.5/aframe/build/aframe-ar.js"></script> <body style='margin : 0px; overflow: scroll;'> <a-scene embedded arjs> <a-box position='0 0.5 0' material='opacity: 0.5;'></a-box> <a-marker-camera preset='hiro'></a-marker-camera> </a-scene> </body> </html>
  • Откройте ссылку на своем устройстве и наведите камеру на это изображение.
Создание AR из 10 строк HTML-кода (AR.js)

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

  • Если через камеру вашего устройства вы видите AR блок, расположенный сверху маркера Hiro, то та-да! Вы только что создали свой самый первый AR-опыт! Просто, так ведь?

Удивительно! Но как это работает?

Давайте просмотрим код построчно:

1. Библиотека A-frame и AR.js импортируется с помощью этих двух скриптов:

<script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script > <script src="https://raw.githack.com/jeromeetienne/AR.js/2.0.5/aframe/build/afram e-ar.js"></script>

2. В тело HTML мы включаем <a-scene> из библиотеки A-frame и сообщаем A-frame, что мы хотим инициализировать AR.js с embedded arjs с помощью <a-scene>.

<a-scene embedded arjs>

Таким образом <a-scene> охватывает все, что мы хотим поместить внутрь, включая маркер, камеру и AR-объект. Проще говоря, A-frame позволяет 3D-моделям работать в сети, а AR.js преобразует веб-сцену в AR-сцену.

3. Затем мы хотим добавить объект, который будет включен в <a-scene>. На данный момент мы используем готовые к использованию элементы A-frame, называемые примитивами.

<a-box position='0 0.5 0' material='opacity: 0.5;'></a-box>

Вы можете поэкспериментировать с другими примитивами, доступными в библиотеке A-frame. Вот несколько примеров, которые можно использовать для замены <a-box>:

<a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere> <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder> <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>

4. Наконец, мы сообщаем A-Frame, что хотим, чтобы arjs управлял камерой, добавляя:

<a-marker-camera preset='hiro'></a-marker-camera>

<a-marker-camera> использует заданный маркер под названием hiro, который является маркером в библиотеке AR.js.

Готово! Конечно, в сцене A-frame есть гораздо больше, c чем можно поиграть, например, добавить анимацию, взаимодействие с объектами или даже добавить в сцену свою собственную 3D-модель. Вы можете узнать больше обо всех возможностях, которые предоставляет AR.js тут, а также ознакомиться с документацией по A-frame здесь.

Кастомные AR-маркеры

Вы можете захотеть создать свой собственный маркер и не полагаться на предустановленный в AR.js маркер hiro. Что ж, почему бы и нет? Вот что нужно сделать для создания собственного AR-маркера:

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

— Они должны быть квадратной формы.

— У них не может быть белых/прозрачных областей, только светло-серые (например, # F0F0F0 или RGB (240, 240, 240)). Обратите внимание на фон, окружающий изображение.

— Лучше всего они работают, имея асимметричную форму.

2. Перейдите по ссылке AR.js Custom Marker Training.

Создание AR из 10 строк HTML-кода (AR.js)

3. Нажмите «Upload» и загрузите изображение. Дефолтное значение для рисунка установлено на 0,50. Также есть ползунок «пропорции рисунка», который увеличивает/уменьшает количество черной границы, окружающей изображение. Вы можете изменить соотношение по своему усмотрению, но вполне возможно, что потребуется добавить дополнительные строчки кода в том случае, если соотношение будет не установлено на 0,50.

4. Нажмите «Download Marker», после чего будет создан .patt файл. Добавьте этот .patt файл в свой каталог, где находится index.html. Щелкните «Download Image», чтобы создать маркер в виде .png изображения.

5. Вам нужно будет заменить <a-marker-camera>

<a-marker-camera preset = 'hiro'> </a-marker-camera>

с помощью

<a-marker type = 'pattern' url = 'path / to / pattern-marker.patt'> </a-marker>

где path/to/pattern-marker.patt находится в .patt файле, который вы разместили ранее. Вы могли заметить, что <a-marker-camera> теперь просто <a-marker>. Так куда же делась камера? Что ж, не волнуйтесь, ведь вам просто нужно добавить отдельную a-entity камеру:

<a-entity camera></a-entity>

6. Если вы увеличили/уменьшили соотношение на странице AR.js Custom Marker Training (например, соотношение установлено на 0,7), вам нужно будет добавить следующие параметры в embedded arjs:

<a-scene embedded arjs='patternRatio: 0.7'>

Весь код будет выглядеть таким образом:

<! doctype HTML> <html> <script src = " https://aframe.io/releases/0.9.2/aframe.min.js "> </script> <script src = " https://raw.githack.com/jeromeetienne/AR.js /2.0.5/aframe/build/aframe-ar.js "> </script> <body style = 'margin: 0px; overflow: scroll; '> <a-scene embedded arjs =' patternRatio: 0.7 '> <a-marker type =' pattern 'url =' path / to / pattern-marker.patt '> <a-box position =' 0 0,5 0 'material =' opacity: 0.5; '> </a-box> </a-marker> <a-entity camera> </a-entity> </a-scene> </body> </html>

Вы поймете, что <a-box> примитив находится внутри <a-marker> тега, а примитив — <a-entity camera> вне его. Это потому, что он позволяет отображать объект только после того, как камера обнаруживает настраиваемый маркер и исчезает, когда на него не направлена камера.

Подводя итоги

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

Больше статей на телеграм-канале

29
24 комментария
\n\n\n\n \n \n \n \n\n\n","lang":""}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Откройте ссылку на своем устройстве и наведите камеру на это изображение."],"type":"UL"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"af634cb0-038a-5245-8169-385adf3fb9ad","width":472,"height":475,"size":5335,"type":"png","color":"040404","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Если через камеру вашего устройства вы видите AR блок, расположенный сверху маркера Hiro, то та-да! Вы только что создали свой самый первый AR-опыт! Просто, так ведь?"],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Удивительно! Но как это работает?"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Давайте просмотрим код построчно:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

1. Библиотека A-frame и AR.js импортируется с помощью этих двух скриптов:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

2. В тело HTML мы включаем <a-scene> из библиотеки A-frame и сообщаем A-frame, что мы хотим инициализировать AR.js с embedded arjs с помощью <a-scene>.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Таким образом <a-scene> охватывает все, что мы хотим поместить внутрь, включая маркер, камеру и AR-объект. Проще говоря, A-frame позволяет 3D-моделям работать в сети, а AR.js преобразует веб-сцену в AR-сцену.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3. Затем мы хотим добавить объект, который будет включен в <a-scene>. На данный момент мы используем готовые к использованию элементы A-frame, называемые примитивами.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вы можете поэкспериментировать с другими примитивами, доступными в библиотеке A-frame. Вот несколько примеров, которые можно использовать для замены <a-box>:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n\n\n\n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

4. Наконец, мы сообщаем A-Frame, что хотим, чтобы arjs управлял камерой, добавляя:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

<a-marker-camera> использует заданный маркер под названием hiro, который является маркером в библиотеке AR.js.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Готово! Конечно, в сцене A-frame есть гораздо больше, c чем можно поиграть, например, добавить анимацию, взаимодействие с объектами или даже добавить в сцену свою собственную 3D-модель. Вы можете узнать больше обо всех возможностях, которые предоставляет AR.js тут, а также ознакомиться с документацией по A-frame здесь.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Кастомные AR-маркеры"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вы можете захотеть создать свой собственный маркер и не полагаться на предустановленный в AR.js маркер hiro. Что ж, почему бы и нет? Вот что нужно сделать для создания собственного AR-маркера:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

— Они должны быть квадратной формы.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

— У них не может быть белых/прозрачных областей, только светло-серые (например, # F0F0F0 или RGB (240, 240, 240)). Обратите внимание на фон, окружающий изображение.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

— Лучше всего они работают, имея асимметричную форму.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

2. Перейдите по ссылке AR.js Custom Marker Training.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"585b2cec-1d34-52da-992f-c2a59f9dbece","width":1958,"height":1156,"size":26982,"type":"png","color":"ebebeb","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3. Нажмите «Upload» и загрузите изображение. Дефолтное значение для рисунка установлено на 0,50. Также есть ползунок «пропорции рисунка», который увеличивает/уменьшает количество черной границы, окружающей изображение. Вы можете изменить соотношение по своему усмотрению, но вполне возможно, что потребуется добавить дополнительные строчки кода в том случае, если соотношение будет не установлено на 0,50.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

4. Нажмите «Download Marker», после чего будет создан .patt файл. Добавьте этот .patt файл в свой каталог, где находится index.html. Щелкните «Download Image», чтобы создать маркер в виде .png изображения.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

5. Вам нужно будет заменить <a-marker-camera>

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":" ","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

с помощью

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":" \n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

где path/to/pattern-marker.patt находится в .patt файле, который вы разместили ранее. Вы могли заметить, что <a-marker-camera> теперь просто <a-marker>. Так куда же делась камера? Что ж, не волнуйтесь, ведь вам просто нужно добавить отдельную a-entity камеру:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

6. Если вы увеличили/уменьшили соотношение на странице AR.js Custom Marker Training (например, соотношение установлено на 0,7), вам нужно будет добавить следующие параметры в embedded arjs:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Весь код будет выглядеть таким образом:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":" \n\n\n \n\n\n \n \n \n \n \n \n \n \n \n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вы поймете, что <a-box> примитив находится внутри <a-marker> тега, а примитив — <a-entity camera> вне его. Это потому, что он позволяет отображать объект только после того, как камера обнаруживает настраиваемый маркер и исчезает, когда на него не направлена камера.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Подводя итоги"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Больше статей на телеграм-канале

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

#ar #дополненнаяреальность

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":24,"favorites":153,"reposts":1,"views":12,"hits":31676,"reads":null,"online":0},"dateFavorite":0,"hitsCount":31676,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/dev/195226-sozdanie-ar-iz-10strok-html-koda-arjs","author":{"id":301918,"name":"Glory Mlory","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"8c82dba7-279e-5ad1-ba11-5d2199ab3388","width":512,"height":511,"size":8345,"type":"png","color":"fb932c","hash":"0e0f173333170f0e","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"58196ab2-606b-da59-4b80-4e39fef23a9e","width":1702,"height":630,"size":166285,"type":"png","color":"141414","hash":"","external_service":[]}},"cover_y":60},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":5122104,"userId":301918,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5122104"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1498017,"userId":301918,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1498017"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":271309,"userId":301918,"count":0,"shareImage":"https://api.vc.ru/achievements/share/271309"}],"lastModificationDate":1764941928,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":235819,"name":"Разработка","description":"Сообщество разработчиков: публикации о личном опыте, выдающиеся приёмы при решении рутинных задач, полезные материалы для профессионального роста.","uri":"/dev","avatar":{"type":"image","data":{"uuid":"fef5b5fb-e488-5b7f-8445-e3a26a910b44","width":1200,"height":1200,"size":7757,"type":"png","color":"343434","hash":"04042b2b1c1000","external_service":[]}},"cover":{"type":"image","data":{"uuid":"2a214cc5-35cc-58ca-bc07-fc1c892d2101","width":960,"height":280,"size":177,"type":"png","color":"343434","hash":"","external_service":[]}},"lastModificationDate":1642411346,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"dev","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":29}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":["ar","дополненнаяреальность"],"media":{"type":"image","data":{"uuid":"d72fbb05-6953-515d-bb5c-67a1b171c520","width":1280,"height":652,"size":268924,"type":"png","color":"433632","hash":"","external_service":[]}},"customCover":null,"robotsTag":null,"categories":[],"isAnonymized":true}};