Как превратить Спрайта в трапецию? - PullRequest
1 голос
/ 19 января 2010

Я пытаюсь превратить Спрайт в трапецию, меня не волнует интерполяция, хотя я знаю, что без нее мое изображение потеряет детали. Все, что я действительно хочу сделать, это превратить мой прямоугольный спрайт в трапецию, как это:


  /      \  
 /        \ 
/__________\

Кто-нибудь делал это с CGAffineTransforms или с cocos2d?

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Трансформация, которую вы предлагаете, не аффинна. Аффинные преобразования должны быть отменены. Так они обычно могут:

  • Масштаб
  • Поворот
  • Сдвиг (сделать изогнутым, как квадрат -> параллелограмм)
  • Перевести

Но они не могут "сжать". Обратите внимание, что левая и правая стороны вашей трапеции, если они расширены, будут пересекаться в определенном месте. Они больше не параллельны. Таким образом, вы не можете «отменить» преобразование, потому что если в этом месте есть что-то, что нужно преобразовать, вы не сможете решить, куда они будут преобразовываться. Другими словами, если преобразование не сохраняет параллелизм, оно сжимает пространство, не может быть отменено и не является аффинным.

Я не так много знаю о преобразованиях в Core Animation, поэтому я надеюсь, что математические вещи помогут вам найти альтернативу.

Но я знаю, как вы могли бы сделать это в OpenGL, но для этого нужно начать с того, как вы рисуете свое приложение:

  1. Если я правильно представляю результат, который вы хотите, вы хотите построить прямоугольник в 3D, использовать аффинное преобразование, чтобы немного повернуть его, и использовать (неаффинное) преобразование проекции, чтобы сгладить это в 2D-изображение.

  2. Если вы не ищете 3D-эффект, но на самом деле просто хотите ущипнуть углы, тогда вы можете указать GL_RECT с точками трапеции и отобразить на нем свой спрайт как текстура.

Самым простым может быть предварительное сжатие изображения в редакторе фотографий, сохранение его в формате .png с прозрачностью и рисование прямоугольника с этим изображением.

1 голос
/ 22 июля 2015

Вам необходимо применить 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
...