2013-02-27 3 views
2

У меня проблема с фильтром преобразования GPUImage. Я использую распознаватель жестов для перемещения изображения. Код, который у меня есть, но изображение движется примерно на половину скорости. Если я удвою свои координаты CGAffineTransform newTransform, изображение будет выглядеть как ожидалось. Однако, когда я начинаю новый жест панорамы, изображение прыгает в точку примерно в два раза больше расстояния от центра. Возможно, моя математика отключена. Есть идеи? Или, может ли кто-нибудь предложить лучшее решение, чем то, что у меня здесь?Перевести положение GPUImage с помощью GPUImageTransformFilter и iOS Pan Gesture?

- (void)move:(UIPanGestureRecognizer *)sender { 
    // Translated CGPoint from GPUImageView 
    CGPoint translation = [sender translationInView:self.primaryImageView]; 
    // Current transform from GPUImageTransformFilter 
    CGAffineTransform currentTransform = self.transFilter.affineTransform; 
    // Size of GPUImageView bounds for later calculations 
    CGSize size = self.primaryImageView.bounds.size; 

    if ([sender state] == UIGestureRecognizerStateBegan) { 
     // Set a beginning CGPoint 
     // Multiply GPUImageView bounds by current transform to get 
     // the translated coordinates in pixels. 
     self.beginPoint = CGPointMake(size.width*currentTransform.tx, size.height*currentTransform.ty); 
    } 

    // Calculate difference from beginning point to translated point 
    CGPoint updatedPoint = CGPointMake(self.beginPoint.x+translation.x, self.beginPoint.y+translation.y); 

    // Create a new transform translation. 
    // Divide updated coordinates by GPUImageView bounds to get 
    // a percentage value (-1 to 1) 
    CGAffineTransform newTransform = CGAffineTransformMakeTranslation(updatedPoint.x/(size.width), updatedPoint.y/(size.height)); 

    // Apply new transform to filter and process. 
    [self.transFilter setAffineTransform:newTransform]; 
    [self.sourcePicture processImage]; 
} 
+1

Вместо того, чтобы пытаться вырвать компоненты матрицы, как насчет перевода преобразования, которое вы возвращаете постепенно, используя 'CGAffineTransformTranslate()'? Тогда вам просто нужно масштабировать из перевода CGPoint, который вы вернетесь в преобразование для GPUImage. –

+0

Спасибо за предложение (и за большую библиотеку), @BradLarson. Я придумал решение, используя CGAffineTransformTranslate() (в ответ). Я должен был также учитывать масштаб преобразования. – Corey

ответ

2

Как предложил @BradLarson, я создал решение, используя CGAffineTransformTranslate(). Я также обнаружил, что расчет перевода также должен учитывать масштаб преобразования, чтобы точно перевести позицию. Вот мое решение:

- (void)move:(UIPanGestureRecognizer *)sender { 
    CGPoint translatedPoint = [sender translationInView:self.primaryImageView]; 
    if ([sender state] == UIGestureRecognizerStateBegan) { 
     self.lastPoint = translatedPoint; 
    } 

    CGSize size = self.primaryImageView.bounds.size; 
    // Subtract the last point from the translated point to get the difference. 
    CGPoint updatedPoint = CGPointMake(translatedPoint.x-self.lastPoint.x, translatedPoint.y-self.lastPoint.y); 
    CGAffineTransform currentTransform = self.transFilter.affineTransform; 
    // Divide updated point by the bounds to get the transform translate value. 
    // Multiply transform value by the result of the offset factor divided 
    // by the transform scale value. 
    CGAffineTransform newTransform = CGAffineTransformTranslate(currentTransform, (updatedPoint.x/size.width)*(2/currentTransform.a), (updatedPoint.y/size.height)*(2/currentTransform.a)); 

    [self.transFilter setAffineTransform:newTransform]; 
    [self.sourcePicture processImage]; 
    self.lastPoint = translatedPoint; 
} 

Я установил смещение коэффициента к значению 2. Я все еще не уверен, почему это смещение необходимо, но я предполагаю, что это может иметь отношение к экрану Retina. Хотя, я не тестировал это на экране с сетчатым экраном.

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