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

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

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

Спасибо!


person clamp    schedule 22.06.2010    source источник
comment
Как вы сохраняете положение объекта в матрице преобразования? Это камера? Требуется дополнительная информация.   -  person Jacob    schedule 22.06.2010


Ответы (6)


Ознакомьтесь с Матричная анимация и полярная декомпозиция. Основная идея состоит в том, чтобы разбить матрицы преобразования на значимые компоненты, такие как растяжение, вращение и перемещение, а затем интерполировать их.

person brainjam    schedule 24.06.2010

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

person Victor Liu    schedule 26.06.2010

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

вам нужно интерполировать между R0 и R1.

И предлагает сделать это как:

Ri = aR0 + (1-a)R1

Это не сработает, как упомянул Виктор в своем ответе: вы получите перекос и объемные деформации.

математически (в контексте трехмерной геометрии) добавление не имеет особого смысла: что означает добавление двух матриц перевода?

установленное решение состоит в интерполяции как:

Ri = (R1*(инверсия(R0)))^a*R0

где мы определяем R^a как операцию, которая дает нам поворот вокруг вектора [kx, ky, kz] на a*тета градусов.

поэтому при a = 0 Ri = R0; при а = 1 Ri = R1. Это делает интерполяцию на основе умножения, что более естественно в контексте трехмерной геометрии.

Теперь самое сложное — как представить операцию R^a. Оказывается, использование кватернионного представления R позволяет нам представить операцию R^a. на основе статьи Кена Шумейка анимация вращения с помощью кватернионных кривых

person Helin Wang    schedule 02.12.2014

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

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

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

person tfinniga    schedule 22.06.2010

Я предполагаю, что вы спрашиваете, у вас есть объект x, вы применили линейное преобразование A к нему, чтобы получить Ax, и теперь вы хотите преобразовать его так, чтобы он был в том положении, в котором было бы, если бы вы применили другое преобразование B, т.е. преобразовать из Ax в Bx.

Предполагая, что A является обратимым, просто примените BA-1, чтобы получить BA-1(Ax) = Bx

[Изменить] Поскольку вы упомянули перемещение, вместо этого вы можете говорить об аффинном преобразовании. (линейное преобразование с последующим переводом). Если это так, вы хотите перейти
от Ax + C к Bx + D.

Для этого вычтите C (т.е. переместите объект в исходное положение), примените BA-1 и добавьте D< /strong>:
(BA-1((Ax + C) - C)) + D = Bx + D

person BlueRaja - Danny Pflughoeft    schedule 22.06.2010

Исходный код для интерполяции матрицы преобразования с неограниченной лицензией можно найти в проекте WebKit; см. функции под названием «смешивание», которые создают интерполированную матрицу:

для обычных матриц 4 x 4

для шестиэлементных аффинных преобразований, используемых в 2D-графика

Все файлы, включая заголовки, можно найти в папке . прилагаемый каталог.

НО я только что попробовал 2D-аффинный код, и он не сохраняет центр вращения при интерполяции между вращениями. Так что я теперь не уверен, что это полезно.

person Graham Asher    schedule 26.11.2018