Опорный кадр CMMotionManager

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

начальное изображение..пользователь наклоняется вниз..пользователь наклоняется вправо

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

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, который тоже не работает. Если полезно, мой проект здесь, для всех, кто заинтересован. Я также использовал образец кода Apple pARk.


person mattblessed    schedule 27.11.2013    source источник


Ответы (1)


- (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)

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

person user3067644    schedule 04.12.2013