我在一个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),供任何想要立即看到效果的人使用。(当它起作用时,我将把这里链接的完整的(正在工作的)项目留给后代。)
发布于 2011-03-26 22:33:19
我想我有办法了!使用以下命令:
[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前面加减号即可。
https://stackoverflow.com/questions/5328848
复制相似问题