2009-08-11 10 views

Respuesta

43

Esa estructura se parece a esto:

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; 

Esto es simplemente un 4x4 matriz de transformada utilizada para transformar 4-vectores. Se puede usar para representar cualquier cantidad de transformaciones lineales. Ver el artículo de wikipedia de this sobre este tipo de matriz. La mayoría de esos elementos no se pueden interpretar de forma independiente, pero algunos sí. Por ejemplo, m41, m42 y m43 representan una traducción en 3 espacios. Así, por ejemplo si se multiplica un punto por esta matriz:

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

entonces será traducir ese punto por 1 hacia + X, 2 unidades hacia + Y, y 3 hacia + 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 ] 

Tenga en cuenta que el punto debe ser representada como un vector de 4 con el cuarto elemento es 1. También tenga en cuenta que este vector es en realidad una matriz de sí mismo y el formato de esta matriz se diferencia de la que se describe en el artículo de Wikipedia en matrices de transformación. Esto se debe a que un punto generalmente está representado por una sola columna, matriz de 4 filas, sin embargo, Apple los representa como matrices de 4 columnas y una sola fila. Esto significa que cualquier matriz de transformación que veas en el artículo de wikipedia necesita ser transpuesta antes de usarla en el iPhone para que funcione correctamente.

Otro ejemplo es una transformada de escala:

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

que duplicará todas las coordenadas de su punto, así que (1, 2, 3) se convertirá en (2, 4, 6). Otras transformaciones, como rotaciones y proyecciones de perspectiva son más difíciles de reconocer a la vista.

Aquí está más información en transforms de Apple. Apple proporciona una serie de transformaciones de utilidad para generar estas matrices, véase this link. En realidad, no discuten las matemáticas detrás de CATransform3DMakeRotation, pero sí lo hace this link.

+1

Esta es una gran explicación, pero creo que tienes tus ejes transpuestos. Los valores de traducción X, Y y Z están representados por m41, m42 y m43, no m14, m24 y m34. –

+0

@NickLockwood buena captura, he actualizado la explicación en consecuencia. – Gabe

Cuestiones relacionadas