[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "create", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-229719-0", "render_to": "inpage_VI-229719-0-952491735", "adfox_url": "//ads.adfox.ru/228129/getCode?p1=bxeub&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid21=&puid22=&puid31=&fmt=1&pr=" } } ] { "gtm": "GTM-NDH47H" }
{ "author_name": "Артём Слободчиков", "author_type": "self", "tags": ["\u0440\u0430\u0437\u0431\u043e\u0440","ar"], "comments": 1, "likes": 15, "favorites": 3, "is_advertisement": false, "section_name": "gamedev" }
713
Gamedev

Порталы для всех и где угодно: опыт разработчика Portal Painter

Нюансы создания эксперимента в дополненной реальности.

Поделиться

В избранное

В избранном

Джейн Фридхофф (Jane Friedhoff) некоторое время работала с ARCore, новым SDK для создания проектов в дополненной реальности на платформе Android. В материале Gamasutra она рассказала о нюансах создания приложения Portal Painter на Unity и ARCore, с помощью которого на любой поверхности можно нарисовать портал в другое измерение.

Замысел

Прежде чем сесть за ARCore автор опробовала другие экспериментальные приложения в VR и AR, после чего решила сконцентрироваться на абстрактном стиле и отойти от реализма. Во многих демо-версиях AR-проектов были порталы в другие миры, однако обычно они оказывались статичными объектами, позволяющими шагнуть в какое-нибудь цветастое измерение. Фридхофф решила сделать порталы динамичными и дать людям возможность рисовать их где угодно.

Вдохновление она черпала из проектов вроде Sprayscape and Speak To Go, а также ресурсов Google вроде Blocks.

Разработка

Прежде чем сесть за ARCore, Фридхофф разработала общую структуру работы порталов. У них есть четыре ключевые составляющие:

  • ​Камера, «расположенная» в одном из фентезийных миров, которая рендерит вид на этот мир в виде 2D-текстуры.
  • Невидимый квад, который считывает информацию о том, где рисует пользователь.
  • Шейдер, который синтезирует данные из предыдущих пунктов в текстуру и занимается другими визуальными эффектами.
  • «Родительский» объект, через который синтезированная текстура будет демонстрироваться на правильном месте.
Общая схема работы порталов

Опробовав порталы в виртуальном мире с помощью Unity, Фридхофф решила поместить их в реальный, используя ARCore.

Позиционирование

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

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

Обычно в разработке для виртуальных пространств такие задачи реализуются с помощью метода отслеживания лучей, как бы идущих от камеры: программа определяет, пересекаются ли они с объектами или точками интереса. Для работы с дополненной реальностью Фридхофф использовала модули TrackableHit и Session, которые позволяют отслеживать столкновения лучей с объектами реального мира.

TrackableHitFlag raycastFilter = TrackableHitFlag.PlaneWithinBounds | TrackableHitFlag.PlaneWithinPolygon | TrackableHitFlag.PointCloud;

TrackableHit hit;

if (Session.Raycast(cam.ScreenPointToRay(Input.GetTouch (0).position), raycastFilter, out hit)) {

PlacePortal (hit);

}

(Github) ​

TrackableHitFlag уточняет, что мы отслеживаем данные о любых релевантных TrackedPlanes и любых релевантных точках из облака точек в текущем кадре. Результирующий TrackableHit выдаёт положение рисунка пользователя в координатах Unity, которые используются для позиционирования портала на поверхности.

Ориентация

Положение есть, теперь пришло время разобраться с ротацией устройства, ведь разработчики хотели дать пользователям возможность рисовать на полу и потолке.

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

Можно было бы использовать нормаль (вектор, перпендикулярный поверхности) в качестве основы для ориентации портала, но так возможности проецирования были бы ограничены только плоскими горизонтальными поверхностями вроде полов и столешниц. Вертикальные плоскости вроде стен ARCore считает частями облака точек, и на них нельзя было бы рисовать порталы.

Наблюдая за тем, как люди играли с Portal Painter, Фридхофф заметила, что они рисовали на стенах, стоя прямо перед ними, а не с определённого угла. Это означало, что правильной ориентацией вертикального портала в большинстве случаев будет положение перед камерой. В результате для горизонтальных порталов разработчики использовали нормали плоскостей, а вертикальные заставляли располагаться перед камерой. Получилось на удивление неплохо.

Когда программа считывала первоначальное положение, пользователь мог рисовать на плоскости с любого угла. ARCore «запоминал» положение всех порталов, благодаря чему пользователи могли ходить вокруг них, а за счёт абстрактности рисунков и облика потусторонних миров компенсировались редкие недостатки ориентации.

Функция для горизонтальных и вертикальных плоскостей:

void PlacePortal(TrackableHit h) {

var anchor = Session.CreateAnchor(h.Point, Quaternion.identity);

var placedObject = Instantiate(portal, h.Point, Quaternion.identity, anchor.transform);

if (h.Plane != null) {

placedObject.GetComponent<PlaneAttachment>().Attach(h.Plane); placedObject.transform.rotation = Quaternion.FromToRotation(Vector3.forward, h.Normal);

} else {

placedObject.transform.LookAt(cam.transform);

}

}

(Github)

В итоге разрыва в качестве трансляции изображений на горизонтальные и вертикальные плоскости почти не стало.

#разбор #ar

Популярные материалы
Показать еще
{ "is_needs_advanced_access": false }

Комментарии Комм.

Популярные

По порядку

Прямой эфир

Узнавайте первым важные новости

Подписаться