我试图将雪碧变成梯形,即使我知道没有它,我也不在乎插值,即使我知道没有它,我的图像将失去细节。我真正想要做的是改变我矩形雪碧变成这样一个梯形:如何将Sprite变形为梯形?
/ \
/ \
/__________\
有没有人用CGAffineTransforms或cocos2d的做到了这一点?有人能指点我正确的方向吗?谢谢。
-Oscar
我试图将雪碧变成梯形,即使我知道没有它,我也不在乎插值,即使我知道没有它,我的图像将失去细节。我真正想要做的是改变我矩形雪碧变成这样一个梯形:如何将Sprite变形为梯形?
/ \
/ \
/__________\
有没有人用CGAffineTransforms或cocos2d的做到了这一点?有人能指点我正确的方向吗?谢谢。
-Oscar
您提出的转换不是仿射。 Affine transformations必须是可撤销的。因此,他们通常可以:
但他们无法 “挤”。请注意,如果延伸,梯形的左侧和右侧会在特定点相交。他们不再平行了。所以你不能“撤销”转变,因为如果在那个地方有什么变化,你就无法决定他们将转变到哪里。换句话说,如果一个转换不能保持并行性,它就会占用空间,不能撤销,而且不是仿射。
我对核心动画中的转换并不了解太多,所以我希望能够帮助您找到替代方案。
但我知道你怎么能做到这一点在OpenGL,但它需要你重新开始你如何画出你的应用程序:
如果我设想你要正确的结果,你想要在3D中构建矩形,使用仿射变换将其稍微旋转一下,然后使用(非仿射)投影变换将其平面化为2D图像。
如果你不是在寻找3D效果,但你真的只是想捏在角落,那么你可以指定一个GL_RECT
与你的梯形的点,并映射到它的精灵作为一个纹理。
最简单的事情可能是一个照片编辑器预先挤你的形象,将其保存为具有透明度为.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
嗨凯文,非常感谢您的意见。你的两个选项都很棒,但是我忘了提及我希望我的Sprite最初是一个规则的矩形形状,然后将它动态地转换成一个梯形。我不知道这是否可能。 – 2010-01-19 19:20:49
这可以使用我描述的OpenGL方法。我想关于将它保存在照片编辑器中的一个不在桌面上。 – 2010-01-19 22:41:30
完美,谢谢。 – 2010-01-20 19:38:03