gpt4 book ai didi

animation - SceneKit - 停止连续循环 Collada 动画

转载 作者:行者123 更新时间:2023-12-02 22:51:49 28 4
gpt4 key购买 nike

我正在使用 SceneKit 加载 Collada (.dae) 文件。

无论我尝试过什么,动画都会连续循环重复,而我只希望它播放一次然后停止。

这是加载代码,其中 sceneView 是我的 SCNView:

    //Load the scene and play
let scene = SCNScene(named: "Scenes.scnassets/test4.dae")
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true

场景正确加载,并且动画根据需要在加载时播放,但以连续循环的方式播放。

我尝试按如下方式删除所有动画:

sceneView.scene?.rootNode.removeAllAnimations()

但这似乎没有效果。

我还尝试检索所有动画并将repeatCount = 1甚至设置为0

    let url = NSBundle.mainBundle().URLForResource("Scenes.scnassets/test4", withExtension: "dae")
let sceneSource = SCNSceneSource(URL:url!, options: nil)


let animationIndentifiers = sceneSource?.identifiersOfEntriesWithClass(CAAnimation)

if let ids = animationIndentifiers
{
for id in ids {
let animation: CAAnimation = sceneSource!.entryWithIdentifier(id as! String, withClass: CAAnimation.self)! as! CAAnimation
animation.repeatCount = 1
}
}

我也尝试过另一种方式:

let keys = sceneView.scene!.rootNode.animationKeys()//获取所有动画关键点

if let theKeys = keys {
for key in theKeys {
let animation = sceneView.scene?.rootNode.animationForKey(key as! String)
animation?.repeatCount = 1
}
}

但还是没有运气。

我在 Collada 文件本身中找不到任何明显导致动画重复的内容。但是,我注意到 Mac 磁盘上的 .dae 文件图标有一个播放按钮,单击此按钮还会连续循环播放图标内的动画。

更新:

我现在注意到,在上面的代码中,我设置了常量“动画”属性,并且这不会复制回实际的场景节点。此外,.dae 文件中的唯一动画位于子节点中。这是我的下一次尝试:

  //Get the child nodes
let children = scene?.rootNode.childNodes

//Initialise a childNode counter
var childCount = 0

//Iterate through the child nodes
if let theChildren = children {
for child in theChildren {
let keys = child.animationKeys() //get all the animation keys
//Iterate through the animations
if let theKeys = keys {
for key in theKeys {
let animation = child.animationForKey(key as! String)
println("Initial Repeat count: \(animation.repeatCount)")
animation.repeatCount = 1
//Remove existing animation
scene?.rootNode.childNodes[childCount].removeAnimationForKey(key as! String)
//Add amended animation
scene?.rootNode.childNodes[childCount].addAnimation(animation, forKey: key as! String)
}
}
childCount++
}
}

实际上只有一个动画附加到一个子节点。 (我还尝试使用实际的动画 ID 字符串代替上面的“key”来设置它。)

上面显示了初始重复计数:inf事后检查确实设置为 1。但是,动画仍然无限循环运行:-(

任何解决此问题的帮助将不胜感激。

进一步更新

我现在已经使用 Maya 创建了一个带有简单动画的新 Collada 文件,并且出于某种原因,上面尝试的试验之一实际上有效:

    func sceneSetup() {
let scene = SCNScene(named: "Scenes.scnassets/test10.dae")

let children = scene?.rootNode.childNodes
var childCount = 0
if let theChildren = children {
for child in theChildren {
let keys = child.animationKeys() //get all the animation keys
if let theKeys = keys {
for key in theKeys {
let animation = child.animationForKey(key as! String)
animation.repeatCount = 1
scene?.rootNode.childNodes[childCount].removeAnimationForKey(key as! String)
scene?.rootNode.childNodes[childCount].addAnimation(animation, forKey: key as! String)
}
}
childCount++
}
}
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
}

如果有人能解释那就太好了!

啊,但是还有一个问题!

这是动画的开始帧:

Start frame

这是我们想要结束的结束帧:

End frame

但在动画结束时,场景跳回到开始 View 。

我通过修改动画“修复”了这个问题,使第 1 帧是最终帧的副本。这有效并且不引人注目,但似乎不是一个非常优雅的解决方案。

最佳答案

对于跳回第一帧的动画,isAppliedOnCompletion 值就是您要查找的值。

animation.repeatCount = 1
animation.isAppliedOnCompletion = true

这将确保动画在最后一帧暂停。

关于animation - SceneKit - 停止连续循环 Collada 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29692388/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com