0

x、y、Z 平面用のスライダーを使用して、ビューの中心を中心に画像を回転させようとしています。フレーム境界 (700X700) 内で画像を回転させたいのですが、何らかの理由でフレームの端を中心に回転します。アンカーポイントをリセットしようとしましたが、何もしないようです。Y軸を中心に回転させるコードは次のとおりです。アンカー ポイント セクションがコメント アウトされていることに気付くでしょう。まったく影響がありませんでした。私が間違っていることについて何か考えはありますか?

     float angleYDeg = self.ySlider.value;
     float angleYRad = (angleYDeg / 180.0) * M_PI;

    // Disable Animation
     [CATransaction begin];
     [CATransaction setValue:[NSNumber numberWithBool:YES]
                  forKey:kCATransactionDisableActions];

 // Get Layers
     CALayer *containerLayer = [[self.imageView.layer sublayers] objectAtIndex:0];
     CALayer *holder = [containerLayer valueForKey:@"__holderLayer"];

     //CGPoint anchor = holder.anchorPoint;
     //anchor.y = self.imageView.frame.size.height/2;
     //holder.anchorPoint = anchor;

     // Update xAngle Value
     [containerLayer setValue:[NSNumber numberWithFloat:angleYRad] forKey:@"__angleY"];

    // Apply rotations
     CGFloat angleX = [[containerLayer valueForKey:@"__angleX"]floatValue];
     CATransform3D holderTransform = CATransform3DMakeRotation( angleX, 1.0f, 0.0f,  0.0f);
     holderTransform = CATransform3DRotate(holderTransform, angleYRad, 0.0f, 1.0f, 0.0f);
     holder.transform = holderTransform;

     [CATransaction commit];

     // Update Label
     self.yValueLabel.text = [NSString stringWithFormat:@"%4.0fº", angleYDeg]; 
4

2 に答える 2

0

変換を連続して実行すると、うまくいかないことがよくあります。angleX を変換すると、AngleY 変換が新しい座標系に基づいて実行されます。基本的に、すべての変換は「モデル」またはオブジェクトに対して相対的に行われます。

ほとんどの人は通常、変換がカメラ システムに対して行われること、またはビューを見ているときに行われることを期待しています。次のように変換の順序を逆にすることで、必要な結果が得られる可能性があります。

// Apply rotations
 CGFloat angleX = [[containerLayer valueForKey:@"__angleX"]floatValue];
 CATransform3D holderTransform = CATransform3DMakeRotation( angleYRad, 0.0f, 1.0f, 0.0f);
 holderTransform = CATransform3DRotate(holderTransform, angleX, 1.0f, 0.0f,  0.0f);
 holder.transform = holderTransform;

 [CATransaction commit];

モデルの座標ではなくカメラ座標に基づいてすべての動きを検討している場合は、それを LIFO システムと考えると役立つかもしれません (そうではありません!)。

于 2013-05-09T05:44:24.327 に答える