2011-03-16 9 views
9

Tengo una serie de imágenes dentro de ViewController.Simulando un efecto de imagen flotante usando CoreMotion/DeviceMotion en el iPhone

estoy "flotante" mediante la transformación de sus capas individuales:

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

Esto da el efecto de hacer las capas flotan por encima de la pantalla - en el simulador, no habría ningún efecto visible (que es correcto).

Lo que quiero hacer es tener un efecto donde mover un dispositivo hacia la izquierda/derecha/hacia adelante/hacia atrás lo haría parecer sutilmente como si las capas estuvieran flotando. Cuando incline el dispositivo hacia la izquierda, debe inclinar toda la vista hacia la derecha. Esto hará que parezca que mover el dispositivo le permite ver alrededor de las esquinas, es decir, dará la sensación de que las imágenes realmente flotan sobre la pantalla, ya que se moverían a diferentes velocidades (según su índice Z).

He realizado un proyecto de prueba (project file here) que tiene un proyecto de muestra que lo demuestra.

Mi problema es que no soy una persona matemática, por lo que estoy luchando con la mejor manera de simular el efecto flotante sutil. En este momento, tengo un oyente para DeviceMotion, que a su vez 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 utilizarse en una serie de aplicaciones diferentes. Espero extender esto a algo que un amigo y yo estamos trabajando con la detección de rostros (de modo que movería la vista principal en función del movimiento de la cara de una persona, incluso mientras mantienen el teléfono/dispositivo perfectamente quietos).

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

Nuevamente, el proyecto completo está aquí (iphone floating views) para cualquiera que desee ver el efecto tal como está ahora. (Cuando esto esté funcionando, dejaré el proyecto completo (de trabajo) vinculado aquí para la posteridad).

Respuesta

5

¡Creo que tengo esto! Utilice:

[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; 
    }]; 

Obras como encanto para mí, si quieres dar la vuelta ejes, sólo tiene que añadir signo menos delante de esos 1s.

+0

Eres increíble. Esto funciona como un amuleto, y tienes toda la razón ... Voy a ajustar las compensaciones para los ángulos, pero esto me da * exactamente * el efecto que estaba buscando. Acabo de subir también el proyecto de demostración funcional: ¡GRACIAS! –

Cuestiones relacionadas