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
Заключение
Надеюсь эта информация тебе поможет построить свою систему передвижения для проекта.