2016-07-13 18 views
1

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; 

enter image description here

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?

Antwort

0

Die richtige Reihenfolge hängt davon ab, was Sie wollen ... aber die Matrixmultiplikation ist , was A * B! = B * A bedeutet, wobei A und B Matrizen sind.

aber wenn ich mich in Bezug auf Code richtig erinnere, denke ich, dass die Matrix, die zuerst angewendet werden sollte, ganz rechts sein sollte, also wenn Sie ROT- und TRANS-Matrizen haben und eine Drehung dann eine Transformation machen wollen , mache es TRANS * ROT (das letzte Mal, dass ich etwas mit Matrizen gemacht habe, war lange her, also kann ich das rückwärts haben)

Verwenden Sie die concat function, um die Multiplikation durchzuführen, anstatt die nächste Matrix basierend auf der letzten so zu erstellen es ist einfacher zu sehen was los ist in Bezug auf links und rechts Multiplikation (vielleicht ist schnell schlau genug, um die * Operator zu überlasten, um dies zu tun, aber ich bin nicht sicher)

+0

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 :) –