捏缩放OpenGL正交投影矩阵

时间:2012-07-10 16:44:52

标签: ios opengl-es opengl-es-2.0 glkit

我在尝试实现捏合以缩放在iOS下使用OpenGLES正交投影显示的图像时遇到了一些麻烦。我正在尝试缩放和平移投影矩阵,以便缩放在夹点位置下居中。

在我的更新:方法我配置矩阵:

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
projectionMatrix = GLKMatrix4MakeOrtho(-0.5f, 0.5f, -0.5f / aspect, 0.5f / aspect, -1.0f, 1.0f);
projectionMatrix = GLKMatrix4Multiply(projectionMatrix, GLKMatrix4MakeScale(newScale, newScale, 1.0f)); // scale
projectionMatrix = GLKMatrix4Multiply(projectionMatrix, GLKMatrix4MakeTranslation((endPan1.x + endPan2.x), 0.0 - (endPan1.y + endPan2.y), 0.0f)); //pan

使用捏合手势识别器我正在获取newScale和endPan1的值。 (endPan2来自双指pan识别器。):

- (void)pinchDetected:(UIGestureRecognizer *)sender;
{
if (sender.state == UIGestureRecognizerStateBegan) {

    lastScale = newScale;        
    startPan1.x = endPan1.x;
    startPan1.y = endPan1.y;    

    GLKMatrix4 pinchMatrix = projectionMatrix;
    CGFloat aspectInv = self.view.bounds.size.height / self.view.bounds.size.width;
    // Get the center offset of the projection matrix:
    GLKVector2 middleVect = GLKVector2Make(pinchMatrix.m30, pinchMatrix.m31);
    CGPoint pointPinch = [sender locationInView:self.view];
    GLKVector2 touchVectPinch = GLKVector2Make((2 * pointPinch.x / self.view.bounds.size.width - 1),
                                               (2 * (self.view.bounds.size.height-pointPinch.y) / self.view.bounds.size.height - 1));
    touchToMiddle = GLKVector2Make((middleVect.x - touchVectPinch.x) * (1.0 / pinchMatrix.m00), (middleVect.y - touchVectPinch.y) * ((1.0 / pinchMatrix.m00) * aspectInv)  );    
}

newScale = [(UIPinchGestureRecognizer*)sender scale] - (1.0 - lastScale);

if (newScale < 0.25) {
    newScale = 0.25;
}
if (newScale > 4.0) {
    newScale = 4.0;
}

// Pan the image to center the scale under the touch point:???
endPan1.x = (((newScale - 1.0) * 0.5) * (touchToMiddle.x )) - startPan1.x ;
endPan1.y = 0.0 - ((((newScale - 1.0) * 0.5) * (touchToMiddle.y )) + startPan1.y); 
}

结果是在缩放时图像在夹点位置下并不完全居中。它有点半工作......这让我觉得我必须要接近???

1 个答案:

答案 0 :(得分:0)

我不太确定你的图像是如何放在屏幕上的,但你可能应该将图像相对于屏幕的中间点进行翻译。因此,如果你的平均夹点位于屏幕的右上角,那么你应该转换你的夹点在x和y方向上偏离中间的量。这种翻译可能需要缩放,具体取决于您的图像距离相机的距离(即使是正交图像)。你很可能需要玩这些数字才能找到对你有用的东西。

一种可能的替代方法是不使用正交视图,使用透视,然后您可以调整缩放效果的视野,只需将摄像机移动到应放大的位置。