
А вот иерархия в блендере:
[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"
Код: Выделить всё
// "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;
}
Все это дает мне явно неправильный результат:
[img]https: //i.imgur.com/yMcHCtZ.gif[/img]
Итак, мой вопрос заключается в следующем: неправильно ли я понимаю, как рассчитать окончательные преобразования костей? Если да, то как правильно это сделать?
Подробнее здесь: https://stackoverflow.com/questions/579 ... -animation
Мобильная версия