Где я могу найти объяснение всех полей матрицы преобразования? - PullRequest
21 голосов
/ 11 августа 2009

Я видел в одном документе от apple, что матрица, лежащая в основе свойства преобразования CALayer, имеет такие поля, как m14, m21, m22 и так далее. Я также помню, что видел таблицу, которая объясняет эти поля, один или два месяца назад. Мне было трудно найти его. Кто-нибудь знает источник?

1 Ответ

44 голосов
/ 11 августа 2009

Эта структура выглядит так:

struct CATransform3D
{
    CGFloat m11, m12, m13, m14;
    CGFloat m21, m22, m23, m24;
    CGFloat m31, m32, m33, m34;
    CGFloat m41, m42, m43, m44;
};
typedef struct CATransform3D CATransform3D;

Это просто матрица преобразования 4x4, используемая для преобразования 4-векторов. Он может использоваться для представления любого количества линейных преобразований. См. эту статью в Википедии об этом типе матрицы. Большинство из этих элементов не могут быть интерпретированы независимо, но некоторые могут. Например, m41, m42 и m43 представляют перевод в трехмерном пространстве. Так, например, если вы умножаете точку на эту матрицу:

[ 1  0  0  0 ]
[ 0  1  0  0 ]
[ 0  0  1  0 ]
[ 1  2  3  1 ]

Затем он переведет эту точку на 1 к + X, на 2 единицы к + Y и на 3 к + Z.

                   [ 1  0  0  0 ]
[ x  y  z  1 ]  x  [ 0  1  0  0 ]  =  [ x+1  y+2  z+3  1 ]
                   [ 0  0  1  0 ]
                   [ 1  2  3  1 ]

Обратите внимание, что точка должна быть представлена ​​в виде вектора 4, а четвертый элемент равен 1. Также обратите внимание, что этот вектор фактически является самой матрицей, и формат этой матрицы отличается от формата, описанного в статье в Википедии о матрицах преобразования. Это связано с тем, что точка обычно представляется в виде одного столбца, матрицы из 4 строк, однако Apple представляет их в виде матрицы из 4 столбцов, состоящей из одной строки. Это означает, что любая матрица преобразования, которую вы видите в статье в википедии, должна быть транспонирована перед использованием ее на iPhone, чтобы она работала правильно.

Другим примером является преобразование масштабирования:

[ 2  0  0  0 ]
[ 0  2  0  0 ]
[ 0  0  2  0 ]
[ 0  0  0  1 ]

Он удвоит все координаты вашей точки, поэтому (1, 2, 3) станет (2, 4, 6). Другие преобразования, такие как повороты и перспективные проекции, сложнее распознать.

Вот дополнительная информация о transforms от Apple. Apple предоставляет набор служебных преобразований для генерации этих матриц, см. this link . На самом деле они не обсуждают математику CATransform3DMakeRotation, но эта ссылка делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...