Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将精灵扭曲成梯形?_Ios_Iphone_Cocos2d Iphone_Core Animation_Calayer - Fatal编程技术网

Ios 如何将精灵扭曲成梯形?

Ios 如何将精灵扭曲成梯形?,ios,iphone,cocos2d-iphone,core-animation,calayer,Ios,Iphone,Cocos2d Iphone,Core Animation,Calayer,我正在尝试将精灵转换为梯形,我并不真正关心插值,即使我知道没有插值,我的图像将丢失细节。我真正想做的就是将我的矩形精灵转换成梯形,如下所示: 有人用CGAffineTransforms或cocos2d这样做过吗?您提出的转换不是仿射的。必须是可撤销的。因此,他们通常可以: 鳞片 轮换 剪切(使不平衡,如方形->平行四边形) 翻译 但它们不能“挤压”。请注意,梯形的左侧和右侧如果延伸,将在特定点相交。它们不再平行了。因此,您无法“撤消”转换,因为如果在该位置有任何要转换的内容,您无法决定它们

我正在尝试将精灵转换为梯形,我并不真正关心插值,即使我知道没有插值,我的图像将丢失细节。我真正想做的就是将我的矩形精灵转换成梯形,如下所示:



有人用CGAffineTransforms或cocos2d这样做过吗?

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

  • 鳞片
  • 轮换
  • 剪切(使不平衡,如方形->平行四边形)
  • 翻译
但它们不能“挤压”。请注意,梯形的左侧和右侧如果延伸,将在特定点相交。它们不再平行了。因此,您无法“撤消”转换,因为如果在该位置有任何要转换的内容,您无法决定它们将转换到何处。换句话说,如果一个转换不能保持并行性,它会占用空间,无法撤消,并且不是仿射的

我对核心动画中的转换不太了解,所以我希望mathy的东西能帮助你找到另一种选择

但我确实知道如何在OpenGL中实现这一点,但这需要您重新开始如何绘制应用程序:

  • 如果我正确地设想了您想要的结果,您需要在3D中构建矩形,使用仿射变换将其旋转一点,然后使用(非仿射)投影变换将其展平为2D图像

  • 如果你不是在寻找3D效果,但你真的只是想在角落里捏一下,那么你可以用你的梯形点指定一个
    GL\u RECT
    ,并将你的精灵映射到它上作为纹理


  • 最简单的方法可能是在照片编辑器中预压缩图像,将其保存为带透明度的.png格式,然后用该图像绘制一个矩形。

    您需要将CATTransform3D应用于UIView的图层。 要找到正确的一个,它更容易使用

    #导入
    UIView*视图=…;//创建一个视图
    view.layer.anchorPoint=CGPointZero;
    AGKQuad=view.layer.quadrasive;
    quad.tl.x+=20;//将左上角的x值移动20像素
    quad.tr.x-=20;//将右上角的x值移动20个像素
    view.layer.quadrilateral=四边形;//四元组转换为CATTransferM3D并应用
    
    你好,凯文,非常感谢你的意见。这两个选项都很好,但是我忘了提到我希望我的精灵最初是一个规则的矩形,然后动态地将其转换为梯形。我不知道这是否可行。使用我描述的OpenGL方法是可行的。我想把它保存在照片编辑器里的方法是不可能的。你能不能干脆把它放在NSAffinetTransform里?我不认为你可以,如果你可以,你可以keystone…我真的不认为可逆本身是一个要求,只是一个副产品,大多数变换都会有一个逆矩阵。。。那些不需要除以零来求解inverse@GradyPlayer是的,你可以在仿射变换中剪切。我不认为有帮助函数可以创建这样的矩阵,但你可以做到。从单位矩阵开始,然后将m12或m21改为X乘Y或Y乘X。
      /      \  
     /        \ 
    /__________\
    
    #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