Ответ 1
Отъезд Ken Shoemake и Tom Duff Матричная анимация и полярное разложение. Основная идея состоит в том, чтобы разбивать матрицы преобразований на значимые компоненты, такие как растяжка, поворот и перевод, а затем интерполировать их.
i сохраняет позицию объекта в 3d пространстве в матрице преобразования 4by4. теперь, чтобы переместить объект из положения, хранящегося в матрице A, в позицию, сохраненную в матрице B, я хотел бы их интерполировать.
поэтому я просто делаю это путем интерполяции каждого из 16 значений в матрице или мне нужно что-то особенно заботиться?
спасибо!
Отъезд Ken Shoemake и Tom Duff Матричная анимация и полярное разложение. Основная идея состоит в том, чтобы разбивать матрицы преобразований на значимые компоненты, такие как растяжка, поворот и перевод, а затем интерполировать их.
Если вы интерполируете все 16 записей вашей матрицы, результат будет выглядеть странно, поскольку интерполированные матрицы не будут жесткими преобразованиями (вы получите искажения и деформации объема). Правильное дело - выделить перевод и поворот/масштабирование, предоставив вам вектор трансляции T и матрицу вращения 3x3 R (это работает только в том случае, если ваш оригинальный 4x4 представляет собой жесткое преобразование). Затем возьмем разложение на собственные значения 3x3 R = Q'DQ (средство tick означает транспонирование), давая вам ортогональное Q и диагональное масштабирование D. Теперь вы линейно интерполируем T и D, а slerp столбцы Q, а затем вы снова соберите матрицу.
Я предполагаю, что вы спрашиваете, у вас есть объект x, вы применили линейное преобразование A, чтобы получить Ax, и теперь вы хотите преобразовать его таким образом, чтобы он находился в том положении, в котором он был бы, если бы вы применили другое преобразование B т.е. преобразуется из Ax в Bx.
Предполагая, что A invertible, просто примените BA -1, чтобы получить BA -1 (Ax)= Bx
[Изменить]. Поскольку вы упомянули перемещение, вы можете вместо этого говорить о аффинном преобразовании (линейное преобразование а затем перевод). Если это так, вы хотите переместить
от Ax + C до Bx + D.
Чтобы сделать это, вычтите C (т.е. переместите объект в начало координат), примените BA -1 и добавьте D:
(BA -1 ((Ax + C) - C)) + D= Bx + D
Простое интерполирование значений матрицы, вероятно, не даст вам то, что вы хотите, только если вы делаете очень простые преобразования (например, перевод или масштабирование).
Я думаю, что есть методы, которые разлагают матрицу на перевод, вращение, масштабирование и т.д., а затем вы можете создавать новые матрицы, которые интерполируют на основе этих параметров.
Вы также можете просто сделать до и после преобразования, а затем закрепить вершины объекта. Это также может не дать вам результатов, которые вы после.
позвольте мне перефразировать ваш вопрос:
вам нужно интерполировать между R0 и R1.
И предлагая сделать это как:
Ri = aR0 + (1-a) R1
Это не сработает, как сказал победитель в своем ответе: вы получите искажения и деформации объема.
математически (в контексте 3D-геометрии), добавление не имеет большого смысла: что означает добавление двух матриц перевода?
установленное решение состоит в том, чтобы интерполировать как:
Ri = (R1 * (обратное (R0))) ^ a * R0
где мы определяем R ^ a как операцию, которая дает нам поворот вокруг вектора [kx, ky, kz] на a * theta degrees.
поэтому, когда a = 0, Ri = R0; когда a = 1, Ri = R1. Это делает интерполяцию на основе умножения, что более естественно в контексте 3D-геометрии.
Теперь трудная часть того, как представить операцию R ^ a. Оказывается, используя представление кватерниона из R позволяет нам представить операцию R ^ a. основанный на бумаге Кена Шомейка анимация вращения с кривыми кватернионов