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

9

我有一系列图片在一个视图控制器中。

我通过转换它们的各个图层来“浮动”它们:

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

这样做的效果是使图层浮在屏幕上方 - 在模拟器中,不会有可见效果(这是正确的)。
我的目标是实现这样一种效果:将设备左/右/前/后移动时,让它看起来稍微像图层正在浮动。当您将设备向左倾斜时,它应该将整个视图角度调整到右侧。这将使移动设备让您能够看到周围的角落 - 即它会给人一种图像确实漂浮在屏幕上方的感觉,因为它们会以不同的速率移动(基于它们的z-index)。
我制作了一个测试项目(项目文件在此处),其中包含演示此效果的示例项目。
我的问题是,我不是数学专业人士,所以我正在努力找到模拟微妙浮动效果的最佳方法。目前,我已经监听了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个回答

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前面加上负号。


你太棒了。这个程序运行得非常好,而且你说得完全正确...我只需要微调角度的偏移量,但这正是我想要的效果。我也上传了可工作的演示项目 - 谢谢! - Jeffrey Berthiaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接