Всем привет! Разбираюсь с типами смешивания анимаций и возник вопрос. С режимом смешивания в LocalSpace все довольно просто: локальные позиции суммируются как и локальные повороты в quaternion. Со вторым режимом смешивания уже всё не так очевидно, слышал, что отличается только тем, что повороты как-то суммируются из глобального пространства, а не из локального, но это объяснение не работает на практике, выходит каша. Собственно вопрос заключается в том, какие именно преобразования происходят для этого режима смешивания?
А какой нодой ты смешиваешь анимации? Насколько я знаю у обычного blend только local space. А mesh space смешивание используется для специальных нод типа layered blend per bone, blend by channel и тд., т.к это необходимо для корректного результата. Например смешиваешь анимацию верхней части тела (выше таза) от анимации прицеливания с оружием, а низ от ходьбы. Смешивание по вращению в mesh space в данном случае не позволит верхней части тела дёргаться из-за вращения таза от другой анимации. Mesh space переводит всё в координаты относительно skeletal mesh в твоём контроллере
Я в теории хочу разобраться, чтобы сам мог имплементировать в случае чего логику. С локальным пространством всё понятно. Насчет координат
Mesh space переводит всё в координаты относительно skeletal mesh в твоём контроллере
, т.е. все кости имеют повороты относительно не мирового пространства, а пространства относительно root кости, я правильно понимаю?
Target
> Я в теории хочу разобраться, чтобы сам мог имплементировать в случае чего
> логику
В принципе ничего сложного. Особенно просто, если не делить смещения и кватернионы, а все описывать матрицами трансформации.
Чтобы превратить матрицу преобразований локальных координат в матрицу преобразований меш-координат, надо домножить ее с одной стороны на матрицу преобразования из рутовой кости в локальную, а с другой стороны (со стороны домножения на вертексы) - на обратную.
То есть, если с локальными координатами ты преобразовывал координаты так:
\(V = (\displaystyle\prod_{i=root}^{current} M_{local,i}) \times V_{local}\)
то теперь будешь преобразовывать так
\(V = M_{bone} \times V_{mesh}\)
, где
\(M_{bone} = M_{root\to local} \times M_{local} \times M_{root\to local}^{-1}\)
\(M_{root\to local}\) - матрица перехода от координат рутовой кости к локальной
\(M_{root\to local}^{-1}\) - обратная ей
При этом \(M_{root\to local}\) - произведение всех промежуточных \(M_{local,i}\) между рутовой костью и локальной (то есть, потребует пересчета, если хотя бы одна из промежуточных костей меняет положение/ориентацию).
Если ты хочешь интерполировать углы в координатах локальной кости - естественно, надо интерполировать углы, из которых строится \(M_{local}\), и уже потом из нее снова строить \(M_{bone} = M_{root\to local} \times M_{local} \times M_{root\to local}^{-1}\)
Добро, попробую матрицами сделать, спасибо. Правда я привык больше работать с векторами)
Target
т.е. все кости имеют повороты относительно не мирового пространства, а пространства относительно root кости, я правильно понимаю?
Даже не root кости а самого skeletal mesh component вроде. Это надо проверять.
Кстати для просто смешивания анимаций существ лучше использовать local space, так не будут ломаться локти и колени в смешанной анимации (будут вращаться только по одной оси относительно родительской кости) .
С матрицами я знаком не очень хорошо, хотелось бы реализовать на квартенионах. На матрицах у меня не вышло сделать.
Нашел код UE отвечающий за MeshSpace:
Процесс на три операции разделяется:
1)FAnimationRuntime::ConvertPoseToMeshRotation - Всё просто
2)FTransform::BlendFromIdentityAndAccumulate - можно подумать. что тут просто перемножение скейла и квартениона и суммирование локальных координат, но как бы не так, попытался повторить но "фиг там плавал", либо я в глаза уже долблюсь и накосячил у себя на ровном месте где-то)
3)FAnimationRuntime::ConvertMeshRotationPoseToLocalSpace - Тоже всё просто
Пфф, ларчик открывался просто, даже без матриц, для меш спейса единственное отличие было в преобразовании квартенионов а не работало потому что накосячил у себя. Вопрос закрыт.
Тема в архиве.