2013-08-17 29 views
2

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

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

Animated stickman

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

Исчисление кости специфической абсолютной и относительной матрицы анимации (на основе моих данных ключевого кадра матрицы):

 if (b == this->root) { 
       b->absoluteMatrix = M; 
      } else { 
       b->absoluteMatrix = b->parent->absoluteMatrix * M; 
      } 

      b->skinningMatrix = b->absoluteMatrix * inverse(b->offsetMatrix);  

      if (this->currentAnimationTime == 0) { 
       cout << "Bone '" << b->name << "' skinningMatrix:\n"; 
       printMatrix(b->skinningMatrix); 

       cout << "Bone '" << b->name << "' absoluteMatrix:\n"; 
       printMatrix(b->absoluteMatrix); 

       cout << "Bone '" << b->name << "' offsetMatrix:\n"; 
       printMatrix(b->offsetMatrix); 

       cout << "---------------------------------\n"; 
      } 

skinningMatrix, которые я отправляю в ГПУ. Это печатает следующее:

output from debugging

где offsetMatrix является преобразование, которое переходит из сетки пространства костным пространства в затруднительной позе.

В моем шейдере я тогда делать:

layout(location = 0) in vec4 v; // normal vertex data 
newVertex = (skinningMatrix[boneIndex.x] * v) * weights.x; 
newVertex = (skinningMatrix[boneIndex.y] * v) * weights.y + newVertex; 
newVertex = (skinningMatrix[boneIndex.z] * v) * weights.z + newVertex; 

Любые намеки на то, что может быть не так с моими расчетами?

+1

Биты, которые вы опубликовали, выглядят хорошо. Не могли бы вы подробнее рассказать о том, как вы вычисляете 'offsetMatrix'? Вы проверили, что 'skinningMatrix' - это единичная матрица, когда ваш персонаж находится в привязке? Сумма «весов» всегда равна 1? Это работает, если вы используете только одну кость за вершину? –

+0

Анимация руки работает правильно. Сама рука находится не в том месте. Смещение-матрица захватывается для каждой кости из импорта ASSIMP, который документируется как «offsetMatrix - это преобразование, которое преобразуется из пространства сетки в пространство костей в позе привязки». Я конвертирую его из aiMatrix4x4 в glm :: mat4. Я смотрю на мою skinningmatrix во время = 0, и это не единичная матрица. Если я хочу вычислить матрицу bindpose, я бы просто захватил absoluteMatrix во время 0? Или инициализация? – toeplitz

+0

Я добавил в сообщение вывод отладки, если он может помочь. – toeplitz

ответ

0

В настоящее время я работаю через скелетную анимацию, и единственное, что я заметил, которое может быть проблемой, - это то, как вы используете матрицу смещения от ASSIMP. Матрица, о которой идет речь, представляет собой матрицу, которая «трансформируется из пространства сетки в пространство костей в позе связывания».

Насколько мне известно, эта матрица предназначена для использования как «как есть», которая по существу приведет ваши вершины к местному пространству костей, которые вы будете умножать на «новую» глобальную суставную позу, которая будет принимать вершины от пространства костей до пространства модели.

Когда вы инвертируете матрицу, вы снова преобразуете вершины в пространство модели , а не с вашими текущими кадрами анимации глобальной совместной позы, продвигая вершины еще дальше.

Я считаю, что ваше решение будет состоять в том, чтобы удалить инвертирующую вашу матрицу смещения, что приведет к тому, что ваши вершины перейдут от «model-joint-model».

Смежные вопросы