Налаштування інверсної кінематики (IK) для аватарів користувачів в VR
Завдання – взяти три точки даних (голова, ліва рука, права рука) та з них отримати переконливе тіло. Це Full Body IK для VR-аватара: три tracking points від гарнітури та контролерів мають drive весь скелет так, щоб аватар виглядав живим, а не дерев'яним манекеном з руками в правильних позиціях.
Це на гумівку нетривіальна завдання.
Три джерела даних і що з ними робити
З headset приходять: XRNode.Head (позиція та ротація HMD), XRNode.LeftHand, XRNode.RightHand. З позиції голови та рук потрібно відновити позицію таза, позвоночника, плечей, ліктів, ніг.
Таз – апроксимується від позиції голови з фіксованим offset вниз. Проблема: коли гравець нахиляється, цей offset працює неправильно – таз "пливе" вперед неестетично. Правильне рішення – згладжувати позицію таза щодо історії руху голови та використовувати вторинну евристику: якщо висота позиції голови зменшилась на X см – гравець присів, зміщуємо таз вниз та вперед.
Плечі – відновлюються з ротації голови та позицій кистей. Якщо голова повернута вправо та права рука піднята – праве плече має піднятися, ліве опуститися. Це реалізується через ChainIK або TwoBoneIK + MultiRotationConstraint в Unity Animation Rigging.
Ліктір – найскладніша частина. Дві відомі точки (плече та запястя) дають нескінченне кількість рішень для ліктя. Потрібен pole target: віртуальна точка, до якої "тягнеться" ліктій. Стандартне рішення – pole target обчислюється з горизонтальної проекції передпліччя з bias вниз-назад. В XR Interaction Toolkit з Animation Rigging – TwoBoneIK Constraint з явним Hint Target.
Реалізація в Unity Animation Rigging
Пакет com.unity.animation.rigging версія 1.1+ – стандарт для цієї завдачи в Unity. Структура rig'а для VR-аватара:
-
Rig Builderна корені персонажа -
Rigоб'єкт з кількома Constraint компонентами -
TwoBoneIKдля кожної руки: Source – кість запястя, Target – VR controller transform, Hint – pole target -
MultiParentConstraintдля шиї/голови: драйвиться від HMD transform -
ChainIKдля позвоночника: від таза до грудей, weight керується нахилом туловища -
TwoBoneIKдля ніг (якщо потрібна foot IK на нерівних поверхнях)
Важливий нюанс: rig вагова система. Кожний Constraint має Weight від 0 до 1. При плавних переходах – наприклад, коли гравець кладе зброю та переходить у locomotion – ваги інтерполюються в коді, щоб уникнути різкого переключення між позами.
Проблеми, з якими стикаються у продакшені
Мерцання при граничних позах. Коли рука гравця заходить за спину або піднімається вище голови, TwoBoneIK переходит у singular position – повністю витягнута цепочка без однозначного рішення. Аватар дергається. Рішення – зажати кут розгибання: заборонити TwoBoneIK повністю розгинатись (максимальний кут 170° замість 180°).
Рассинхронізація рук при високій latency. Якщо аватар рендерится в LateUpdate або з затримкою, руки відстають від реальних контролерів. Руки аватара мають оновлюватись в OnBeforeRender або через XR Interaction Toolkit's late binding механізм.
Calibration під зріст гравця. Offset від голови до таза не універсален: людина ростом 1.90 м та 1.60 м – різні пропорції. У нормальній реалізації є calibration routine: гравець встає прямо, натискає кнопку, система вимірює поточну висоту HMD та перераховує все offset'и.
Терміни налаштування Full Body IK для VR-аватара: від 3 до 7 робочих днів залежно від складності rига та вимог до поведінки. Вартість розраховується індивідуально.





