我正在尝试将 Sprite 转换为梯形,我并不真正关心插值,即使我知道没有它我的图像会丢失细节。我真正想做的就是将我的矩形 Sprite 变成这样的梯形:
/ \
/ \
/__________\
有没有人用 CGAffineTransforms 或 cocos2d 做过这个?
我正在尝试将 Sprite 转换为梯形,我并不真正关心插值,即使我知道没有它我的图像会丢失细节。我真正想做的就是将我的矩形 Sprite 变成这样的梯形:
/ \
/ \
/__________\
有没有人用 CGAffineTransforms 或 cocos2d 做过这个?
您提出的转换不是仿射的。 仿射变换必须是可撤销的。所以他们通常可以:
但他们不能“挤压”。请注意,梯形的左侧和右侧如果延伸,将在特定点相交。它们不再平行。因此,您无法“撤消”转换,因为如果在该位置有任何要转换的内容,您无法决定它们将转换到的位置。换句话说,如果一个转换不保持并行性,它就会压缩空间,无法撤消,也不是仿射的。
我对 Core Animation 中的转换了解不多,所以我希望数学的东西可以帮助你找到替代方案。
但我确实知道如何在 OpenGL 中做到这一点,但这需要你重新开始绘制应用程序:
如果我正确地设想了您想要的结果,您希望在 3D 中构建您的矩形,使用仿射变换将其旋转一点,并使用(非仿射)投影变换将其展平为 2D 图像。
如果您不是在寻找 3D 效果,但您真的只是想捏住角落,那么您可以使用GL_RECT
梯形的点指定 a 并将您的精灵作为纹理映射到其上。
最简单的方法可能是在照片编辑器中预先压缩您的图像,将其保存为具有透明度的 .png,然后使用该图像绘制一个矩形。
您需要将 CATransform3D 应用到 UIView 的层。要找出正确的,使用AGGeometryKit更容易。
#import <AGGeometryKit/AGGeometryKit.h>
UIView *view = ...; // create a view
view.layer.anchorPoint = CGPointZero;
AGKQuad quad = view.layer.quadrilateral;
quad.tl.x += 20; // shift top left x-value with 20 pixels
quad.tr.x -= 20; // shift top right x-value with 20 pixels
view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied