有没有办法用关键点进行3D变换?

时间:2013-05-17 08:35:49

标签: ios objective-c cocoa-touch cocoa core-animation

我创建了一个3D立方体视图转换,它执行以下操作:

  • 创建图层容器。
  • 在2D空间中添加当前视图。
  • 将下一个视图添加到右侧并旋转90度(就像在多维数据集中一样)
  • 执行动画以旋转多维数据集。

这是代码 - 它的工作正常。 。 。实际问题如下:

- (CAAnimation*)makeRotationWithMetrics:(BBRotationMetrics*)metrics
{
    [CATransaction flush];
    CAAnimationGroup* group = [CAAnimationGroup animation];
    group.delegate = self;
    group.duration = metrics.duration;
    group.fillMode = kCAFillModeForwards;
    group.removedOnCompletion = NO;
    group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    CABasicAnimation* translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"];
    translationX.toValue = metrics.translationPointsX;
    CABasicAnimation* rotation = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"];
    rotation.toValue = metrics.radians;

    CABasicAnimation* translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"];
    translationZ.toValue = metrics.translationPointsZ;
    group.animations = [NSArray arrayWithObjects:rotation, translationX, translationZ, nil];

    return group;
}

在动画结束时,我想进行一次微动,就像立方体安装在弹簧上一样。我试过播放一系列动画绕Y轴旋转,逐渐衰减。

我已经设置了一系列动画,但每个动画都是从原点开始的,而不是图层所到达的最后一个点。 。 。我该如何解决这个问题?一种方法是首先在图层上设置变换,

但有没有办法用关键点进行3D变换?

1 个答案:

答案 0 :(得分:1)

听起来像你正在寻找CAKeyframeAnimation。您没有指定toValue,而是传递values和可选keyTimes的数组,包括起始值和结束值。

原点问题的起点来自于使用removedOnCompletion。通过这样做,您将介绍演示文稿(屏幕上显示的内容)和模型(图层的属性值)之间的差异。更简洁的方法是明确地将结束值和动画从前一个值设置为结束值。这将使动画结束时处于干净状态。