2012-08-09 1 views
0

중력에 맞추기 위해 이미지 (삼각형)를 회전하려고합니다. 한 모서리가 항상 아래로 오도록. 그러나 아무것도 도움이되지 않습니다. 미쳐가는 삼각형.CMDeviceMotion으로 이미지 회전

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; 

답변

0

motion이 CMDeviceMotion의 인스턴스를 참조하는 것이 Asssuming 대신 사용자 가속의 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

+0

감사 : 그래서처럼 보일 것이다. CMGyroData로 이미 시도했지만 운이 없습니다. CMGyroData * gyroData = [_notification.userInfo objectForKey : @ "gyroNotification"]; CMRotationRate rotate = gyroData.rotationRate; CATransform3D 회전 = rootLayer.sublayerTransform; rotation.m34 = 1.0f/-500.0f; rotation = CATransform3DRotate (rotation, rotate.y, 0.0f, 0.0f, 1.0f); rootLayer.sublayerTransform = rotation; –