Для того, чтобы манипулировать трансформациями объектов при помощи матриц в Blender включен модуль “mathutils” в котором определен класс “Matrix”. С помощью этого класса можно удобно создавать нужные матрицы трансформаций – перемещения, поворота и масштаба.
Для создания матрицы масштабирования используется следующая команда:
1 2 3 |
from mathutils import Matrix scale_matrix = Matrix.Scale(SCALE_VALUE, MATRIX_SIZE, AXIS) |
где:
SCALE_VALUE – множитель. во сколько раз нужно изменить масштаб при помощи получаемой матрицы
MATRIX_SIZE – размер получаемой матрицы
AXIS – вектор, определяющий по каким осям будет производится масштаб
Например для создания матрицы увеличения масштаба в 2 раза по оси X, нужно вызвать:
1 |
scale_matrix_x2 = Matrix.Scale(2, 4, (1.0, 0.0, 0.0)) |
Выглядит все просто, однако у данного метода есть одна неочевидная особенность.
Если нужно создать матрицу изменения масштаба по всем трем осям одновременно, кажется логичным при вызове данного метода указать в последнем параметре “AXES” сразу все необходимые оси:
1 |
scale_matrix_all2 = Matrix.Scale(2, 4, (1.0, 1.0, 1.0)) |
Однако такой вызов на дает желаемого результата, получаемая матрица не корректна!
Для того, чтобы создать матрицу масштабирования по всем трем осям одновременно, нужно создать отдельно матрицы масштабирования по каждой из осей и затем перемножить их между собой:
1 2 3 4 |
scale_matrix_x2 = Matrix.Scale(2, 4, (1.0, 0.0, 0.0)) scale_matrix_y2 = Matrix.Scale(2, 4, (0.0, 1.0, 0.0)) scale_matrix_z2 = Matrix.Scale(2, 4, (0.0, 0.0, 1.0)) scale_matrix_xall = scale_matrix_x2 @ scale_matrix_y2 @ scale_matrix_z2 |
В результате мы получаем правильную матрицу для масштабирования по трем осям.