Матрица поворота из одного вектора в другой в 2D

Рассчитать матрицу поворота из одного вектора в другой в 2D пространстве нам может понадобиться, например, при работе с UV – картами развертки. Часто это бывает нужно, чтобы подогнать один UV-остров развертки под другой.

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

Угол считается в радианах.

Затем нам нужно понять, в какую сторону нужно осуществить поворот. В 2D пространстве может быть два варианта – изначальный вектор расположен “выше” второго, тогда нам нужно вращать против часовой стрелки, или, если он “ниже” – вращать нужно по часовой стрелке.

Направление вращения нам может дать знак векторного произведения двух исходных векторов.

Векторное произведение двух векторов в 2D пространстве – число, знак которого указывает на поворот, который как раз нам и нужен.

Если это число меньше нуля – поворот по часовой стрелке. Если число больше нуля – вращать нужно против часовой стрелки.

В итоге, регулировать направление поворота мы можем задавая знак для полученного угла поворота.

Теперь, используя метод Rotation() объекта Matrix из модуля mathutils, мы можем получить матрицу поворота.

В первом параметре метода мы передали полученный угол поворота. Во втором – размер матрицы 2 на 2, именно такая матрица нам нужна для вращения в 2D пространстве. В третьем параметре мы передаем ось вращения “Z”, которая всегда будет направлена перпендикулярно плоскости экрана.

Соберем все в одну функцию.

Проверим, как работает наша функция на примере поворота острова UV развертки.

Например, пусть остров расположен вертикально, а нам нужно повернуть его параллельно другому острову, который расположен под углом в 45 градусов.

Тогда исходный и конечный вектора для поворота будут следующими:

На основе этих векторов получим матрицу поворота, вызвав нашу функцию.

Переключимся на объект bmesh и получим указатель на текущий активный слой развертки.

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

И вернем обновленные данные из bmesh обратно в текущий меш сцены.

Как мы видим, весь выделенный остров развертки повернулся точно как нам требуется – параллельно другому острову.

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

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