3

カードが遠近法でテーブルに置かれているカードゲームに取り組んでいます。テーブルとカードの x 回転は同じ (45°) です。

カードがプレイヤーから遠ざかる (テーブルの上に移動する) につれて、カードを小さくしたいと思います。Z トランスレーション (または Z スケール) を変更するだけで目的の効果が得られると思いましたが、そうではありません。

同時に移動とスケーリングを行う必要がありますか?それとも z 深度を変更し、コア アニメーションにすべてを処理させる方法はありますか?

ありがとう!

4

1 に答える 1

8

これは、 Core Animationプログラミングガイドの「変換データ構造の変更」の例を除いて、直接文書化されていないものです。

リスト2の例はCATransform3D、をパースペクティブ変換として構成する方法を示しています。

リスト 2CATransform3Dデータ構造を直接変更する

 CATransform3D aTransform = CATransform3DIdentity;
// the value of zDistance affects the sharpness of the transform.
zDistance = 850;
aTransform.m34 = 1.0 / -zDistance;

何が起きてる?3D変換行列は4x4行列です(予想される3x3行列ではありません)。3行目の4列目(ゼロではなく1から数える)は、Z軸に沿った透視変換を制御します。「カメラ」からZ=0平面(画面と考えることができます)までの距離の負の逆数に設定します。

デフォルトでは、m34はゼロです。これは、カメラから画面までの距離が無限大であることを意味します。無限遠では、すべての(有限の)ポイントがカメラから等距離にあるため、遠近法はありません。これは「正射影」と呼ばれます。

距離を小さい値(m34大きくする)に設定すると、ますます強力な遠近法の投影が得られます。あなたはあなたが好きなものを見つけるために価値を試してみたいでしょう。

ほとんどのレイヤーは、サブレイヤーをZ=0平面に平坦化します。つまり、レイヤーに適用する透視投影はそのサブレイヤーには適用されず、すべてのサブレイヤーの変換を設定する必要があります。

ユーザーが特定のカードをタップできるようにする必要がない場合は、カードレイヤーをのサブレイヤーとして追加する必要がありますCATransformLayer。AはそのサブレイヤーをZ=0平面に平坦化CATransformLayer しないため、透視投影変換をにのみ適用できCATransformLayer、個々のカードレイヤーに適用することを心配する必要はありません。ただし、CATransformLayerはをサポートしていないためhitTest:、タッチイベントによってどのカードがタッチされたかを簡単に判断することはできません。

CATransformLayerクラスリファレンス

于 2012-12-31T19:24:30.877 に答える