October 26, 2024

Матрица 2D Трансформации. Часть 2

Всем хай! Поехали дальше разбираться, с матрицами. Теперь нам нужно совершить одну манипуляцию. Изменить нашу матрицу с 3x3 на матрицe 4x4. Все что было в предыдущей части забудьте применимо и тут.

Матрица для демонстрации.

Изменение размера матрицы нужно для того, чтобы мы могли применять наши значение к матрицам в нюке. Все ноды, которые используют матрицу преобразований(трансформаций) имеют вид 4х4. Почему? Чисто мое предположение. Чтобы иметь возможность конвертировать координаты из 2D в 3D и наоборот. Потому что для матричных преобразований в 3d пространстве используется матрица 4х4. Ладно, хватит теорий и размышлений - "почему?" и "зачем?".

Translate

Изменение положения по ширине (Х) отвечате ячейка (0,3). Для высоты(Y) (1,3)
P.s. - Матрица в нюке является матричным массивом. Следовательно обращение к элементу в массиве начинается с 0. Если нам нужно получить значение из первой ячейки второго столбца - то нужно обращаться к элементу (0, 1): 0 - первая строка массива 1 - второй столбец массива.

Окей, разобрались, какие элементы массива за какое преобразование отвечают. Дальше не все так просто. Давайте разбираться и поэтапно.

Когда мы меняет центр трансформации, то нам нужно компенсировать положение объекта в нашей "системе координат". Для поворота на угол θ по часовой стрелке со смещенным центром, мы должны компенсировать смещение по формулам.

x = center.x + (1-cosθ) - center.y*sinθ
y = center.y +(1-cosθ) + center.x*sinθ

Давайте приведу пример с ротейтом на -90 градусов - радиант (1.57) и центром в (1200, 500); sin(90) = 1; cos(90) = 0

x = center.x + (1-cosθ) - center.y*sinθ => 1200 * (1-0) - 500 * 1 = 700
y = center.y +(1-cosθ) + center.x*sinθ => 500* (1 - 0) + 1200 * 1 = 1700

Вы наверное замечали, что когда вы после анимации смещаете центр вращение, у вас компенсируется транслейт. Теперь вы понимаете почему. Окей с часовой стрелкой разобрались, давайте против часовой покрутимся.Наши формулы компенсации будут иметь такой вид.

x = center.x + (1-cosθ) + center.y*sinθ
y = center.y +(1-cosθ) + center.x*sinθ

x = center.x + (1-cosθ) + center.y*sinθ => 1200 * (1-0) + 500 * 1 = 1700

y = center.y +(1-cosθ) + center.x*sinθ => 500 * (1 - 0) - 1200 * 1 = -700

И так, на этом вторая часть про матрицы подошла к концу. С матрицами я возьму перерыв и сделаю еще одну часть с небольшой теоретической частью и примерами, где это может пригодиться в работе. Вам осталось все это понять и простить. Всем мир! Мур!