Ich habe einen CALayer, den ich übersetzen und gleichzeitig drehen möchte. Ich habe die folgenden Codes, die tatsächlich funktionieren kann:Was ist die richtige Reihenfolge zum Drehen und Übersetzen eines CALayers mit CATransform3D
// layer 1:
// translate: (△x, △y, △z) = (length/2, 0, length/2)
// rotate around y: 90 degree
CATransform3D transformLayer1 = CATransform3DIdentity;
transformLayer1 = CATransform3DTranslate(transformLayer1, length/2, 0, length/2 );
transformLayer1 = CATransform3DRotate(transformLayer1, M_PI_2, 0, 1, 0);
self.layer1.transform = transformLayer1;
Während meiner Test finde ich das Transformationsergebnis wird anders sein, wenn ich die Reihenfolge der Translation und Rotation, zum Beispiel ändern, werden die Codes wie folgt geändert :
CATransform3D transformLayer1 = CATransform3DIdentity;
// do rotation firstly, and then translation
transformLayer1 = CATransform3DRotate(transformLayer1, M_PI_2, 0, 1, 0);
transformLayer1 = CATransform3DTranslate(transformLayer1, length/2, 0, length/2 );
self.layer1.transform = transformLayer1;
In dem Debugging, drucken I den Wert der Matrix bei jedem Schritt zu transformieren. Die Ergebnisse zeigen, dass der Wert von m43 unterschiedlich ist. Gibt es jemanden, der erklären kann, warum das passiert ist? Oder wie man die Kernanimationsfunktionen von CATransform3DTranslate() und CATransform3DRotate() versteht?
Vielen Dank für die Antwort. Ich überprüfte die Kommentare von CATransform3DRotate aus der Header-Datei, es zeigt, dass die Funktion wirklich ist, die Rotation (Winkel, x, y, z) * t basierend auf der Matrixmultiplikation zurückzugeben. Ich werde dies als die Antwort markieren :) –