Анимация с костями.

Я делаю простую библиотеку анимации костей, но в какой-то момент застрял.

Что у меня есть: Меш с несколькими прикрепленными к нему костями с анимацией. Сетка правильно скинирована. Это файл 3d studio max.

Что я делаю:

  1. Я экспортирую этот скелетный меш с помощью своего плагина. Я беру первый кадр анимации и умножаю каждую вершину на эту матрицу (псевдокод)

    Matrix invertedBoneMatrix = ZeroMatrix;
    invertedBoneMatrix += bone1WorldTransform * weight1;
    invertedBoneMatrix += bone2WorldTransform * weight2;
    invertedBoneMatrix += bone3WorldTransform * weight3;
    invertedBoneMatrix += bone4WorldTransform * weight4;
    invertedBoneMatrix.Invert();
    
    foreach (vertex)
       vertex = invertedBoneMatrix * vertex;
    
  2. Когда я загружаю эту модель в свой движок, я вычисляю преобразования мира для каждой кости в каждом кадре анимации и умножаю каждую вершину на соответствующие преобразования мира костей с соответствующими весами.

Проблема: Только первый кадр выглядит нормально, остальные кадры искажены.

Возможно, у меня где-то в коде есть ошибки, но я хочу знать, правильный ли мой подход - привести все вершины в локальное пространство соответствующих им костей.


person majakthecoder    schedule 10.09.2014    source источник
comment
Зачем вообще инвертировать сгенерированную матрицу? Обычно преобразования костей выполняются вперед, поэтому я не понимаю, почему вы хотите инвертировать его. Правостороннее умножение вершин предполагает, что вы на самом деле имели в виду транспонировать матрицу (в зависимости от того, используете ли вы основной порядок строк или столбцов, вам может потребоваться поменять местами порядок умножения или добавить туда некоторую транспозицию ). В любом случае, что-то с инверсией здесь не имеет смысла.   -  person datenwolf    schedule 10.09.2014
comment
@datenwolf Я думаю, мне нужно умножить на обратную матрицу, чтобы привести вершины к локальному пространству костей. Это объясняется в первом ответе здесь: stackoverflow.com/questions/17127994/   -  person majakthecoder    schedule 10.09.2014
comment
А, теперь я вижу, в чем твоя проблема. В тех вопросах и ответах, которые вы связали, применяется обратное преобразование, чтобы компенсировать любую нейтральную позу, с которой была настроена ваша модель, перед применением анимации. Вот почему первый кадр вашей анимации выглядит хорошо: по сути, вы приводите модель в нейтральную позу, прежде чем можно будет применить фактические преобразования анимации. Я немного заржавел в определениях 3DSMax, но каждый формат модели использует немного другую цепочку преобразования, и вы должны дважды проверить, соответствует ли то, что вы делаете, семантике 3DS.   -  person datenwolf    schedule 10.09.2014
comment
Но почему первый кадр хорош, а другие нет? Когда в моем шаге (1) я использую кадр из середины во время экспорта, то во время анимации это единственный кадр, который выглядит нормально.   -  person majakthecoder    schedule 10.09.2014
comment
Трудно сказать, не видя остальной код.   -  person datenwolf    schedule 10.09.2014