2010-01-19 92 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