我最近在一个绘画应用程序中实现缩放功能时遇到了一些问题。首先,请允许我介绍一些背景信息。
首先,我修改了苹果的glPaint演示应用程序。我认为这是一个很好的源码,因为它向你展示了如何设置EAGLView,等等。
现在,我下一步要做的是实现缩放功能。在做了一些研究之后,我尝试了两种不同的方法。
1)使用glOrthof
2)更改EAGLView的帧大小。
虽然这两种方式都能让我完美地放大/缩小,但当我实际在放大时进行绘画时,我会遇到不同的问题。
当我使用(1)时,我必须像这样呈现视图:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(left, right, bottom, top, -1.0f, 1.0f); //those values have been previously calculated
glDisable(GL_BLEND);
//I'm using Apple's Texture2D class here to render an image
[_textures[kTexture_MyImage] drawInRect:[self bounds]];
glEnable(GL_BLEND);
[self swapBuffers];现在,让我们假设我放大了一点,然后我画了画,然后我想再次缩小。为了让它正常工作,我需要确保"kTexture_MyImage“总是包含最新的更改。为此,我需要在进行更改后捕获屏幕内容,并将它们与原始图像合并。这里的问题是,当我放大时,我的屏幕只显示图像的一部分(放大),而我还没有找到一个适当的方法来处理这个问题。
我试着计算屏幕的哪一部分被放大了,然后进行捕捉。之后,我会将这个部分调整到它的原始大小,并使用另一种方法将其粘贴到原始图像中的正确位置。
现在,我可以更详细地介绍我是如何实现这一点的,但这真的很复杂,我想,一定有一种更简单的方法。已经有几个应用程序,它们完美地完成了我正在尝试实现的目标,所以这肯定是可能的。
就方法(2)而言,我可以避免上述大多数情况,因为我只更改了EAGLView窗口的大小。然而,在绘画时,笔划与其预期位置相差甚远。我可能需要在绘画时考虑缩放级别,并以不同的方式重新计算CGPoints。
但是,如果你在过去做过类似的事情,或者可以给我一个提示,我将如何在我的绘画应用程序中实现缩放,我将非常感激。
提前谢谢。
发布于 2010-11-09 13:24:41
是的,这绝对是可能的。
当涉及到绘制程序时,您应该保留一个链表或对象树来绘制,以便于插入/删除。当用户停止绘制时(即touchesEnded),您可以将对象添加到包含场景的数据结构中。
当用户缩放时,您需要相对于当前视口、投影和模型视图变换来调整正在绘制的对象的坐标。在您的示例中,您不会更改视口或模型视图变换,因此您只需要考虑投影变换。您也可以使用模型视图矩阵上的平移和缩放来实现缩放,但为了简单起见,我将忽略这种情况,因为它涉及反转变换。
好消息是,您使用的是正交投影,因此当没有缩放效果时,世界坐标与窗口坐标相对应。在您的例子中,"world“是一个简单的画布,它可能与设备在窗口坐标中的大小相对应。
在将对象添加到场景数据结构之前,请使用当前投影变换(即glOrthof()调用的参数)将所有坐标转化为世界坐标(即完整画布坐标)。只有将模型中的所有东西都保持在相同的坐标空间中,你才能保持理智。
要转换坐标,假设您永远不能在glOrtho()调用中缩小设备的全部尺寸,则必须按缩放的正交尺寸与未缩放的正交尺寸的比例缩小它们,然后根据缩放的正交底部、左值和原始未缩放的正交值之间的差值对它们进行偏移。
https://stackoverflow.com/questions/4125991
复制相似问题