0

我的 UIView 包含一个 OpenGL 上下文,可以渲染视图上的所有内容。我想上下缩放 OpenGL 视图。到目前为止,我可以看到两种方法:

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

我喜欢方法#1,因为它允许我非常轻松地使用 CoreAnimations 进行缩放动画。方法 #2 似乎涉及更多代码,因为我需要自己为缩放设置动画(可能没什么大不了的)。

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

#1 和 #2 是等价的吗?

4

1 回答 1

2

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

所以对于#1,你缩放视图但保持缓冲区分辨率加上你仍在绘制你甚至不显示的部分,所以这是一件坏事。

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

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 度角)它看起来不会很好。

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

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

于 2012-10-10T09:15:04.927 回答