2010-03-08 10 views
7

Ho un UIView (e quindi un CALayer) che sto cercando di deformare o piegare leggermente nello spazio 3D. Cioè, immagina che il mio UIView sia un'etichetta piatta che voglio avvolgere parzialmente attorno a una bottiglia di birra (non a 360 gradi intorno, solo su un "lato").Avvolgimento/deformazione di un CALayer/UIView (o OpenGL) in 3D (iPhone)

Ho pensato che sarebbe stato possibile applicando una trasformazione allo strato della vista, ma per quanto posso dire, questa trasformazione è limitata alla rotazione, alla scala e alla traduzione uniforme dello strato. Potrei sbagliarmi qui, dato che la mia algebra lineare è a questo punto nebulosa, per non dire altro.

Come posso ottenere questo risultato?

+0

Per questo è necessario OpenGL. (Non so come.) – kennytm

+1

La risposta di Kenny a questa domanda: http://stackoverflow.com/questions/2351586/iphone-image-stretching-skew mostra come fare distorsioni più complesse di un livello 2-D, ma Non credo che la curvatura sia possibile usando solo trasformazioni del genere. –

+0

@Brad Larson: Giusto, posso fare skew del genere senza problemi. Sono curvatura. Non conosco nulla di OpenGL ma se qualcuno lo fa sarebbe accettabile. – jbrennan

risposta

2

Dai un'occhiata al codice di esempio Apple PVRTextureLoader Questo è un progetto OpenGL che dimostra come visualizzare una trama (la tua etichetta) su una superficie (su un cilindro nel tuo caso).

Jeff LaMarche ha pubblicato un bel tutorial per iniziare con Open GL.

+1

Come è rilevante questa risposta? È la direzione giusta, ma non parla di "piegare" un livello. – Tudorizer

2

Il meglio che si può fare con Core Animation è quello di fare un'approssimazione lineare a tratti.

Ad esempio, si potrebbe dividere il "cilindro" in otto segmenti, e disporli in questo modo:

_ 
/\ 
| | 

Si potrebbe dare loro tutta la stessa immagine, ma cambiare la traduzione in modo che si allineino alla bordi. Quindi dai a ciascuna una trasformazione (o una semplice compressione orizzontale o una sorta di "chiave di volta" se stai per guardare in prospettiva).

In realtà probabilmente vorrai utilizzare più di otto segmenti. Nota che sarebbero concentrati vicino ai bordi della tua vista.

This CSS animation potrebbe darvi qualche ispirazione.