Unreal Engine 5 и VR с нуля. Часть 12. Передвижение персонажа в VR (locomotion system)

Введение

Видя как передвигается персонаж в таких играх как Blade And Sorcery, BoneWorks, Battle Talent, Contractors, хотелось разобраться, как и какие варианты реализации locomotion system можно реализовать в VR? Видеоуроки направленные конкретно для VR, не раскрывают как подробно реализовать продвинутое передвижение персонажа, какие сложности есть в этом.

Однажды, один пользователь на форуме unreal engine сказал примерно такие слова: "нет разницы VR это или игра от третьего лица или от первого лица, большинство механик реализуются одинаково. Разница лишь в восприятии функционала и небольших особенностях реализации." В целом, я согласен. что так оно и есть, абсолютно все механики можно адаптировать под VR, поэтому я решил адаптировать Locomotion System из проекта Lyra Unreal Engine.

Вероятно, можно просто взять и перенести логику нижней части тела персонажа из проекта Lyra и заставить это работать в VR. Но я не знал как работают анимационные слои, как разделять игровой и анимационный поток в анимационном инстансе. Поэтому я нашел вполне годные уроки.

Так же никто не запрещает взять проект ALS или GameAnimationSample от Unreal Engine (но с нуля там сложно разобраться будет).

Небольшая предыстория в коротком видео: https://www.youtube.com/shorts/phE0y7TSpLE

Уроки по воссозданию Locomotion system из проекта Lyra

Из того что я нашел полезным, могу выделить два плейлиста на ютубе. Всю логику расчетов я переносил в С++.

1. Канал Outcast DevSchool имеет плейлист как с нуля воссоздать передвижение персонажа из Lyra, но он использует свой пак анимаций, который расширяет вариативность движения бедер в разных направлениях.

2. Канал Unreal Shinobi имеет похожий плейлист, использует бесплатные анимации из проекта Lyra. Но в нем было излишество для меня, автор тутора использует GamePlayTag для обозначения состояний передвижения игрока, вещь полезная но в моем случае была излишняя.

Я смотрел оба плейлиста и взял все подходящее для моего проекта.

Стоит обратить внимание на эти каналы:

LocoDev - имеет интересные туториалы по передвижению https://www.youtube.com/@LocoDev

Quinn Kuslich - Advanced Thumbstick Locomotion Tutorial конкретно на VR примере (хочется перенести отсюда VFX для телепорта) https://www.youtube.com/watch?v=KTPx8PeKyQM&t=2030s&ab_channel=QuinnKuslich

Отличия реализации системы передвижения от туторов для VR

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

1. Используем направление камеры, а не Actor Location/Rotation. В VR в основном используют направление камеры для движения персонажа вперед. Это значит, что если ты нажал стик бежать вперед, то куда смотрит камера, туда и будем бежать. В VR камера HMD и капсула должны быть синхронизированы 1 к 1 (об этом вы должны позаботиться чтобы не было рассинхронизации). https://www.youtube.com/shorts/l9l_Nl8uBB4

2. При использовании Orientation Warping (коротко о Orientation Warping), учитываем оба случая - Движение на стик и движение физически от камеры. https://www.youtube.com/shorts/tX__fngNLZA

3. При использовании Stride Warping учитываем скорость при движении от стика и скорость получаемую от физического движения HMD (когда ходим по комнате). https://www.youtube.com/shorts/CxPJ3lQ03-w

Stride Warping позволяет динамически изменять длину шага, потому что анимации бега обычно рассчитаны на скорость 400 см/с, а для анимаций шага 200 см/с. Физический же шаг может быть индивидуальным 40-160 см/с. Демонстрация работы Stride Warping при физическом передвижении по комнате: https://www.youtube.com/shorts/Pxmgqdd03No

4. Используем Dead Blending Node, вместо INERTIALIZATION Node. Я столкнулся с проблемой, что при резкой смене анимации, происходил прыжок ошибочной позы в 1 кадр и это отстреливало в IK верхней части тела. Подробнее о проблеме в видео - https://www.youtube.com/shorts/QGK9naoeV0A

Заключение

Надеюсь эта информация тебе поможет построить свою систему передвижения для проекта.

7
7 комментариев