E 'possibile convertire un CATransform3D
ad un CGAffineTransform
, ma si perde alcune funzionalità. Ho trovato utile convertire la trasformazione aggregata di un layer e dei suoi antenati in un CGAffineTransform
così da renderlo disponibile con Core Graphics. I vincoli sono:
- vostro contributo verrà considerato piatta nel piano XY
- L'output verrà considerato piatta nel piano XY troppo
- Perspective/scorcio dal
.m34
verrà neutralizzata
Se questo suona bene per i vostri scopi:
// m13, m23, m33, m43 are not important since the destination is a flat XY plane.
// m31, m32 are not important since they would multiply with z = 0.
// m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that.
// m44 is implicitly 1 as CGAffineTransform's m33.
CATransform3D fullTransform = <your 3D transform>
CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42);
Yo vorrai fare tutto il tuo lavoro nelle trasformazioni 3D prima, ad esempio concatenando dai tuoi superplayer e infine convertendo l'aggregato CATransform3D
in un CGAffineTransform
. Dato che i livelli sono piatti all'inizio e il rendering su un target piatto, ho trovato questo molto adatto poiché le mie rotazioni 3D sono diventate cesoie 2D. Ho anche trovato accettabile sacrificare lo scorcio. Non c'è modo di aggirare questo perché le trasformazioni affini devono preservare le linee parallele.
Per rendere un livello 3D-trasformata utilizzando core grafico, per esempio, si potrebbe concatenare le trasformazioni (! Rispettando punti di ancoraggio), poi convertire in affine, e infine:
CGContextSaveGState(context);
CGContextConcatCTM(context, affine);
[layer renderInContext:context];
CGContextRestoreGState(context);
fonte
2013-08-26 15:32:08
Per curiosità, perché sarebbe ti interessa se stavi applicando un CATransform3D a un layer o un CGAffineTransform a una vista, se stai già ottenendo il risultato che desideri dal primo? –
perché il valore iniziale di self.layer.transform è diverso da self.transform, non è vero? – Abramodj
Voglio dire, prima di arrivare al metodo dell'impulso applico alcune trasformazioni Affine alla vista, ma non tocco il livello, quindi suppongo che la trasformazione sia l'identità lì – Abramodj