ПрограммированиеФорумОбщее

MeshSpace vs LocalSpace

#0
18:56, 5 ноя 2022

Всем привет! Разбираюсь с типами смешивания анимаций и возник вопрос. С режимом смешивания в LocalSpace все довольно просто: локальные позиции суммируются как и локальные повороты в quaternion. Со вторым режимом смешивания уже всё не так очевидно, слышал, что отличается только тем, что повороты как-то суммируются из глобального пространства, а не из локального, но это объяснение не работает на практике, выходит каша. Собственно вопрос заключается в том, какие именно преобразования происходят для этого режима смешивания?

#1
1:52, 6 ноя 2022

А какой нодой ты смешиваешь анимации? Насколько я знаю у обычного blend только local space. А mesh space смешивание используется для специальных нод типа layered blend per bone, blend by channel  и тд., т.к это необходимо для корректного результата. Например смешиваешь анимацию верхней части тела (выше таза) от анимации прицеливания с оружием, а низ от ходьбы.  Смешивание по вращению в mesh space в данном случае не позволит верхней части тела дёргаться из-за вращения таза от другой анимации. Mesh space переводит всё в координаты относительно skeletal mesh в твоём контроллере

#2
8:52, 6 ноя 2022

Я в теории хочу разобраться, чтобы сам мог имплементировать в случае чего логику. С локальным пространством всё понятно. Насчет координат

Mesh space переводит всё в координаты относительно skeletal mesh в твоём контроллере

, т.е. все кости имеют повороты относительно не мирового пространства, а пространства относительно root кости, я правильно понимаю?

#3
11:52, 6 ноя 2022

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}\)

#4
13:23, 6 ноя 2022

Добро, попробую матрицами сделать, спасибо. Правда я привык больше работать с векторами)

#5
16:45, 6 ноя 2022

Target

т.е. все кости имеют повороты относительно не мирового пространства, а пространства относительно root кости, я правильно понимаю?

Даже не root кости а самого skeletal mesh component вроде. Это надо проверять.

#6
18:45, 6 ноя 2022

Кстати для просто смешивания анимаций существ лучше использовать local space, так не будут ломаться локти и колени в смешанной анимации (будут вращаться только по одной оси относительно родительской кости) .

#7
0:07, 7 ноя 2022

С матрицами я знаком не очень хорошо, хотелось бы реализовать на квартенионах. На матрицах у меня не вышло сделать.

#8
0:56, 7 ноя 2022

Нашел код UE отвечающий за MeshSpace:

+ Показать

Процесс на три операции разделяется:
1)FAnimationRuntime::ConvertPoseToMeshRotation - Всё просто
2)FTransform::BlendFromIdentityAndAccumulate - можно подумать. что тут просто перемножение скейла и квартениона и суммирование локальных координат, но как бы не так, попытался повторить но "фиг там плавал", либо я в глаза уже долблюсь и накосячил у себя на ровном месте где-то)
3)FAnimationRuntime::ConvertMeshRotationPoseToLocalSpace - Тоже всё просто

#9
19:39, 27 ноя 2022

Пфф, ларчик открывался просто, даже без матриц, для меш спейса единственное отличие было в преобразовании квартенионов а не работало потому что накосячил у себя. Вопрос закрыт.

ПрограммированиеФорумОбщее

Тема в архиве.