我在顶部的导航栏和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;
}
答案 0 :(得分:1)
首先,在使用glViewport
绘制内置帧缓冲区时,您无需调用GLKView
- 它会在调用绘图方法之前自动为您执行此操作(drawRect:
GLKView
子类,如果您从视图的委托中进行绘制,则为glkView:drawInRect:
。但这不是你的问题 - 它只是冗余状态设置(仪器或Xcode帧调试器可能会告诉你何时使用它们)。
如果要放大视图的内容而不是调整视图大小,则需要更改绘制这些内容的方式。幸运的是,你已经做好了准备,因为你已经在update
方法中调整了ModelView和Projection矩阵。那些控制顶点从模型转换到屏幕空间的方式 - 并且该转换的一部分包括“相机”的概念,您可以调整它以影响场景中物体的近/远距离。
在3D渲染中(与现实生活中一样),有两种“缩放”方式:
将相机移近/远离其正在看的点。您用于modelViewMatrix
的翻译矩阵用于设置相机距离(它是您当前固定在z
的{{1}}参数)。跟踪/更改捏合识别器处理程序中的距离,并在创建-6.0
时使用它,如果您想以此方式缩放。
更改相机的视角 - 这是在真实相机上调整变焦镜头时发生的情况。这是modelViewMatrix
(第一个参数,当前固定为65度)的一部分。跟踪/更改捏合识别器处理程序中的视野角度,并在创建projectionMatrix
时使用它,如果您想以这种方式缩放。