0

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

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;
4

1 回答 1

0

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

如果因为要支持没有陀螺仪的旧设备而必须使用纯加速度计数据,则必须使用 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

于 2012-08-10T08:34:19.340 回答