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

StackOverflow https://stackoverflow.com/questions/5328848

Вопрос

У меня есть серия изображений в 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 Плавающие виды) для тех, кто хотел бы видеть эффект, как это сейчас. (Когда это сработает, я оставлю полный (работающий) проект, связанный здесь для потомков.)

Это было полезно?

Решение

Думаю, у меня есть это! Использовать это:

    [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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top