Как получить промежуточную матрицу трансформации из имеющейся

При повороте или перемещении объекта с помощью матриц трансформации, в ряде случаев нам нужно иметь возможность выделить из целого поворота/перемещения его часть. Например, поворачивая объект на 180 градусов, нам нужно повернуть его  не сразу, а в несколько приемов, каждый раз поворачивая его, допустим на 30 градусов. Помочь с этим нам может линейная интерполяция матриц.

Для начала создадим полную матрицу трансформации, например, пусть это будет матрица поворота объекта на 180 градусов.

Определить матрицу поворота на заданное число градусом можно при помощи библиотеки mathutils.

Объект mathutils.Matrix имеет функцию Rotation. Эта функция возвращает матрицу поворота, принимая в параметрах угол поворота и ось, вокруг которой производится вращение.

Здесь мы передали в функцию угол в радианах, равный 180 градусам, и указали ось вращения – Z. Второй параметр функции отвечает за размер получаемой матрицы, мы указали его равным 4, и соответственно получили в итоге матрицу размером 4×4.

Мы можем для наглядности применить эту матрицу к текущему активному объекту и убедиться, что он поворачивается на 180 градусов вокруг оси Z.

В нашем примере мы знаем, что наша матрица поворачивает объект на 180 градусов. Мы можем легко подсчитать, что, например, для поворота объекта в три приема нам будет нужна промежуточная матрица, поворачивающая объект на 60 градусов.

Но как быть, если мы не знаем на сколько именно градусов поворачивает объект наша матрица? Такое может быть, например, при вычислении поворота из одного вектора в другой. А повернуть объект нам все равно нужно за три раза.

В этом случае мы можем просчитать для нашей матрицы линейную интерполяцию. Линейная интерполяция – это нахождение промежуточного значения между двумя точками, заданными одной функцией.

Интерполяция может считаться между двумя матрицами.

В нашем случае за стартовую матрицу, от которой мы будем считать интерполяцию, мы можем взять единичную матрицу поворота. Такая матрица не поворачивает объект, но может служить исходной точкой расчетов.

За конечную матрицу мы возьмем имеющуюся у нас матрицу поворота на 180 градусов.

Для нахождения промежуточной матрицы, поворачивающей объект на одну треть относительно полной матрицы (180 * 1/3  = 60) мы будем использовать функцию lerp объекта Matrix.

Здесь мы взяли стартовую матрицу, взывали ее функцию lerp, в параметрах которой указали полную матрицу и требуемую часть поворота от нее.

В результате мы получили матрицу поворота на 60 градусов.

Применив ее к текущему активному объекту,

Мы можем визуально убедиться, что он повернулся именно на 60 градусов вокруг оси Z.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии