在iPhone上使用CoreMotion / DeviceMotion模拟图像浮动效果

时间:2011-03-16 16:59:15

标签: iphone transform accelerometer layer gyroscope

我在ViewController中有一系列图像。

我通过改变他们各自的层来“浮动”他们:

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

这样可以使图层浮动到屏幕上方 - 在模拟器中,没有可见效果(这是正确的)。

我想要做的是具有这样的效果:向左/向右/向前/向后移动设备会使其看起来像层浮动一样微妙。将设备向左倾斜时,应将整个视图向右倾斜。这会让你感觉移动设备可以让你看到角落 - 也就是说它会让人感觉图像真的漂浮在屏幕上方,因为它们会以不同的速度移动(基于它们的z指数)。

我制作了一个测试项目(project file here),该项目有一个示范项目,可以进行演示。

我的问题是我不是一个数学家,所以我正在努力用最好的方法来模拟微妙的浮动效果。现在,我有一个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 个答案:

答案 0 :(得分:5)

我想我已经拥有了这个!使用此:

    [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前添加减号。