2

を通じて得られる視点についてお聞きしたいですCATransform3D。320x480 のビューがあり、これを適用する場合:

    CATransform3D perspective = CATransform3DIdentity;
    CGFloat zDistance = 1000;
    perspective.m34 = 1.0 / -zDistance;  
    view.layer.sublayerTransform = perspective;

オブザーバーが画面の中心をまっすぐ見ているように見えるパースペクティブを作成するため、変換されるサブビューが画面上のどこにあるかによって、同じ変換が異なって見えます。たとえば、ビューが画面の中央にある場合、ビューを傾けると次のようになります。

左下隅にある場合は、次のようになります。

今、私の問題は、私が変換しているビューが320x480pxの大きさの別のビューのサブビューである場合にのみ、画面に対するパースペクティブを作成することです。しかし、変換したいビューが 100x100px しかないビューのサブビューである場合はどうなるでしょうか? スーパービューが画面のサイズでない場合、画面全体に対してパースペクティブを作成する方法はありますか? 前もって感謝します

4

1 に答える 1

0

アップルによると

「アンカーポイント プロパティは、位置座標に対応するレイヤーの境界内の場所を指定する CGPoint です。アンカー ポイントは、境界が位置プロパティに対してどのように配置されるかを指定し、変換が適用されるポイントとして機能します。その周り。"

パースペクティブは、デフォルトでは画面の中心やレイヤーの中心に対して相対的であってはなりません。アンカーポイントはそこにありますか? それとは別に、あなたが求めているように見えるのは、あなたの視点が別の点に関連しているように見せる方法です. 秘訣は、パースペクティブ マトリックスを乗算することによってパースペクティブが作成されることです。m34 を小さな数に設定しても魔法は何も起こりません。射影行列を掛けているだけです。

YourProjection = {1,0,0             ,0,
                  0,1,0             ,0,
                  0,0,1             ,0,
                  0,0,-1.0/zdistance,1};

連続する変換を乗算することで組み合わせることができることに注意してください。レイヤーを好きな場所に変換し、射影マトリックスを適用してから、別の原点から元に戻し、プレスト、パースペクティブに変換するだけです。

float x = your coordinates relative to the screen center;
float y = same thing
TranslationMatrix = {1,0,0,0,
                     0,1,0,0,
                     0,0,1,0,
                     x,y,0,1};
ReverseTranslationMatrix = {1,0,0,0,
                            0,1,0,0,
                            0,0,1,0,
                            -x,-y,0,1};
//now just multiply them all together
Final = ReverseTranslation*YourProjection*Translation;

自分で行列計算を行う必要があります。できれば、乗算を実行できる一般的な 4x4 列の主要な行列クラスが既にあることを願っています。そうでない場合は、作成することをお勧めします。また、興味のある方は読んでみてはいかがでしょうか。 これは、現在使用している行列がどのように機能するかについての説明です。または、射影行列の別の解釈については、これを参照してください。

于 2012-06-27T16:03:03.680 に答える