2010-08-25 18 views

Respuesta

23

Depende del eje en el que esté haciendo la rotación.

rotación alrededor del eje z se representa como:

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) 

así ángulo debe ser a = atan2 (transform.m12, transform.m11);

La rotación alrededor del eje 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) 

La rotación alrededor del eje 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

Asegúrese de utilizar atan2 y not atan, ya que el último no dará un ángulo en el cuadrante correcto. –

+0

Gracias Nader, antes de su respuesta, había recurrido a utilizar la propiedad affaireTransform de CALayer, convierta el Transform3D en un AffineTransform y luego saque el ángulo de este cálculo: http: //stackoverflow.com/questions/2051811/iphone- sdk-cgaffinetransform-getting-the-angle-of-rotation-of-an-object Ahora sé cómo calcular directamente desde Transform3D. ¡Gracias! – ravinsp

+0

Sí, aprendí esto en el primer año de la universidad y recuerdo haberle preguntado a mi amigo "por qué lo hará, necesitamos saber esto" –

15

Si la transformada está unida a una capa, entonces se puede obtener el valor de la rotación como de la siguiente manera:

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

Desde el documentation:

Animación núcleo se extiende el protocolo de codificación de valor-clave para permitir la obtención y configuración de los valores comunes de matriz CATransform3D de una capa a través de caminos principales. La tabla 4 describe las rutas clave para las que las propiedades transform y sublayerTransform de una capa son clave-valor de codificación y observación conforme

Cuestiones relacionadas