3d геометрия: как интерполировать матрицу - PullRequest
16 голосов
/ 22 июня 2010

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

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

спасибо!

Ответы [ 6 ]

18 голосов
/ 24 июня 2010

Проверьте Кена Шумейка и Тома Даффа Матричная анимация и полярное разложение .Основная идея состоит в том, чтобы разбить матрицы преобразования на значимые компоненты, такие как растяжение, вращение и перемещение, а затем интерполировать их.

15 голосов
/ 26 июня 2010

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

4 голосов
/ 02 декабря 2014

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

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

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

Ri = aR0 + (1-a) R1

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

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

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

Ri = (R1 * (обратный (R0))) ^ a * R0

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

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

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

4 голосов
/ 22 июня 2010

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

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

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

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

4 голосов
/ 22 июня 2010

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

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

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

0 голосов
/ 26 ноября 2018

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

для общих матриц 4 x 4

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

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

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

...