2016-07-13 4 views
1

翻訳と回転を同時に行うCALayerがあります。私は実際に動作することができ、次のコードがあります。CATransform3Dを使ってCALayerを回転させて翻訳するにはどうすればいいですか

// 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; 

を私のテスト中に、私は、たとえば、コードは次のように変更され、平行移動と回転の順序を変更した場合、変換結果は異なるものになります見つけます:

デバッグにおいて
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

、Iは各ステップにおける変換行列の値を出力します。結果は、m43の値が異なることを示しています。なぜこれが起こったのか説明できる人はいますか?またはCATransform3DTranslate()とCATransform3DRotate()のCore Animation機能を理解する方法は?

答えて

0

適切な順序はあなたが望むものに依存しますが、行列乗算はnot commutativeです。つまり、AとBは行列です。A * B!= B * Aを意味します。

しかし、コードに関して正しく覚えていれば、最初に適用したいマトリックスは右端にあるべきだと思うので、ROTとTRANSマトリックスがあれば、回転をしたいそれをTRANS * ROTにしてください(前回行列があったのはずっと前でしたので、私はこれを後方に持っているかもしれません)

concat functionを使って次の行列を作成する代わりにmultipilcationを行います。左右の掛け算で何が起こっているのかが分かりやすくなります(おそらく敏捷で、これを行うには*オペレータに過負荷をかけますが、わかりません)

+0

ありがとうございました。私は、ヘッダーファイルからCatransform3DRotateのコメントをチェックしました。実際には、行列の乗算に基づいて回転(角度、x、y、z)* tを返すことを示しています。私はaswerとしてこれをマークします:) –

関連する問題