Матрица 2D Трансформации. Часть 2
Всем хай! Поехали дальше разбираться, с матрицами. Теперь нам нужно совершить одну манипуляцию. Изменить нашу матрицу с 3x3 на матрицe 4x4. Все что было в предыдущей части забудьте применимо и тут.
Изменение размера матрицы нужно для того, чтобы мы могли применять наши значение к матрицам в нюке. Все ноды, которые используют матрицу преобразований(трансформаций) имеют вид 4х4. Почему? Чисто мое предположение. Чтобы иметь возможность конвертировать координаты из 2D в 3D и наоборот. Потому что для матричных преобразований в 3d пространстве используется матрица 4х4. Ладно, хватит теорий и размышлений - "почему?" и "зачем?".
Translate
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
И так, на этом вторая часть про матрицы подошла к концу. С матрицами я возьму перерыв и сделаю еще одну часть с небольшой теоретической частью и примерами, где это может пригодиться в работе. Вам осталось все это понять и простить. Всем мир! Мур!