2013-02-27 3 views
2

GPUImage 변환 필터를 사용하는 데 문제가 있습니다. 팬 제스처 인식기를 사용하여 이미지의 위치를 ​​변경합니다. 내가 가지고있는 코드는 작동하지만 이미지는 약 절반의 속도로 움직입니다. CGAffineTransform newTransform 좌표를 두 배로하면 이미지가 예상대로 끌어집니다. 그러나 새로운 패닝 제스처를 시작하면 이미지가 중심점에서 약 2 배의 점으로 점프합니다. 아마 내 수학은 꺼져있을거야. 어떤 아이디어? 또는, 누구든지 내가 여기있는 것보다 더 나은 해결책을 제안 할 수 있습니까? @BradLarson 제안으로GPUImageTransformFilter 및 iOS 팬 제스처로 GPUImage 위치를 변환 하시겠습니까?

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

, 나는 CGAffineTransformTranslate()를 사용하여 솔루션을 만들었습니다. 또한 변환 계산은 위치를 정확하게 변환하기 위해 변환 스케일을 고려해야한다는 것을 발견했습니다. 내가 2의 값으로 상쇄 요인을 설정 한

- (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; 
} 

: 여기 내 솔루션입니다. 나는 왜이 오프셋이 필요한지 아직 확실하지 않지만 망막 스크린과 관련이 있다고 생각합니다. 비록 망막이 아닌 화면 장치에서 이것을 테스트하지는 않았습니다.

관련 문제