2010-03-08 4 views
7

Ich habe einen UIView (und damit einen CALayer), den ich versuche, im 3D-Raum etwas zu verziehen oder zu verbiegen. Das heißt, stellen Sie sich vor, mein UIView ist ein flaches Etikett, das ich teilweise um eine Bierflasche wickeln möchte (nicht 360 Grad um, nur auf einer "Seite").Einen CALayer/UIView (oder OpenGL) in 3D (iPhone) einhüllen/verzerren

Ich dachte, das wäre möglich, indem Sie eine Transformation auf die Ebene der Ansicht anwenden, aber soweit ich das beurteilen kann, ist diese Transformation auf Rotation, Skalierung und Translation der Ebene gleichmäßig beschränkt. Ich könnte mich hier irren, da meine lineare Algebra an dieser Stelle, um es gelinde auszudrücken, neblig ist.

Wie kann ich das erreichen?

+0

Sie benötigen OpenGL dafür. (Ich weiß nicht wie.) – kennytm

+1

Kennys Antwort auf diese Frage: http://stackoverflow.com/questions/2351586/iphone-image-stretching-skew zeigt, wie komplexere Verzerrungen einer 2-D-Schicht zu tun, aber Ich glaube nicht, dass Krümmung nur mit solchen Transformationen möglich ist. –

+0

@Brad Larson: Richtig, ich kann solche Schräglagen machen, kein Problem. Es ist Krümmung, nach der ich suche. Ich weiß nichts von OpenGL, aber wenn jemand das tut, wäre das akzeptabel. – jbrennan

Antwort

2

Werfen Sie einen Blick auf den Apple-Beispielcode PVRTextureLoader Dies ist ein OpenGL-Projekt, das zeigt, wie eine Textur (Ihr Etikett) auf einer Oberfläche (auf einem Zylinder in Ihrem Fall) angezeigt wird.

Jeff LaMarche hat eine nette tutorial gepostet, um mit Open GL zu beginnen.

+1

Wie ist diese Antwort relevant? Es ist die richtige Richtung, aber nichts über das "Biegen" einer Schicht. – Tudorizer

2

Das Beste, was Sie mit Core Animation tun können, ist eine stückweise lineare Approximation.

Zum Beispiel könnten Sie Ihre „Zylinder“ in acht Segmente unterteilen, und ordnen sie in etwa so:

_ 
/\ 
| | 

Sie können sie alle das gleiche Bild, aber alle Übersetzung ändern, so dass sie bei der Line-Up Kanten. Dann geben Sie jeder eine Transformation (entweder eine einfache horizontale Komprimierung oder eine Art "Keystone", wenn Sie für ein perspektivisches Aussehen gehen).

In Wirklichkeit würden Sie wahrscheinlich mehr als acht Segmente verwenden möchten. Beachten Sie, dass sie in der Nähe der Ränder Ihrer Ansicht konzentriert sind.

This CSS animation könnte Ihnen etwas Inspiration geben.