gpt4 book ai didi

ios - SceneKit 加载节点与来自单独的 scn 文件的动画

转载 作者:可可西里 更新时间:2023-11-01 03:43:03 24 4
gpt4 key购买 nike

我有一个动态创建 SCNView 的 View 。它的场景是空的,但是当我按下一个按钮时,我想从单独的 scn 文件中添加一个节点。该文件包含动画,我希望它在主场景中具有动画效果。问题是在将对象添加到场景后它没有动画。当我将此文件用作 SCNView 场景时,它会起作用。 isPlaying 和循环已启用。我还需要做什么来导入带有动画的节点?示例代码如下:

override func viewDidLoad() {
super.viewDidLoad()

let scene = SCNScene()
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
sceneView.scene = scene
sceneView.loops = true
sceneView.isPlaying = true
sceneView.autoenablesDefaultLighting = true
view.addSubview(sceneView)


let subNodeScene = SCNScene(named: "Serah_Animated.scn")!
let serah = subNodeScene.rootNode.childNode(withName: "main", recursively: false)!

scene.rootNode.addChildNode(serah)


}

最佳答案

您需要从场景 Serah_Animated.scn 中获取动画,这将是一个 CAAnimation 对象。然后将该动画对象添加到主场景的根节点。

let animScene = SCNSceneSource(url:<<URL to your scene file", options:<<Scene Loading Options>>)
let animation:CAAnimation = animScene.entryWithIdentifier(<<animID>>, withClass:CAAnimation.self)

您可以使用 Xcode 中的场景编辑器从 .scn 文件中找到 animID,如下所示。

SceneKit AnimationID from the Xcode Scene Editor

现在您可以将动画对象添加到您的根节点。

scene.rootNode.addAnimation(animation, forKey:<<animID>>)

请注意,我们正在重用 animID,这样您也可以从节点中删除动画。

scene.rootNode.removeAnimation(forKey:<<animId>>)
  • 我上面的解决方案假定您的动画是单个动画。如果你看到一堆动画,你需要添加所有的动画节点。在我的工作流程中,我将 Blender 中的文件导出为 Collada 格式,然后使用 Automated Collada Converter以确保我有单个动画节点。
  • Related SO answer
  • 您还可以使用 entriesWithIdentifiersOfClass(CAAnimation.self) 以编程方式获取 animID,这在您有一堆动画而不是上面的单个动画时很有用,或者如果您只想添加动画而不用担心之前的 animID
  • Apple Sample Code for scene kit animations ,请注意示例代码在 ObjC 中,但转换为 Swift 应该是直截了当的。

关于ios - SceneKit 加载节点与来自单独的 scn 文件的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41130425/

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