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

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

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

спасибо!

16
задан clamp 22 June 2010 в 13:19
поделиться

4 ответа

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

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

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

4
ответ дан 30 November 2019 в 16:00
поделиться

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

18
ответ дан 30 November 2019 в 16:00
поделиться

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

15
ответ дан 30 November 2019 в 16:00
поделиться

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

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

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

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

4
ответ дан 30 November 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: