3D-геометрия: как интерполировать матрицу

i сохраняет позицию объекта в 3d пространстве в матрице преобразования 4by4. теперь, чтобы переместить объект из положения, хранящегося в матрице A, в позицию, сохраненную в матрице B, я хотел бы их интерполировать.

поэтому я просто делаю это путем интерполяции каждого из 16 значений в матрице или мне нужно что-то особенно заботиться?

спасибо!

Ответы

Ответ 1

Отъезд Ken Shoemake и Tom Duff Матричная анимация и полярное разложение. Основная идея состоит в том, чтобы разбивать матрицы преобразований на значимые компоненты, такие как растяжка, поворот и перевод, а затем интерполировать их.

Ответ 2

Если вы интерполируете все 16 записей вашей матрицы, результат будет выглядеть странно, поскольку интерполированные матрицы не будут жесткими преобразованиями (вы получите искажения и деформации объема). Правильное дело - выделить перевод и поворот/масштабирование, предоставив вам вектор трансляции T и матрицу вращения 3x3 R (это работает только в том случае, если ваш оригинальный 4x4 представляет собой жесткое преобразование). Затем возьмем разложение на собственные значения 3x3 R = Q'DQ (средство tick означает транспонирование), давая вам ортогональное Q и диагональное масштабирование D. Теперь вы линейно интерполируем T и D, а slerp столбцы Q, а затем вы снова соберите матрицу.

Ответ 3

Я предполагаю, что вы спрашиваете, у вас есть объект 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

Ответ 4

Простое интерполирование значений матрицы, вероятно, не даст вам то, что вы хотите, только если вы делаете очень простые преобразования (например, перевод или масштабирование).

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

Вы также можете просто сделать до и после преобразования, а затем закрепить вершины объекта. Это также может не дать вам результатов, которые вы после.

Ответ 5

позвольте мне перефразировать ваш вопрос:

вам нужно интерполировать между 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. основанный на бумаге Кена Шомейка анимация вращения с кривыми кватернионов