Богатое взаимодействие между пользователем и виртуальным миром является ключевым аспектом того, что делает виртуальную реальность такой привлекательной, но создание и настройка таких взаимодействий — сложная и трудоемкая задача для разработчиков. Наборы инструментов, такие как UltimateXR, могут ускорить процесс итерации для взаимодействия с виртуальной реальностью, привнося больше интерактивности и погружения в игры и впечатления.
Энрике Тромп, соучредитель и технический директор VRMADA, продемонстрировал несколько примеров, разработанных в VRMADA, где используется виртуальная реальность для корпоративного обучения и моделирования. Одна из ключевых идей заключается в том, что хорошие, естественные взаимодействия необходимы для эффективного усвоения процедур, на которые нацелена тренировка. В видеоиграх виртуальной реальности отличные взаимодействия улучшают игровой процесс и могут сделать некоторые механики действительно увлекательными и приятными.
Примерно с 2016 года Энрике посвятил большую часть своей жизни созданию фреймворка и набора инструментов, которые стали технологической основой компании. Главной целью было создание масштабируемой системы, которая помогла бы разработчикам создавать VR-приложения на долгие годы. В течение этих лет компании приходилось разрабатывать приложения с самыми разными требованиями, взаимодействиями и целями, от серьезного обучения до развлечения. Эти различия сыграли ключевую роль в естественной конверсии фреймворка в систему, готовую работать в самых разных сценариях.
Недавно они решили сделать платформу и инструменты общедоступными — бесплатно и с открытым исходным кодом для всех. Результатом является UltimateXR для Unity.
В этой статье рассказывается о некоторых функциях UltimateXR, которые сыграли ключевую роль в успешном улучшении наших взаимодействий с виртуальной реальностью при одновременном сокращении времени выполнения работ.
Встроенный редактор поз рук
Создание поз рук — важный процесс при разработке манипуляций с объектами и других механик, требующих переключения между разными позами.
Вначале разработчики экспортировали анимацию рук напрямую из выбранной 3D-программы (3dsMax, Maya, Blender и т. д.), но вскоре поняли, что это стало большой загвоздкой. Было решено разработать полноценный редактор поз рук внутри Unity, который позволил бы настраивать позы рук прямо из редактора мира.
Помимо стандартных опций редактирования, некоторые функции, которые сыграли ключевую роль в сокращении времени обработки:
- Поддержка пользовательских виджетов для быстрого вращения костяшек пальцев, она также позволяет разработчику использовать встроенные дескрипторы преобразования Unity. Их можно использовать взаимозаменяемо.
- Поддержка фиксированных и смешанных поз (подробнее об этом позже).
- Поддержка предустановок ручных поз, которые можно использовать напрямую или в качестве быстрой отправной точки для новых поз.
- Поддержка обмена позами между установками, поступающими из приложений, с использованием разных систем координат.
Во время разработки разработчики поняли, что многие объекты захватываются с использованием общих поз из известного набора. Единственная разница заключалась в том, что хват был более открытым или закрытым в зависимости от размера объекта.
Было решено создать новый тип позы, называемый позой смешивания, который определяется начальной позой и конечной позой и может принимать любую промежуточную позу. Чтобы поддерживать различные размеры объектов, начальная поза должна быть полностью открытой, способной захватывать максимально большой объект, а конечная поза — полностью закрытой, позволяющей захватывать наименьший возможный объект. Любой объект промежуточного размера может использовать ту же позу, но с другим значением смешивания, управляемым ползунком.
Смешивание поз с авторскими манипуляциями с использованием обычных поз захвата
Во время разработки стало понятно, что многие объекты захватываются с использованием общих поз из известного набора. Единственная разница заключалась в том, что хват был более открытым или закрытым в зависимости от размера объекта.
Было решено создать новый тип позы, называемый позой смешивания, который определяется начальной позой и конечной позой и может принимать любую промежуточную позу. Чтобы поддерживать различные размеры объектов, начальная поза должна быть полностью открытой, способной захватывать максимально большой объект, а конечная поза — полностью закрытой, позволяющей захватывать наименьший возможный объект. Любой объект промежуточного размера может использовать ту же позу, но с другим значением смешивания, управляемым ползунком.
В то время как фиксированные позы обычно используются для жестов рук и специальных захватов, смешанные позы были чрезвычайно полезны для разработки захватов, которые можно было бы повторно использовать для множества различных объектов.
Смешанные позы также оказались полезными для объектов, захват которых может меняться, например, при нажатии на курок пистолета или нажатии кнопки на интерактивном устройстве, удерживая его.
Настраиваемые руки
Создание разных наборов рук для каждого программного обеспечения, которое разрабатывалось, было бы очень трудоемкой задачей. В конкретном случае с двумя развлекательными приложениями компания использовала специальную установку; но для большинства обучающих приложений всегда придерживались одних и тех же основных активов. Это позволило повторно использовать позы, такие как жесты рук или общие позы смешивания, описанные в предыдущем разделе.
Разработчики компании по-прежнему хотели, чтобы руки в каждом приложении выглядели по-разному. Для этого они создали риг, который может переключаться между кожей и перчатками и иметь возможность настраивать любой из них. Преимущество этого заключается в том, что вы можете повторно использовать позы, но при этом иметь другой набор рук в новых проектах.
Визуальная сторона также часто определяется требованиями клиента или проектным документом видеоигры. В некоторых тренировочных приложениях вы начинаете с голыми руками, и одним из первых шагов является надевание средств защиты, таких как перчатки. Это уже означает, что вы либо показываете особенности кожи, либо решаете скрыть их, например, с помощью призрачного шейдера.
Приложение VR также может позволить вам настроить цвет кожи и размер руки. Поддержка более чем одного размера руки может быть очень важной, потому что в некоторых сценариях, где вы представляете себя, например, в реалистичном приложении виртуальной реальности для совместной работы или учебном приложении, наличие другого размера руки может нарушить погружение.
Чтобы избежать поддержки только одного размера (который во многих приложениях, как правило, представляет собой большую мужскую руку), мы решили поддерживать два размера рук: большие руки и маленькие руки. Руки взрослых в основном можно сгруппировать в любую из этих двух групп.
В будущем можно было бы добавить возможность процедурного изменения размеров рук, но на данный момент это лучший компромисс между инклюзивностью, гибкостью и требуемыми усилиями.
Гибкость редактора GrabbableObject
За исключением программирования, большая часть времени при создании взаимодействий уходит на создание поз для захвата и редактирование объектов, которые можно захватить. Захватываемые объекты настраиваются с помощью компонента GrabbableObject, сообщающего о том, как ведет себя объект, и об одной или нескольких точках, из которых объект может быть захвачен.
Наличие хорошего редактора GrabbableObject очень полезно для минимизации времени, необходимого для того, чтобы сделать объект доступным для захвата. Но после разработки множества различных VR-приложений было очень сложно сделать все правильно. Разработчики часто доходили до этого момента:
- Приложению требуется новый параметр манипулирования для объекта, поскольку текущий список параметров не поддерживает такое поведение.
- Компонент стал более гибким, новый параметр доступен для редактирования.
- Чем больше параметров выставлено, тем более загроможденным становится пользовательский интерфейс и тем труднее его использовать.
- В какой-то момент это становится слишком сложным, неинтуитивным, и первоначальная цель по снижению времени выполнения работ не достигается.
Это ожидаемо. В конце концов, манипуляция — чрезвычайно сложный процесс, и есть сотни вещей, которые вы можете делать с объектом. Больше не нужно нажимать X на панели управления, чтобы «использовать» объект, теперь все дело в том, чтобы находиться внутри мира и использовать свои собственные руки для манипулирования объектами. Возможности безграничны.
В этих случаях большую часть новых функций можно сгруппировать в две основные категории:
- Как происходит захват объекта. Например, возможность схватить палку, используя любое возможное положение и угол, в обоих направлениях.
- Как ведет себя объект. Например, ручка на панели управления, которую можно повернуть в четыре разных положения.
Решение этой проблемы заключалось в создании прочной базы GrabbableObject и архитектуры для расширения функциональности с использованием двух типов компонентов специализации.
- GrabPointShape: расширяет отдельные точки захвата на объекте до известных форм, которые делают захват более гибким. Например, к лому можно добавить форму цилиндра, чтобы теперь можно было использовать единую точку захвата по умолчанию по всей длине и под любым углом. Другим примером может быть форма коробки, так что книгу можно взять за произвольную точку с любой из 4 сторон, а не за одну точку.
- SpatialControl: добавляет функциональность специализации, беря на себя управление некоторыми параметрами в GrabbableObject и добавляя новое поведение. Например, компонент Knob будет скрывать все параметры GrabbableObject, которые позволяют редактировать ограничения вращения, управлять ими и добавлять поведение для привязки к различным позициям при вращении ручки.
Эта новая архитектура оказалась очень ценной, поскольку функциональность теперь хорошо разделена. Дополнительным преимуществом этого является упрощение пользовательских интерфейсов, поскольку эти компоненты специализации будут скрывать гораздо больше параметров от GrabbableObject, чем они открывают для своего собственного компонента. И их намного легче понять, потому что они напрямую связаны со специализированными функциями, а не являются общими.
– – – – –
Это был важный опыт, который помог сократить время разработки и заложить прочную основу, которую можно расширить в будущем. Надеемся, что эти мысли помогут прояснить внутреннюю работу приложений виртуальной реальности. Возможно, они также могут вдохновить других разработчиков виртуальной реальности, работающих над аналогичной технологией, или даже заставить их задуматься об использовании UltimateXR в своих проектах.