Имитация эффекта плавающего изображения с помощью CoreMotion / DeviceMotion на iPhone


У меня есть ряд изображений в ViewController.

Я "плаваю" их, преобразуя их отдельные слои:

img.layer.transform = CATransform3DMakeTranslation(0.0f, 0.0f, myZ);
Это дает эффект того, что слои плавают над экраном-в симуляторе не будет никакого видимого эффекта (что правильно).

Что я хочу сделать, так это создать эффект, когда перемещение устройства влево / вправо / вперед / или назад заставит его выглядеть тонко, как будто слои плавают. Когда вы наклоняете устройство влево, оно должно наклоняться под углом весь вид справа. Это создаст ощущение, что перемещение устройства позволяет вам видеть за углами - то есть это даст ощущение, что изображения действительно плавают над экраном, потому что они будут двигаться с разной скоростью (в зависимости от их z-индекса).

Я сделал тестовый проект (файл проекта здесь ), который имеет образец проекта, который демонстрирует это.

Моя проблема в том, что я не математик, поэтому я борюсь с лучшим способом моделирования тонкого плавающего эффект. Прямо сейчас у меня есть слушатель для DeviceMotion, который затем делает:

self.view.layer.sublayerTransform = CATransform3DMakeRotation(20.0f * M_PI / 180.0f, 2*motion.attitude.pitch, -2*motion.attitude.roll, 0);
Это очень близко к тому, что я хочу, но это не совсем правильно. Я думаю, что этот эффект будет чем-то, что может быть использовано в ряде различных приложений. Я надеюсь распространить это на что-то, над чем мы с другом работаем с распознаванием лиц (так что это будет перемещать Родительский вид, основанный на движении лица человека - даже когда они держат телефон/устройство идеально до сих пор).

Я понимаю, что люди будут отвечать "просто используйте OpenGL". Это не тот ответ, который мне нужен-если только вы не опубликуете фрагмент кода, который показывает, как интегрировать его в этот проект. (Я не ищу новых проблем для решения. :- )

Опять же, полный проект находится здесь (iPhone floating views ) для всех, кто хотел бы увидеть эффект, как он есть прямо сейчас. (Когда это будет работать, я оставлю полный (рабочий) проект, связанный здесь, для потомков.)

1 9

1 ответ:

Кажется, у меня получилось! Используйте это:

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

Работает как шарм для меня, если вы хотите перевернуть оси, просто добавьте знак минус перед этими 1.