2010-01-19 70 views
1

我试图将雪碧变成梯形,即使我知道没有它,我也不在乎插值,即使我知道没有它,我的图像将失去细节。我真正想要做的是改变我矩形雪碧变成这样一个梯形:如何将Sprite变形为梯形?


/ \ 
/  \ 
/__________\ 

有没有人用CGAffineTransforms或cocos2d的做到了这一点?有人能指点我正确的方向吗?谢谢。

-Oscar

回答

2

您提出的转换不是仿射。 Affine transformations必须是可撤销的。因此,他们通常可以:

  • 规模
  • 旋转
  • 剪切(请渐行渐远,像方 - >平行四边形)
  • 翻译

但他们无法 “挤”。请注意,如果延伸,梯形的左侧和右侧会在特定点相交。他们不再平行了。所以你不能“撤销”转变,因为如果在那个地方有什么变化,你就无法决定他们将转变到哪里。换句话说,如果一个转换不能保持并行性,它就会占用空间,不能撤销,而且不是仿射。

我对核心动画中的转换并不了解太多,所以我希望能够帮助您找到替代方案。

但我知道你怎么能做到这一点在OpenGL,但它需要你重新开始你如何画出你的应用程序:

  1. 如果我设想你要正确的结果,你想要在3D中构建矩形,使用仿射变换将其稍微旋转一下,然后使用(非仿射)投影变换将其平面化为2D图像。

  2. 如果你不是在寻找3D效果,但你真的只是想捏在角落,那么你可以指定一个GL_RECT与你的梯形的点,并映射到它的精灵作为一个纹理。

最简单的事情可能是一个照片编辑器预先挤你的形象,将其保存为具有透明度为.png,并绘制与图像的矩形。

+0

嗨凯文,非常感谢您的意见。你的两个选项都很棒,但是我忘了提及我希望我的Sprite最初是一个规则的矩形形状,然后将它动态地转换成一个梯形。我不知道这是否可能。 – 2010-01-19 19:20:49

+0

这可以使用我描述的OpenGL方法。我想关于将它保存在照片编辑器中的一个不在桌面上。 – 2010-01-19 22:41:30

+0

完美,谢谢。 – 2010-01-20 19:38:03

1

您需要将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