gpt4 book ai didi

ios - 缩放包含 OpenGL 上下文的 UIView

转载 作者:行者123 更新时间:2023-11-28 22:47:31 25 4
gpt4 key购买 nike

我的 UIView 包含一个 OpenGL 上下文,它在 View 上呈现所有内容。我想上下缩放 OpenGL View 。到目前为止,我可以看到两种方法:

  1. 在 UIView 上使用变换矩阵 self.transform = CGAffineTransformMakeScale(zoom,zoom);
  2. 在我的 OpenGL 上下文中使用 glScalef

我喜欢方法 #1,因为它让我可以非常轻松地使用 CoreAnimations 在缩放时制作一些动画。方法 #2 似乎涉及更多代码,因为我需要自己制作缩放动画(可能没什么大不了的)。

更具体地说,我的 OpenGL View 最初以其大小的 90% 呈现全屏纹理。当我使用方法 #1 放大时,我希望我的 OpenGL 纹理达到 100%。但是,我似乎没有看到应有的详细程度。方法 #1 似乎在我的 OpenGL View 上使用插值,而不是进行底层 glScale 调用。

#1 和#2 等价吗?

最佳答案

它们远非相同。 GLView 的精度由您创建的渲染缓冲区的大小决定。您通常调用“fromDrawable”,这将创建与 UIView 大小相同大小的缓冲区(可以乘以也用于视网膜的内容比例)。当你调整或转换你的 UIView 时,你应该重新创建你的 GL 缓冲区,使其与 View 大小相同(我建议不要经常这样做)。因此,如果可能,请尽量保持 GL View 的大小不变。

至于 #1,您缩放 View 但保持缓冲区分辨率,而且您仍在绘制甚至不显示的部分,所以这是一件坏事。

至于#2,你是对的,动画可能有点乱,自己做。如果您只使用比例和平移,您可以创建一些参数,例如 float scaleFromfloat scaleTofloat currentInterpolationFactor,其中在“draw”调用中你可以说:

float currentScale = scaleFrom + (scaleTo-scaleFrom)*currentInterpolationFactor;
glScalef(currentScale, currentScale, currentScale);
currentInterpolationFactor += 1.0f/ANIMATION_DURATION_IN_FRAMES;

其中 currentInterpolationFactor 从 .0f 开始并以 1.0f 结束。

你甚至可以把你的动画机制放在一个单独的线程上......可能......

另一个更通用的有趣机制是对矩阵本身进行插值:因为您可以获得当前矩阵(ES1:glGetFloatv(GL_MODELVIEW_MATRIX, mtr))并且您可以创建目标矩阵(你的动画将结束的地方)根据相同的原则,你可以简单地插入矩阵的每个组件(其中 16 个),就像你使用“currentScale”一样。虽然这个原则可能工作得很好,但如果你旋转你的场景(最糟糕的是 180 度角),它看起来不会很好。

做矩阵动画插值的最好方法(如果你问我)是使用基向量:这意味着你需要使用“LookAt”原则来处理你需要的 2D:“中心向量”和“右向量”或者对于 3D:“位置矢量”、“方向矢量”和“向上矢量”。 (您会在网上找到如何从这些向量创建矩阵)。至于它们的插值:“位置向量”具有从向量 A 到 B 的线性插值:A' = A + (B-A)*interpolationFactor。至于所有其他向量,它们需要极坐标插值,这意味着您需要找到它们的“起始角”和“结束角”并对它们使用线性插值并对它们的长度执行相同的操作。之后重新创建插值基向量并使用它们创建当前矩阵。

现在考虑您将使用什么以及您最终真正需要什么。这 3 种方法从最简单到最难,但也从不太动态到更动态。

关于ios - 缩放包含 OpenGL 上下文的 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12813726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com