Конвертировать 3D Скелет Системы DirectX

Я пытаюсь конвертировать два разных скелетных формата. У меня есть иерархический скелет.

Теперь в одном формате матрица данного узла вычисляется с помощью (DirectX) (с точностью,
от нижнего узла к верху, где matScale / matRotate / matTranslationFromParent являются конкретными узлами SRT):

appliedMatrices = appliedMatrices * matScale * matRotate * matTranslationFromParent;

Но мне нужно преобразовать его в формат, который использует (рекуперативно, от нижнего узла к верху, где translationIn — это векторное вычитание (ParentPos — EndPartPos), а translation out — (EndPartPos — ParentPos), а именноmatmatle / matRotate / matTranslationFromParent именно такие узлы СТО):

appliedMatrices = appliedMatrices * matScale * matTranslationOut * matRotate * matTranslationIn * matTranslationFromParent;

Как мне конвертировать из первого формата во второй скелетный формат (и обратно)?

0

Решение

Если мы сравним две версии, мы увидим, что следующие две части должны совпадать:

matRotate1 * matTranslationFromParent1
= matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2

поскольку matRotate1 а также matRotate2 являются единственными поворотами, эти два должны быть равны. Итак, это просто:

matRotate1 = matRotate2

Затем для двух преобразований остается только одно неизвестное:

//conversion 1 -> 2
matTranslationFromParent2 = (matTranslationOut * matRotate2 * matTranslationIn)^-1 * matRotate1 * matTranslationFromParent1
//conversion 2 -> 1
matTranslationFromParent1 = matRotate1^-1 * matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2

Если производительность критична, вы можете выполнять эти вычисления только для векторов трансляции, а не для всех матриц.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]