我想做的事情似乎很简单:我创建了一个老唱片的二维俯视图。我想绕其X轴旋转(使其倾斜)然后再绕其Z轴旋转。
我读过这里所有带有CATransform3D的问题,以及Steve Baker的"Matrices can be your friends"文章和Bill Dudney的书《Core Animation for Mac OS X and the iPhone》。我认为Brad Larson的"3-D Rotation without a trackball"代码是正确的,但由于他允许用户调整所有三个轴,所以我很难将他的代码缩小到我认为只有一个维度(旋转的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轴旋转的方式展示结果?我看到过一个关于组合变换的问题/答案,但那是一个比例变换后面跟着一个旋转变换。我已经尝试过变换变换,但似乎不是我认为应该得到的结果(即将一个变换的结果传递给下一个变换的参数似乎只是执行了一个完全的变换,然后动画另一个)。