Расчет окончательной трансформации костей для скелетной анимацииC#

Место общения программистов C#
Ответить
Anonymous
 Расчет окончательной трансформации костей для скелетной анимации

Сообщение Anonymous »

У меня есть простая модель с простой скелетной структурой, которую я создал в блендере. Вот как это выглядит:

Изображение


А вот иерархия в блендере:

[img]https://i.sstatic .net/Le3Un.png[/img]


Как видите, у него две кости: одна, которая доходит до середины прямоугольного прямоугольника («Кость»), то есть полностью стационарный. И еще одна кость («Bone.001»), которая идет от середины вверх и вращается.

Я импортировал сетку с помощью AssImpNet и извлекли ключи вращения, масштабирования и положения из каналов узла анимации. Когда я применяю эти преобразования к сетке, я получаю следующий результат (раскрашенный в зависимости от веса кости):

[img]https://i .sstatic.net/urCrO.gif[/img]


Кажется, что движение/анимация воспроизводятся правильно, поэтому я считаю, что эта часть работает правильно. Вот тут-то мое понимание начинает разрушаться, но я считаю, что самая важная часть, которую мне не хватает, — это вычисление «позы обратного связывания» (я видел несколько названий для нее) и применение ее к трансформациям костей, которые я также подать в мой шейдер. Но до сих пор мне не удалось найти именно то, что мне нужно извлечь из формата AssImp и умножить, чтобы получить правильное окончательное преобразование. Я нашел только расплывчатые объяснения о перемещении по дереву узлов и «отмене» преобразований из каждого родительского узла или что-то в этом роде.

Вот что я пробовал, но это не похоже на будет работать:

Код: Выделить всё

i thought that, for the base bone ("Bone"), i would need:
- the global inverse transform
- the node transform of the node with name "Bone"
- the rotation/position/scale keys from the animation channel with name "Bone"
- the bone offset from Meshes.Bones.OffsetMatrix from the bone named "Bone"
а затем умножьте их в указанном порядке.

Код: Выделить всё

similarly for "Bone.001":
- the global inverse transform
- the node transform of the node with name "Bone"
- the rotation/position/scale keys from the animation channel with name "Bone"
- the node transform of the node with name "Bone.001"
- the rotation/position/scale keys from the animation channel with name "Bone.001"
- the bone offset from Meshes.Bones.OffsetMatrix from the bone named "Bone.001"
Моя попытка реализовать это (на данный момент жестко запрограммировать индексы, просто чтобы попытаться заставить все работать), обратите внимание, что она использует C#/AssImpNet, поэтому соглашения об именах являются немного отличается от C++/AssImp:

Код: Выделить всё

        // "Bone"
public Matrix4 Bone0Transform(double time)
{
var bone0 = MathUtils.ConvertMatrix(Scene.RootNode.Children[1].Children[0].Transform);

var frame0 = GetTransformedFrame(1, TimeToFrame(1, time));

var global = MathUtils.ConvertMatrix(Scene.RootNode.Transform).Inverted();

var offset0 = MathUtils.ConvertMatrix(Scene.Meshes[0].Bones[0].OffsetMatrix);

var total = global * bone0 * frame0 * offset0;

return total;
}

// "Bone.001"
public Matrix4 Bone1Transform(double time)
{
var bone0 = MathUtils.ConvertMatrix(Scene.RootNode.Children[1].Children[0].Transform);

var bone1 = MathUtils.ConvertMatrix(Scene.RootNode.Children[1].Children[0].Children[0].Transform);

var frame0 = GetTransformedFrame(1, TimeToFrame(1, time));
var frame1 = GetTransformedFrame(2, TimeToFrame(2, time));

var global = MathUtils.ConvertMatrix(Scene.RootNode.Transform).Inverted();

var offset1 = MathUtils.ConvertMatrix(Scene.Meshes[0].Bones[1].OffsetMatrix);

var total = global * bone0 * frame0 * bone1 * frame1 * offset1;

return total;
}
GetTransformedFrame возвращает Matrix4, объединяющий ключи масштаба, вращения и положения для кадра, который соответствует текущему времени, и сам по себе дает результат, который вы можете увидеть на гифке. где поле окрашено в красный/зеленый цвет.

Все это дает мне явно неправильный результат:
[img]https: //i.imgur.com/yMcHCtZ.gif[/img]


Итак, мой вопрос заключается в следующем: неправильно ли я понимаю, как рассчитать окончательные преобразования костей? Если да, то как правильно это сделать?

Подробнее здесь: https://stackoverflow.com/questions/579 ... -animation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»