Эта структура выглядит так:
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, но эта ссылка делает.