使用CMDeviceMotion旋转图像

时间:2012-08-09 15:12:25

标签: iphone rotation calayer accelerometer motion

我正在尝试旋转图像(三角形)以使其与重力对齐。所以一个角落总是在下降。但没有任何帮助。三角疯了。

double accelX = motion.userAcceleration.x;
double accelY = motion.userAcceleration.y;
rollingX = (accelX * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
rollingY = (accelY * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor));
accelX = accelX - rollingX;
accelY = accelY - rollingY;
float angle = atan2(accelY, accelX);

[rootLayer setAnchorPoint:CGPointMake(0.5, 0.5)];
CATransform3D rotation = CATransform3DIdentity;
rotation.m34 = 1.0f / -500.0f;
rotation = CATransform3DRotate(rotation, angle, 0.0f, 0.0f, 1.0f);
rootLayer.sublayerTransform = rotation;

1 个答案:

答案 0 :(得分:0)

假设motion引用CMDeviceMotion的实例,您应该使用gravity属性而不是用户加速。然后你必须直接使用重力矢量,即没有任何过滤。这是最简单和推荐的方式,因为它也使用陀螺仪来提高精度。

如果您因为想要支持没有陀螺仪的旧设备而必须使用纯加速度计数据,则必须使用CMMotionManager的accelerometerData属性。但是有一个小错误。该代码将高通滤波器应用于accelXaccelY,而不是低通滤波器。所以看起来应该是这样的:

double accelX = motionManager.accelerometerData.acceleration.x;
double accelY = motionManager.accelerometerData.acceleration.y;
rollingX = (accelX * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
rollingY = (accelY * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor));
float angle = atan2(rollingY, rollingX);

filteringFactor< = 0.3