2010-01-19 4 views
1

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


/ \ 
/  \ 
/__________\ 

Кто сделал это с CGAffineTransforms или с cocos2d ?. Может ли кто-нибудь указать мне в правильном направлении ?. Спасибо.

-Oscar

ответ

2

Преобразование вы предлагаете не аффинно. Affine transformations должны быть отменены. Таким образом, они могут, как правило:

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

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

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

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

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

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

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

+0

Привет, Кевин, большое вам спасибо за ваш вклад. Оба ваших варианта великолепны, однако я забыл упомянуть, что хочу, чтобы мой Sprite был первоначально регулярным прямоугольным Shape, а затем динамически превратил его в трапецию. Я не знаю, возможно ли это. –

+0

Это возможно с использованием методов OpenGL, которые я описал. Я думаю, что о сохранении его в редакторе фотографий стоит за столом. –

+0

Отлично, спасибо. –

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 
Смежные вопросы