0

我的 iOS 应用程序窗口顶部的导航栏和底部的工具栏之间有一个 GLKView (OpenGL ES2.0)。我已经使用 UIPinchGestureRecognizer 实现了捏缩放,但是当我缩小很大程度时,我的视图会在顶部导航栏上运行。令人惊讶的是,视图并没有越过底部的工具栏。想知道我做错了什么。

这是我正在使用的视口设置:

 glViewport(0, 0, self.frame.size.width, self.frame.size.height);

这是更新和捏处理程序:

-(void) update {    
       float aspect = fabsf(self.bounds.size.width / self.bounds.size.height);

    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),aspect, 0.01f, 10.0f);
self.effect.transform.projectionMatrix = projectionMatrix;

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -6.0f);
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, _rotMatrix);
    self.effect.transform.modelviewMatrix = modelViewMatrix;
}

-(IBAction) handlePinch: (UIPinchGestureRecognizer *)recognizer {
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1.0;
}
4

1 回答 1

1

首先,您不需要glViewport在使用其内置帧缓冲区进行绘图时调用GLKView——它会在调用您的绘图方法之前自动为您执行此操作(drawRect:GLKView子类中,或者glkView:drawInRect:如果您正在从视图的委托进行绘图)。不过,这不是您的问题——它只是冗余状态设置(仪器或 Xcode 帧调试器可能会告诉您何时使用它们)。

如果您想放大视图的内容而不是调整视图的大小,则需要更改绘制这些内容的方式。幸运的是,您已经为此做好了准备,因为您已经在update方法中调整了 ModelView 和 Projection 矩阵。这些控制如何将顶点从模型转换到屏幕空间 - 并且该转换的一部分包括“相机”的概念,您可以调整以影响场景中对象出现的距离/距离。

在 3D 渲染中(就像在现实生活中一样),有两种“缩放”方式:

  • 将相机移近/远离它正在查看的点。您使用的平移矩阵modelViewMatrix是设置相机距离的z参数(它是您当前固定在的参数-6.0)。跟踪/更改捏识别器处理程序中的距离,并在创建时使用它,modelViewMatrix如果您想以这种方式缩放。

  • 改变相机的视野角度——当你在真实相机上调整变焦镜头时会发生这种情况。这是projectionMatrix(第一个参数,目前固定在65度)的一部分。跟踪/更改捏识别器处理程序中的视野角度,并在创建时使用它,projectionMatrix如果您想以这种方式缩放。

于 2013-10-31T17:05:54.617 回答