2013-11-27 6 views
3

Я разрабатываю приложение, которое при открытии пользователя будет иметь изображение, управляемое CMMotionManager, которое перемещается в соответствии с тем, как пользователь наклоняет устройство.CMMotionManager Reference Frame

start image .. user tilts down .. user tilts right

Это мой код, чтобы начать движение устройства.

motionManager = [[CMMotionManager alloc] init]; 
motionManager.showsDeviceMovementDisplay = YES; 

motionManager.deviceMotionUpdateInterval = 1.0/60.0; 

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical]; 

Это код, который я использую для управления своим изображением в связи с движением устройства.

- (void)drawRect:(CGRect)rect 
{ 
    if (placesOfInterestCoordinates == nil) { 
     return; 
    } 


    mat4f_t projectionCameraTransform; 
    multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransform); 

    int i = 0; 


    for (MovingImage *poi in [placesOfInterest objectEnumerator]) { 
     vec4f_t v; 

     multiplyMatrixAndVector(v, projectionCameraTransform, placesOfInterestCoordinates[i]); 

     float x = (v[0]/v[3] + 1.0f) * 0.5f; 
     float y = (v[1]/v[3] + 1.0f) * 0.5f; 

     if (v[2] < 0.0f) { 
      CGPoint movingTo = CGPointMake(x*self.bounds.size.width, self.bounds.size.height-y*self.bounds.size.height); 

      if (movingTo.x < -118) { 
       movingTo.x = -118; 
      } 
      if (movingTo.x > 542) { 
       movingTo.x = 542; 
      } 
      if (movingTo.y < 215) { 
       movingTo.y = 215; 
      } 
      if (movingTo.y > 390) { 
       movingTo.y = 390; 
      } 

      poi.view.center = movingTo; 

      poi.view.hidden = NO; 

     } else { 
      poi.view.hidden = YES; 
     } 
     i++; 
    } 
} 

Изображение находится в центре экрана редко, когда пользователь открывает приложение, изображение, как правило, вправо или влево на 90 градусов от исходного положения, или ровно посередине последовательно.

Я предполагаю, что CMAttitudeReferenceFrameXArbitraryCorrectedZVertical проблема, но я также пробовал CMAttitudeReferenceFrameXArbitraryZVertical, который тоже не работает. Если это полезно, мой проект here, для всех, кто интересуется. Я также использовал образец кода Apple pARk.

ответ

0
- (void)drawRect:(CGRect)rect 
{ 
if (placesOfInterestCoordinates == nil) { 
    return; 
} 


mat4f_t projectionCameraTransform; 
multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransform); 

int i = 0; 


for (MovingImage *poi in [placesOfInterest objectEnumerator]) { 
    vec4f_t v; 

    multiplyMatrixAndVector(v, projectionCameraTransform, placesOfInterestCoordinates[i]); 

    float x = (v[0]/v[3] + 1.0f) * 0.5f; 
    float y = (v[1]/v[3] + 1.0f) * 0.5f; 

    if (v[2] < 1.0f) { // change here 
     CGPoint movingTo = CGPointMake(x*self.bounds.size.width, self.bounds.size.height-y*self.bounds.size.height); 

     if (movingTo.x < -118) { 
      movingTo.x = -118; 
     } 
     if (movingTo.x > 542) { 
      movingTo.x = 542; 
     } 
     if (movingTo.y < 215) { 
      movingTo.y = 215; 
     } 
     if (movingTo.y > 390) { 
      movingTo.y = 390; 
     } 

     poi.view.center = movingTo; 

     poi.view.hidden = NO; 

    } else { 
     poi.view.hidden = YES; 
    } 
    i++; 
} 
} 

попытка изменения (v[2] < 0.0f) к (v[2] < 1.0f)

Угол обзора отличается тем, что он ищет, когда изображение появляется в поле зрения, кроме угла перспективного устройства.

Смежные вопросы