2009-08-11 10 views

Répondre

43

Ce struct ressemble à ceci:

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; 

Ceci est simplement une 4x4 matrice de transformation utilisée pour transformer 4-vecteurs. Il peut être utilisé pour représenter n'importe quel nombre de transformées linéaires. Voir article this wikipedia sur ce type de matrice. La plupart de ces éléments ne peuvent pas vraiment être interprétés de façon indépendante, mais certains le peuvent. Par exemple, m41, m42 et m43 représentent une traduction dans 3-espace. Ainsi, par exemple, si vous multipliez un point par cette matrice:

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

Ensuite, il se traduira par ce point par 1 vers + X, 2 unités vers + Y, et 3 vers + 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 ] 

Notez que le point doit être représenté comme un vecteur 4 avec le 4ème élément étant 1. Notez également que ce vecteur est en fait une matrice elle-même et le format de cette matrice diffère de celle décrite dans l'article wikipedia sur les matrices de transformation. En effet, un point est généralement représenté par une seule colonne, une matrice à quatre lignes, mais Apple les représente sous la forme de quatre colonnes à une seule ligne. Cela signifie que toute matrice de transformation que vous voyez dans l'article wikipedia doit être transposée avant de l'utiliser sur l'iPhone pour qu'elle fonctionne correctement.

Un autre exemple est une mise à l'échelle de transformation:

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

Il doublera toutes les coordonnées de votre point, donc (1, 2, 3) deviendra (2, 4, 6). D'autres transformations, comme les rotations et les projections en perspective, sont plus difficiles à reconnaître à vue.

Voici plus d'informations sur transforms de Apple. Un tas de transformations utilitaires est fourni par Apple pour générer ces matrices, voir this link. Ils ne discutent pas réellement les maths derrière CATransform3DMakeRotation, mais this link fait.

+1

C'est une excellente explication, mais je pense que vous avez transposé vos axes. Les valeurs de translation X, Y et Z sont représentées par m41, m42 et m43, et non m14, m24 et m34. –

+0

@NickLockwood bonne prise, j'ai mis à jour l'explication en conséquence. – Gabe

Questions connexes