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

Posted

技术标签:

【中文标题】有没有办法用关键点进行 3D 变换?【英文标题】:Is there a way to do 3D transforms with keypoints? 【发布时间】:2013-05-17 08:35:49 【问题描述】:

我创建了一个 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 轴旋转,逐渐衰减。

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

但是

【问题讨论】:

【参考方案1】:

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

从源头开始问题来自使用removedOnCompletion。通过这样做,您将引入演示文稿(屏幕上显示的内容)和模型(图层的属性值)之间的差异。一种更简洁的方法是显式设置结束值并从前一个值动画到结束值。当动画结束时,这将使您处于干净的状态。

【讨论】:

谢谢大卫。 . . CAKeyFrameAnimation 可以与 3D 变换一起使用吗?您指定的值是什么? . .关于从原点开始,您的意思是我应该避免设置该属性? (我将其设置为 NO) 啊——我看到了如何将关键帧动画与 3D 变换和旋转一起使用——现在正在尝试。 OK - 如果我将最后一个 toValue 保存为 fromValue,我仍然可以按照我的方式进行操作。 . .但关键帧无疑会更好。 @JasperBlues 关键帧是 解决方案,当您想通过一系列值对 same 属性进行动画处理时。设置一系列动画有时是必要的,但大多只是杂乱无章。 @JasperBlues 避免使用removedOnCompletion 只是为了清洁。 Core Animation 中的动画不会修改它们动画的实际层,它们只会改变屏幕上显示的内容。如果您为属性设置动画并检查图层的值,它不会改变。在实际动画中这并不重要,但是如果您不删除动画,那么您最终会处于模型中的值与屏幕中显示的内容不同的状态。这可能会导致诸如命中测试之类的事情搞砸。总之,引入不必要的状态差异是不好的。

以上是关于有没有办法用关键点进行 3D 变换?的主要内容,如果未能解决你的问题,请参考以下文章

SIFT3D(3D尺度不变特征变换)算法

SIFT3D(3D尺度不变特征变换)算法

CSS3 3D酷炫立方体变换动画

获取梯形的矩阵3d变换?

Unity3D数学库的几个关键点

检测计算机是不是可以正确支持 3D 变换