【问题标题】:Control SCNAction with slider使用滑块控制 SCNAction
【发布时间】:2018-09-21 10:32:30
【问题描述】:

我正在为我的问题寻找解决方案: 我在 Xcode 中使用动作编辑器将动画定义为 SCNAction。现在我想用一个滑块来控制它。所以基本上操纵滑块会在动画中显示特定的时间/帧。

现在,我可以暂停/播放动画或将其重置为开头。我使用 Swift 代码解决了动作编辑器中的 SCNAction 实现了这一点。

据我研究,没有可能 立即将 SCNAction 动画到特定时间并停在那里。那会奏效。

如果 SCNActions 无法实现,我也对其他尝试感兴趣。这可能是根本无法实现的。谢谢。

【问题讨论】:

  • 您可以更新滑块didChange 上的SCNMatrix,其中滑块值用于计算位置。然后它看起来就像在滑动滑块时动画到它的位置
  • 但是整个动画过程本身变得更加复杂。动画将更像是“配置”而不是“设计”。尽管如此,它还是可以通过这种方式实现,并且可能在创建动画时我会同时使用:动作编辑器和从那里提取值。谢谢你的想法。
  • 有一个完整的开发者视频,但使用的是 UIKit。我只记得看过但不记得具体细节,你可能会在那里找到有用的东西 - developer.apple.com/videos/play/wwdc2017/230

标签: swift scenekit


【解决方案1】:

我找到了一个解决方案:我从 .dae 文件中加载了一个CAAnimation(看这里:https://stackoverflow.com/a/24924702/9625548,有点过时但仍然可用)。

使用SCNAnimationPlayer,我可以使用密钥寻址CAAnimation。与以下 代码我可以用UISlider控制我的动画:

let moment: TimeInterval = TimeInterval(self.animationTimeSlider.value)
guard let animationPlayer: SCNAnimationPlayer = node.animationPlayer(forKey: key) else{
                    return
                }
animationPlayer.animation.timeOffset = moment
animationPlayer.play()
animationPlayer.speed = 0.0

基本上,我读取拇指并将其转换为TimerInterval。我正在寻找SCNAnimationPlayer,如果没有找到给定密钥的SCNAnimationPlayer,则中止。然后我将.timeOffset 设置为我想要显示的那一刻。使用play(),动画从头开始+.timeOffset。最后,将.speed 设置为零。动画没有运行,但显示了这一刻。

注意:如果您让动画运行并以这种方式操作它,则必须重置它。否则它会变得一团糟。如果您让动画正常运行,您可以使用保存的布尔值来捕获这种情况。然后你知道你必须在使用滑块操作之前重置它。比如这样:

node.removeAllAnimations() node.addAnimation(animation, forKey: key) self.sceneView.scene.rootNode.animationPlayer(forKey: key)?.paused = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多