私がやろうとしていることは、それで十分簡単なはずです。古いレコードの2Dトップダウンビューを作成しました。X軸で回転(元に戻す)してから、Z軸を中心に回転させます。
CATransform3Dが本体に含まれているすべての質問をここで読みました。また、SteveBakerの「Matricescanbe your friends」の記事と、BillDudneyの本「CoreAnimationfor Mac OS X andtheiPhone」を読みました。BradLarsonの「 「トラックボールなしの3D回転」にはすべて正しいコードがありますが、彼はユーザーに3軸すべての調整を許可しているため、コードを1次元(回転したz軸)に縮小するのに苦労しています。 )。
これが私がテストしている画像ですが、詳細が問題にとって重要であるというわけではありません。
私はそれを通常の方法で画面に表示します:(UIViewのサブクラスで)
- (void)awakeFromNib
{
UIImage *recordImage = [UIImage imageNamed:@"3DgoldRecord"];
if (recordImage) {
recordLayer = [CALayer layer];
[recordLayer setFrame:CGRectMake(0.0, 0.0, 1024, 1024)];
[recordLayer setContents:(id)[[UIImage imageNamed:@"3DgoldRecord"] CGImage]];
[self.layer addSublayer:recordLayer];
}
}
これが最初のテストで、画面に表示されるだけです;-)
次に、「レイバック」するために、レイヤーのX軸を中心に回転する変換を適用し、レイヤーのコンテンツを画像に設定した後、サブレイヤーを追加する前に次のコードを挿入します。
CATransform3D myRotationTransform =
CATransform3DRotate(recordLayer.transform,
(M_PI_2 * 0.85), //experiment with flatness
1.0, // rotate only across the x-axis
0.0, // no y-axis transform
0.0); // no z-axis transform
recordLayer.transform = myRotationTransform;
それは期待通りに機能しました:レコードはうまくリラックスしています。
そして、次のステップとして、レコードを回転させるために、このアニメーションをtouchesEndedイベントに関連付けましたが、テスト/学習フェーズを終了すると、このローテーションはユーザーの制御下に置かれなくなります。
CATransform3D currentTransform = recordLayer.transform; // to come back to at the end
CATransform3D myRotationTransform =
CATransform3DRotate(currentTransform,
1.0, // go all the way around once
(M_PI_2 * 0.85), // x-axis change
1.00, // y-axis change ?
0.0); // z-axis change ?
recordLayer.transform = myRotationTransform;
CABasicAnimation *myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
myAnimation.duration = 5.0;
myAnimation.fromValue = [NSNumber numberWithFloat:0.0];
myAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0];
myAnimation.delegate = self;
[recordLayer addAnimation:myAnimation forKey:@"transform.rotation"];
だから私がハングアップしているのはCATransform3DRotate呼び出しのベクトルであると確信しています(私を信じてください:私は変更を監視するためにそのベクトルで単純な変更を試みてきました...ここにリストされているのは単に最後の変更です私は試した)。私が理解しているように、変換でのx、y、zの値は、本質的に、アニメーション中に渡された値の値の範囲であるfromValueからtoValueまでのパーセンテージです。
私がこれを理解している正しい軌道に乗っている場合、これを単一の変換で表現することは可能ですか?または、アニメーションの有効なフレームごとに、元の直立した画像をz軸を中心にわずかに回転させてから、x軸を回転させて結果を配置する必要がありますか?変換の組み合わせについての質問/回答を見ましたが、それはスケール変換とそれに続く回転変換でした。私は変換の変換をいじりましたが、私が得るべきだと思うことをしていません(つまり、ある変換の結果を次の変換引数に渡すと、一方を完全に実行してからもう一方をアニメーション化するように見えました)。