2011-03-16 7 views
9

Ho una serie di immagini all'interno di un ViewController.Simulazione di un effetto flottante dell'immagine utilizzando CoreMotion/DeviceMotion su iPhone

sto "flottante", trasformando i singoli strati:

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

Questo dà l'effetto di rendere gli strati galleggiare sopra lo schermo - nel simulatore, non ci sarebbe effetto visibile (che è corretta).

Quello che voglio fare è avere un effetto su dove spostare un dispositivo sinistra/destra/avanti/indietro lo farebbe apparire sottilmente come se i livelli fluttuassero. Quando inclini il dispositivo a sinistra, dovrebbe inclinare l'intera vista a destra. Questo ti farà sentire come se il movimento del dispositivo ti permettesse di vedere dietro gli angoli - cioè darà la sensazione che le immagini stiano davvero fluttuando sopra lo schermo, perché si muoveranno a velocità diverse (basate sul loro indice z).

Ho realizzato un progetto di prova (project file here) che ha un progetto di esempio che lo dimostra.

Il mio problema è che non sono una persona di matematica, quindi sto lottando con il modo migliore per simulare il sottile effetto fluttuante. In questo momento, ho un listener per DeviceMotion, che poi fa:

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

Questo è molto vicino a quello che voglio, ma non è esattamente a destra.

Penso che questo effetto sarà qualcosa che potrebbe essere utilizzato in una serie di applicazioni diverse. Spero di estendere questo a qualcosa che un amico e io stiamo lavorando con il rilevamento del volto (in modo da spostare la vista genitore in base al movimento del volto di una persona - anche mentre mantengono il telefono/dispositivo perfettamente immobile).

Mi rendo conto che otterrò persone che rispondono "basta usare OpenGL". Questa non è la risposta di cui ho bisogno, a meno che non pubblichi un pezzo di codice che mostra come integrarlo all'interno di questo progetto. (Non sto cercando nuovi problemi da risolvere. :-)

Anche in questo caso, il progetto completo è qui (iphone floating views) per tutti coloro che vorrebbero vedere l'effetto così come è adesso. (Quando funziona, lascerò il progetto completo (di lavoro) collegato qui per i posteri.)

risposta

5

Penso di averlo! Utilizzare questa:

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

funziona come fascino per me, se si desidera capovolgere gli assi, è sufficiente aggiungere il segno meno di fronte a quelle 1s.

+0

Sei incredibile. Funziona come un incantesimo - e hai esattamente ragione ... Sto solo modificando gli offset per gli angoli, ma questo mi dà esattamente l'effetto che stavo cercando. Ho appena caricato anche il progetto dimostrativo funzionante - GRAZIE! –