4

次のコードは、レイヤーの透視回転変換を作成できます。

CATransform3D transform3DFoo = CATransform3DIdentity;

transform3DFoo.m34 = -1.0 / 1000;

transform3DFoo = CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

ただし、2 つの行を逆にすると、次のようになります。

CATransform3D transform3DFoo = CATransform3DIdentity;

transform3DFoo = CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

transform3DFoo.m34 = -1.0 / 1000;

その後、視点はなくなりました。現在は正投影です (遠近法はありません)。パースペクティブに精通している人は、その理由を知っていますか?


アップデート:

// First Identity and then transform3DFoo.m34 = -1.0 / 1000; is done

1.00000     0.00000     0.00000     0.00000 
0.00000     1.00000     0.00000     0.00000 
0.00000     0.00000     1.00000    -0.00100 
0.00000     0.00000     0.00000     1.00000 

// and then CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

1.00000     0.00000     0.00000     0.00000 
0.00000     0.70711     0.70711    -0.00071 
0.00000    -0.70711     0.70711    -0.00071 
0.00000     0.00000     0.00000     1.00000 

// Now start with Identity and only the Rotate statement is done:

1.00000     0.00000     0.00000     0.00000 
0.00000     0.70711     0.70711     0.00000 
0.00000    -0.70711     0.70711     0.00000 
0.00000     0.00000     0.00000     1.00000 

// and then transform3DFoo.m34 = -1.0 / 1000; is done

1.00000     0.00000     0.00000     0.00000 
0.00000     0.70711     0.70711     0.00000 
0.00000    -0.70711     0.70711    -0.00100 
0.00000     0.00000     0.00000     1.00000 

(おそらくOpenGLでも同じ原理なので「OpenGL」のタグを付けています)

4

1 に答える 1

6

最初に設定m34することは、最初に回転してから投影することと同じです。最後に設定m34することは、最初に投影してから回転することとほぼ同じです。入力座標は z=0 であるため、最初に投影しても何も起こりません。

これがなぜなのかを理解するには、変換行列がどのように機能するかについて少し理解する必要があります。

CAでは、次のようにして変換行列Mによって位置が変換されると思います。

[x y z w] = [x y z w] * M

( http://en.wikipedia.org/wiki/Matrix_multiplicationを参照)

2 つの変換行列を乗算することは、変換を連結することと同じです。左側の変換/行列が最初に発生します。これがなぜなのかを理解するのはとても簡単です:

[x y z w] * (LEFT * RIGHT) = ([x y z w] * LEFT) * RIGHT

CA 変換関数のほとんど (すべて?) (例: CATransform3DRotate) は、変換行列を別の適切に構築された行列で前もって乗算するだけです。例:

M = ROTATE * M

設定m34は、射影行列による事前乗算とほぼ同じです。つまり、次のとおりです。

M = PROJ * M

PROJ射影行列はどこにありますか-単位行列ですが、m34セットがあります)

これは完全に正しいわけではありません (そのため、私は大雑把に言い続けています) --M適切な場所に 0 と 1 がある場合にのみ機能します。基本的に、一般的なケースでは、設定するだけでm34は意味がありません。正しいことは、射影行列を掛けることです。

とにかく、これらすべてをまとめれば、最初の段落で私が言ったことがなぜ正しいのかがわかるはずです (私が間違いを犯していないと仮定して :)

于 2012-06-08T01:22:58.090 に答える