9

我在 ViewController 中有一系列图像。

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

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 浮动视图)供任何想看到现在效果的人使用。(当这个工作正常时,我将把完整的(工作的)项目留在这里以供后代使用。)

4

1 回答 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 前面添加减号。

于 2011-03-26T14:33:18.657 回答