
Подводные камни Learned Motion Matching: опыт реализации
dagerd 2 минуты назад Подводные камни Learned Motion Matching: опыт реализации Средний 8 мин 1 Машинное обучение * Компьютерная анимация * Разработка игр * Unreal Engine * Туториал Автор: Георгий Маркелов, разработчик...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: dagerd 2 минуты назад Подводные камни Learned Motion Matching: опыт реализации Средний 8 мин 1 Машинное обучение * Компьютерная анимация * Разработка игр * Unreal Engine * Туториал Автор: Георгий Маркелов, разработчик SoftellionВ прошлой статье я сделал обзор на существующие на данный момент методы реализации анимации персонажей с применением машинного обучения. Однако существует ряд нераскрытых приемов, без которых финальный результат будет неудовлетворительным. В этой статье я поделюсь опытом реализации Learned Motion Matching.
ПредисловиеВсе формулы справедливы для левосторонней (left‑handed) системы координат:Кватернионы хранятся в формате (скаляр на последнем месте)Quaternion unrollПоскольку один и тот же угол может быть представлен двумя кватернионами и , может получиться так, что появляются сильные разрывы в данных (-179 и + 181 образуют одинаковый поворот) и одна и та же поза (или похожие) кодируется совершенно по-разному. При обучении нейросети это совершенно теряет всякий смысл, и при попытке интерполяции таких противоположных значений также не выйдет ничего хорошего. Поэтому необходимо сделать разворот кватерниона:def unroll(x): y = x.
Технические детали
clone() for i in range(1, len(x)): d0 = torch. sum( y * y, dim=-1) d1 = torch. sum(-y * y, dim=-1) y = -y return yСуть в том, что, если скалярное произведение с кватернионом с предыдущего кадра отрицательное, то его нужно развернуть.
В таком случае на протяжении всей последовательности будет соблюдаться условие . Наглядный пример значений компонентов кватерниона до и после разворота:После разворота кватернионов следующей важной задачей становится создание новой искусственной кости, описывающей траекторию движения — root transformation. Root transformationЭта кость может быть как создана вручную, например в Blender, так и сгенерирована процедурно, но присутствовать должна обязательно — в противном случае весь алгоритм не работает.
При ее создании важно помнить, что она должна как можно более точно передавать характер движения персонажа. После добавления делается корневой для всего скелета. Позиция находится так: проецируем верхнюю кость позвоночника на землю и добавляем сглаживающий фильтр Савицкого-Голея:from scipy import ndimage, signal g_pos, g_rot = quat_utils.
Отраслевые последствия
fk(y_pos, y_rot, parents) # forward kinematics sim_bone_pos = torch. savgol_filter(g_pos * torch. 0)), 31, 3, axis=0, mode='interp На датасете со спокойной ходьбой данный фильтр может давать разницу в ~0.
6 метра между исходной и сглаженной позицией, что довольно внушительно. Затем берем направление «вперед» кости бедра, проецируем на землю и также сглаживаем фильтром. После чего конвертируем во вращение вокруг вертикальной оси — так вычисляется вращение кости.
Также применяем фильтр Савицкого-Голея:# direction taken from projected hip forward direction # 0. 0 is local up axis sim_bone_dir = (torch.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





