SceneKit 中的自定义动画属性

Posted

技术标签:

【中文标题】SceneKit 中的自定义动画属性【英文标题】:Custom animatable properties in SceneKit 【发布时间】:2012-07-29 09:13:28 【问题描述】:

我知道可以创建custom animatable properties in Core Animation,但是在 OS X 10.8 的 SceneKit 框架中呢? SCNAnimatable 似乎没有公开与 CALayer 相同的 API,用于使属性可动画化。

在我的应用程序中,我有一个名为StarfieldSCNNode 子类,我使用SCNNodeRendererDelegate 从旧的OpenGL 应用程序移植了它。 Starfields 公开了一个名为 warpFactorGLfloat 属性:

@interface Starfield : SCNNode<SCNNodeRendererDelegate> 
    // other stuff that's not really important for this question
    GLfloat warpFactor;


@property(nonatomic) GLfloat warpFactor;
@end

但是当我尝试向它添加动画时,像这样:

CABasicAnimation *warp = [CABasicAnimation animationWithKeyPath:@"warpFactor"];
warp.toValue = @1.0;
warp.duration = 5.0;
[starfield addAnimation:warp forKey:@"warp"];

我在控制台中得到以下信息:

[SCNKit ERROR] warpFactor is not an animatable path (from <unnamed SCNNode 0x1016473c0, no children>)

我知道 SceneKit 是全新的,但有谁知道如何使用它?

【问题讨论】:

我真的很惊讶这是有人在这里提出的关于 SceneKit 的第一个问题。 【参考方案1】:

解决方法/破解:

创建一个无几何节点并为该节点上的一些可动画属性设置动画,例如不透明度 使用SCNSceneRendererDelegate 挂钩到渲染过程的适当阶段,并使用无几何节点的动画属性值手动更新您的自定义属性(确保从节点的presentationNode 读取动画属性)

这个方案很丑,但是它允许你通过SCNTransaction或CAAnimationGroup将自定义属性的动画与其他动画同步

【讨论】:

我创建了一个“插值节点”来执行此操作:我为 CIFilter 属性之类的东西设置了动画,并评估了每一帧的表示值以执行我需要的操作。效果很好。【参考方案2】:

SceneKit 不支持自定义动画键路径

【讨论】:

这当然看起来有道理,但在放弃之前,我想确认一下,事实上我想做的事情是不可能的。你能指出我确认这一点的文档或其他任何内容吗? SceneKit 的文档非常少。我看了看,什么也没找到。错误消息可能是您能得到的最好的消息。 是的,我希望其他人能够提供不同的答案,但看起来这可能是我们能想到的最好的方法,至少在 Apple 发布更好的文档之前。接受。

以上是关于SceneKit 中的自定义动画属性的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewFlowLayout 中的自定义动画 - 水平滚动方向

动画状态栏以及segue中的自定义转换

如何将 UINavigationControllerDelegate 中的自定义过渡动画应用于特定的推送和弹出事件?

我的轮播和我的自定义动画中的问题

自定义动画animate()

containerView的自定义动画中的modalPresentationStyle .overCurrentContext返回黑屏