SLERP и интерполяция скелетной анимации! - PullRequest
2 голосов
/ 28 апреля 2011

У меня в моей программе работала скелетная анимация, но я интерполировал матрицы 4x4 , хранящиеся для каждой кости между кадрами, линейным образом, т.е.


bMatrix bMathbMathInterpolate(bMatrix const * const p_a,bMatrix const * const p_b, float p_delta)
{
    bMatrix l_mat;

   for(unsigned char i = 0;i lessthan (edit: sorry less than symbol break it) 16;i++)
         l_mat.m_values[i] = bMathInterpolate(p_a->m_values[i], p_b->m_values[i], p_delta);

   return l_mat;
}

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

Итак, я создал отдельный алгоритм интерполяции, который преобразует только матрицу вращения матрицы 4x4 в кватернион, выполняет SLERP и заменяет только вращающуюся часть матрицы с матричной версией кватерниона. Для части перевода матрицы я просто интерполировал ее линейным способом.

Глядя на результаты, это явно неправильно !!! : '(

Если вы понимаете все это очень хорошо (в отличие от меня), вы, вероятно, думаете: «Нет! Это не то, как вы это делаете!» - если так, пожалуйста, скажите мне, что я делаю не так !!

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

Любая помощь будет высоко ценится !!!!

1 Ответ

2 голосов
/ 28 апреля 2011

Вы должны быть в состоянии преобразовать компонент перевода матриц в векторы, а затем линейно интерполировать их, а затем преобразовать компонент вращения в кватернион, а также выполнить slerp (или lerp, или nlerp) их, а затем рекомбинировать полученный вектор и кватерион обратно в матрицу.

...