2010-08-25 5 views

Répondre

23

Cela dépend de l'axe sur lequel vous effectuez la rotation.

rotation autour de l'axe z est représentée comme suit:

a = angle in radians 
x' = x*cos.a - y*sin.a 
y' = x*sin.a + y*cos.a 
z' = z 

(cos.a sin.a 0 0) 
(-sin.a cos.a 0 0) 
(0  0 1 0) 
(0  0 0 1) 

si l'angle doit être a = atan2 (transform.m12, transform.m11);

rotation autour de l'axe x:

a = angle in radians 
y' = y*cos.a - z*sin.a 
z' = y*sin.a + z*cos.a 
x' = x 

(1 0  0 0) 
(0 cos.a sin.a 0) 
(0 -sin.a cos.a 0) 
(0 0  0  1) 

rotation autour de l'axe y:

a = angle in radians 
z' = z*cos.a - x*sin.a 
x' = z*sin.a + x*cos.a 
y' = y 

(cos.a 0 -sin.a 0) 
(0  1 0  0) 
(sin.a 0 cos.a 0) 
(0  0 0  1) 
+1

Assurez-vous d'utiliser atan2 et not atan car ce dernier ne donnera pas d'angle dans le quadrant correct. –

+0

Merci Nader, avant votre réponse, j'avais recouru à l'utilisation de la propriété affineTransform de CALayer pour convertir le Transform3D en un AffineTransform et en extraire l'angle de ce calcul: http: //stackoverflow.com/questions/2051811/iphone- sdk-cgaffinetransform-obtenir-l'-angle-de-rotation-d'un objet Maintenant, je sais, comment calculer directement à partir de Transform3D. Merci! – ravinsp

+0

Ouais j'ai appris à ce sujet en première année et je me souviens avoir demandé à mon ami "pourquoi il le fera nous avons besoin de le savoir" –

15

Si la transformation est fixée à une couche, alors vous pouvez obtenir la valeur de la rotation comme suit:

CGFloat angle = [(NSNumber *)[layer valueForKeyPath:@"transform.rotation.z"] floatValue]; 

De l'documentation:

animation Core étend le protocole de codage clé-valeur pour permettre l'obtention et le réglage des valeurs communes de la matrice CATransform3D d'une couche par des chemins clés. Le tableau 4 décrit les chemins clés pour lesquels les propriétés transformer et sublayerTransform d'une couche sont codage valeur-clé et conformes aux observations

Questions connexes