6

私はCATransform3D変換を使用して、擬似3Dパースペクティブエフェクトをビューに適用しています。既に変換されたCALayerのサブレイヤに逆CATransform3Dを適用する

iPhone 4のジャイロスコープを使用して、トランスフォームのパラメータを制御しています。

View with subviews

結果はこのようなものです::

3D transform in action

私の次のタスクがあることからサブビューを防ぐために、どちらかである

私は変換だビューは、いくつかのサブビューを持ちますサブビューが影響を受けないように逆変換を適用することができます。

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

I変換のために使用しているコード:

- (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];  
} 

Iは、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回転を適用しようとすると、サブビューはちらつきますが回転はしません。

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

サブビューをスーパービューと垂直にするにはどうしたらよいですか?

答えて

1

私は個々の変換作業を計算する基本的なアプローチを試みないことをお勧めします。また、これは、上位レベルのUIViewオブジェクトの代わりに、それぞれの小さなサブビューに対してCALayersを使用する方が簡単です。 3Dモデルを構築し、モデル全体を変換する基本的なアプローチは、あなたにとってはるかに優れています。

小さな正方形のそれぞれのサブレイヤを追加し、それらのサブレイヤを所定の位置に変換してください。update:メソッドを変更せずにすべてを変換する必要があります。 John Blackburn has a nice little tutorialが大いに役立つはずです。

関連する問題