9

ViewController 内に一連の画像があります。

個々のレイヤーを変換して「フローティング」しています。

img.layer.transform = CATransform3DMakeTranslation(0.0f, 0.0f, myZ);

これにより、レイヤーを画面上に浮かせる効果が得られます。シミュレーターでは、目に見える効果はありません (これは正しいです)。

私がやりたいことは、デバイスを左/右/前方/または後方に移動すると、レイヤーが浮いているように微妙に見えるようにすることです。デバイスを左に傾けると、ビュー全体が右に傾くはずです。これにより、デバイスを動かすと隅々まで見えるようになります。つまり、画像が異なる速度で移動するため (Z インデックスに基づいて)、画像が実際に画面上に浮いているように感じられます。

これをデモするサンプルプロジェクトを含むテストプロジェクト(プロジェクトファイルはこちら)を作成しました。

私の問題は、私が数学者ではないことです。そのため、微妙な浮遊効果をシミュレートする最善の方法に苦労しています。今、私は DeviceMotion のリスナーを持っています。

self.view.layer.sublayerTransform = CATransform3DMakeRotation(20.0f * M_PI / 180.0f, 2*motion.attitude.pitch, -2*motion.attitude.roll, 0);

これは私が望むものに非常に近いですが、正確ではありません。

この効果は、さまざまなアプリケーションで使用できるものになると思います。私はこれを友人に拡張することを望んでおり、顔検出に取り組んでいます(電話/デバイスを完全に静止させている間でも、人の顔の動きに基づいて親ビューを移動します)。

「OpenGLを使用するだけ」という回答が得られることを認識しています。それは私が必要とする答えではありません-このプロジェクトに統合する方法を示すコードのチャンクを投稿しない限り。(解決すべき新しい問題を探しているわけではありません。:-)

繰り返しになりますが、現在の効果を確認したい人のために、完全なプロジェクトがここにあります ( iphone フローティング ビュー)。(これが機能するようになったら、後世のためにここにリンクされた完全な (機能する) プロジェクトを残しておきます。)

4

1 に答える 1

5

私はこれを持っていると思います!これを使って:

    [appDelegate.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                                   withHandler:
     ^(CMDeviceMotion *motion, NSError *error) {

         CATransform3D transform;
         transform = CATransform3DMakeRotation(motion.attitude.pitch, 1, 0, 0);
         transform = CATransform3DRotate(transform, motion.attitude.roll, 0, 1, 0);

         self.view.layer.sublayerTransform = transform;
     }];

軸を反転したい場合は、それらの 1 の前にマイナス記号を追加するだけです。

于 2011-03-26T14:33:18.657 に答える