6

CATransform3D変換を使用して、疑似3D遠近効果をビューに適用しています。

私はiPhone4のジャイロスコープを使用して、変換のパラメーターを制御しています。

私が変換しているビューには、いくつかのサブビューがあります。

サブビューで表示

結果は次のようになります。

動作中の3D変換

次のタスクは、メインビューが変換されるときにサブビューが変換されないようにするか、サブビューが影響を受けないように逆変換を適用することです。

私の目的は、各サブビューをスーパービューに対して垂直にして、「立っている」という印象を与えることです。

変換に使用しているコード:

- (void)update:(NSTimer *)timer
{
    roll = [[[_manager deviceMotion] attitude] roll];
    pitch = [[[_manager deviceMotion] attitude] pitch];
    yaw = [[[_manager deviceMotion] attitude] yaw];

    CALayer *layer = [self.view layer];
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI / 180.0f, 0.0f, 0.0f, 1.0f); // make landscape again  
    rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply the perspective
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f);
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f);
    [layer setTransform:rotationAndPerspectiveTransform];       
}

Y軸の周りのサブビューに90度の遠近法の回転を適用することにより、変換を反転させるために次のコードを試しました。

for (UIView *subview in [self.view subviews])
{
    CALayer *sublayer = [subview layer];
//CATransform3D inverseTransformation = [sublayer transform];
CATransform3D inverseTransformation = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply perspective
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
[sublayer setTransform:inverseTransformation];
}

しかし、これが成功するのは、サブビューを非表示にすることだけです。レイヤーからの既存の変換を使用し[sublayer transform]て3D回転を適用しようとすると、サブビューがちらつきますが、回転しません。

行列の数学についての私の知識はあまりよくないので、これが正しいアプローチであるかどうかはわかりません。

サブビューをスーパービューに対して垂直に配置するにはどうすればよいですか?

4

1 に答える 1

1

個々の変換を計算するという基本的なアプローチを機能させようとしないことをお勧めします。また、これは、高レベルのUIViewオブジェクトの代わりに、小さなサブビューごとにCALayersを使用する方が簡単です。3Dモデルを構築し、モデル全体を変換するという基本的なアプローチは、はるかにうまく機能するはずです。

メインレイヤーから始めて、小さな正方形ごとにサブレイヤーを追加し、それらのサブレイヤーを所定の位置に変換update:します。次に、質問にリストされているメソッドが、変更なしですべてを変換するように機能するはずです。John Blackburnには、非常に役立つはずのちょっとしたチュートリアルがあります。

于 2011-11-11T15:04:45.643 に答える