gpt4 book ai didi

ios - GLKView 缩放导航栏

转载 作者:行者123 更新时间:2023-11-29 03:32:05 25 4
gpt4 key购买 nike

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

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

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

最佳答案

首先,当使用 GLKView 绘制到其内置帧缓冲区时,您不需要调用 glViewport - 它会在调用您的绘图方法之前自动为您完成此操作(drawRect:(在 GLKView 子类中),或者 glkView:drawInRect:(如果您从 View 的委托(delegate)进行绘图)。但这不是你的问题——这只是冗余的状态设置(当你使用它们时,Instruments 或 Xcode Frame Debugger 可能会告诉你)。

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

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

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

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

关于ios - GLKView 缩放导航栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19627802/

25 4 0