6

Estoy utilizando una transformación CATransform3D para aplicar un efecto de perspectiva pseudo 3D a una vista.Aplicar un CATransform3D inverso a subcapas de un CALayer que ya se ha transformado

Estoy usando el giroscopio en el iPhone 4 para controlar los parámetros de la transformación.

La vista estoy transformadora tiene algunas subvistas:

View with subviews

El resultado es algo como esto:

3D transform in action

Mi siguiente tarea es ya sea para prevenir los subvistas de ser transformado a medida que se transforma la vista principal, o aplicar una transformación inversa para que las subvistas no se vean afectadas.

Mi objetivo es tener cada subvista perpendicular a la supervista, dando la impresión de que están "de pie".

El código que estoy usando para la transformación:

- (void)update:(NSTimer *)timer 
{ 
    roll = [[[_manager deviceMotion] attitude] roll]; 
    pitch = [[[_manager deviceMotion] attitude] pitch]; 
    yaw = [[[_manager deviceMotion] attitude] yaw]; 

    CALayer *layer = [self.view layer]; 
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI/180.0f, 0.0f, 0.0f, 1.0f); // make landscape again 
    rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply the perspective 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f); 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f); 
    [layer setTransform:rotationAndPerspectiveTransform];  
} 

He probado el siguiente código en un intento de invertir la transformada, mediante la aplicación de una rotación de 90 grados perspectiva a la subvista alrededor del eje Y:

for (UIView *subview in [self.view subviews]) 
{ 
    CALayer *sublayer = [subview layer]; 
//CATransform3D inverseTransformation = [sublayer transform]; 
CATransform3D inverseTransformation = CATransform3DIdentity; 
rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply perspective 
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI/180.0f, 0.0f, 1.0f, 0.0f); 
[sublayer setTransform:inverseTransformation]; 
} 

pero todo lo que logra hacer es hacer que las subvistas desaparezcan. Si trato de usar la transformación existente de la capa con [sublayer transform] y aplicarle la rotación 3d, las subvistas parpadean, pero no giran.

Mi conocimiento de Matriz matemática no es excelente, por lo que no sé si este es el enfoque correcto.

¿Cómo puedo hacer que las subvistas estén perpendiculares a la supervista?

Respuesta

1

Recomiendo no tratar de hacer que el enfoque básico del cálculo de cada trabajo de transformación individual. Además, esto sería más fácil usando CALayers para cada una de las pequeñas subvistas en lugar de los objetos de nivel superior UIView. El enfoque básico de construir un modelo 3D y transformar todo el modelo debería funcionar mucho mejor para usted.

Comience con la capa principal, agregue una subcapa para cada uno de los pequeños cuadrados, transfiera esas subcapas a su posición, entonces su método update: enumerado en su pregunta debería funcionar para transformar todo sin modificaciones. John Blackburn has a nice little tutorial que debería ser de gran ayuda.

Cuestiones relacionadas