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:
El resultado es algo como esto:
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?