Es ist möglich, eine CATransform3D
einen CGAffineTransform
konvertieren, aber Sie werden einige Fähigkeiten verlieren. Ich fand es nützlich, die Aggregat-Transformation einer Ebene und ihrer Vorfahren in eine CGAffineTransform
umzuwandeln, damit ich sie mit Core Graphics rendern konnte. Die Randbedingungen sind:
- Ihre Eingaben werden als flache in der XY-Ebene
behandelnden
- Ihr Ausgang wird als flach in der XY-Ebene zu
- Perspective/Verkürzungen von
.m34
wird neutralisiert werden behandelnde
Wenn das klingt für Ihre Zwecke OK:
// 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 Sie werden alle Ihre Arbeit in 3D-Transformationen zuerst tun wollen, indem Sie von Ihren Superlayern verketten und dann das Aggregat CATransform3D
in eine CGAffineTransform
konvertieren. Da die Ebenen zunächst flach sind und auf ein flaches Ziel gerendert werden, fand ich das sehr passend, da meine 3D-Rotationen zu 2D-Scheren wurden. Ich fand es auch akzeptabel, die Verkürzung zu opfern. Es gibt keinen Weg, weil affine Transformationen parallele Linien erhalten müssen.
Um eine 3D-transformierten Schicht mit Core Graphics, zum Beispiel zu machen, können Sie die Transformationen verketten könnten (! Achtung Ankerpunkte), dann affinen konvertieren und schließlich:
CGContextSaveGState(context);
CGContextConcatCTM(context, affine);
[layer renderInContext:context];
CGContextRestoreGState(context);
Aus Neugier, würde warum Es ist Ihnen wichtig, ob Sie ein CATransform3D-Objekt auf eine Ebene oder ein CGAffineTransform-Objekt auf eine Ansicht anwenden, wenn Sie das gewünschte Ergebnis bereits erhalten. –
weil der Anfangswert von self.layer.transform von self.transform verschieden ist, nicht wahr? – Abramodj
Ich meine, bevor ich zur Pulsmethode komme, wende ich einige affine Transformationen auf die Ansicht an, aber ich berühre die Ebene nicht, also denke ich, dass die Transformation die Identität ist – Abramodj