【问题标题】:Simulating an image floating effect using CoreMotion/DeviceMotion on the iPhone在 iPhone 上使用 CoreMotion/DeviceMotion 模拟图像浮动效果
【发布时间】:2011-07-16 18:38:53
【问题描述】:

我在 ViewController 中有一系列图像。

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

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

这给出了使图层漂浮在屏幕上方的效果——在模拟器中,不会有可见的效果(这是正确的)。

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

我制作了一个测试项目 (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) 供任何希望看到现在效果的人使用。 (当它工作时,我将把完整的(工作的)项目留在这里以供后代使用。)

【问题讨论】:

    标签: iphone transform accelerometer layer gyroscope


    【解决方案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 前面添加减号。

    【讨论】:

    • 你太棒了。这就像一个魅力 - 你是完全正确的......我只是要调整角度的偏移量,但这给了我完全我想要的效果。我刚刚也上传了工作演示项目——谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2015-01-08
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多