Pregunta

Tengo una serie de imágenes dentro de un ViewController.

Los estoy "flotando" transformando sus capas individuales:

img.layer.transform = CATransform3DMakeTranslation(0.0f, 0.0f, myZ);

Esto da el efecto de hacer que las capas floten por encima de la pantalla; en el simulador, no habría un efecto visible (lo cual es correcto).

Lo que quiero hacer es tener un efecto en el que mover un dispositivo a la izquierda/a la derecha/hacia adelante/o atrás haría que se vea sutilmente como si las capas estuvieran flotando. Cuando inclina el dispositivo a la izquierda, debe inclinar toda la vista a la derecha. Esto hará que se sienta como mover el dispositivo le permite ver alrededor de las esquinas, es decir, dará la sensación de que las imágenes realmente están flotando por encima de la pantalla, porque se moverían a diferentes velocidades (según su índice Z).

He hecho un proyecto de prueba (Archivo de proyecto aquí) que tiene un proyecto de muestra que demos esto.

Mi problema es que no soy una persona matemática, por lo que estoy luchando con la mejor manera de simular el sutil efecto flotante. En este momento, tengo un oyente para DeviceMotion, que luego lo hace:

self.view.layer.sublayerTransform = CATransform3DMakeRotation(20.0f * M_PI / 180.0f, 2*motion.attitude.pitch, -2*motion.attitude.roll, 0);

Esto está muy cerca de lo que quiero, pero no es exactamente correcto.

Creo que este efecto será algo que podría usarse en varias aplicaciones diferentes. Espero extender esto a algo en lo que un amigo y yo estamos trabajando con la detección de cara (por lo que movería la vista de los padres en función del movimiento de la cara de una persona, incluso mientras mantiene el teléfono/dispositivo perfectamente quieto).

Me doy cuenta de que haré que la gente responda "solo use OpenGL". Esa no es la respuesta que necesito, a menos que publique un trozo de código que muestra cómo integrarlo dentro de este proyecto. (No estoy buscando nuevos problemas para resolver. :-)

Nuevamente, el proyecto completo está aquí (Vistas flotantes de iPhone) para cualquiera que quiera ver el efecto como es ahora. (Cuando esto funcione, dejaré el proyecto completo (que trabaja) vinculado aquí para la posteridad).

¿Fue útil?

Solución

¡Creo que tengo esto! Utilizar este:

    [appDelegate.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                                   withHandler:
     ^(CMDeviceMotion *motion, NSError *error) {

         CATransform3D transform;
         transform = CATransform3DMakeRotation(motion.attitude.pitch, 1, 0, 0);
         transform = CATransform3DRotate(transform, motion.attitude.roll, 0, 1, 0);

         self.view.layer.sublayerTransform = transform;
     }];

Funciona como encanto para mí, si quieres voltear los hachas, solo agregue menos signo frente a esos 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top