他们相差甚远。您的 GLView 的精度由您创建的渲染缓冲区的大小定义。您通常调用“fromDrawable”,它将创建与 UIView 大小相同大小的缓冲区(可以乘以也用于视网膜的内容比例)。当您调整或转换您的 UIView 时,您应该重新创建您的 GL 缓冲区,使其与视图大小相同(我建议不要经常这样做)。因此,如果可能,请尽量保持 GL 视图的大小相同。
所以对于#1,你缩放视图但保持缓冲区分辨率加上你仍在绘制你甚至不显示的部分,所以这是一件坏事。
至于#2,你是对的,动画可能有点搞砸了自己做。如果您只使用比例和平移,您可以创建一些参数,例如,float scaleFrom
在“draw”调用中,您可以说:float scaleTo
float 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 种方法从最简单到最难,但也从不太动态到更动态。