如何在Swift中访问多个动画?

时间:2018-12-03 14:07:13

标签: ios swift xcode scenekit arkit

Image of the file hierarchy in xcode of my animation file

问题:

xcode正在识别单个Collada(.dae)文件的多个动画。但是我找不到任何有关如何直接访问这些动画的文档。我尝试使用狐狸游戏示例,但它仅加载其中一个动画。

这是我的代码:

let modelNode = self.addModel_DAE_return(x: 0, y: 0, z: 0, scaleFactor: 0.0005, fileName: "models.scnassets/export_014/export_014_model.dae")

// add the animation to the model

let modelAnim = self.loadAnim_DAE(fileName: "models.scnassets/export_014/export_014_anim.dae")
                modelNode.addAnimationPlayer(modelAnim, forKey: "headMove")

modelAnim.play()

// add the model to the scene
node.addChildNode(modelNode)

如何访问和加载其他动画?

上下文:

我正在制作一个AR应用程序。我以Apple Image Recognition示例为基础。

这是它的链接: https://developer.apple.com/documentation/arkit/recognizing_images_in_an_ar_experience

我在Maya中对骨骼进行了动画处理,并使用Maya的OpenCollada扩展名将动画导出到COLLADA(.DAE)文件中。

我为模型和动画导出了单独的文件,因为如果将它们导出为单个文件,则每次尝试访问文件以检查是否注册了任何动画时,我的动画都不会导出并且xcode崩溃。

我想访问动画文件的“实体”,以便我可以循环播放,加载和附加动画,但是我不能

我也已经研究过GameKit,但是,没有办法用SceneKit做到这一点吗?

1 个答案:

答案 0 :(得分:0)

装备中的每个关节都有动画信息 最初,我只是在第一个具有动画的关节上获得信息,而不是在其子节点上也附加动画的信息

即假设您的钻机等级为 臀部>右肩>手臂>肘>手腕

您的动画在肩膀,手臂,肘部和腕关节上

没有在髋关节上有任何动画

使用enumerateChildNodes只会从肩关节获取信息

使用enumerateHierarchy将捕获来自肩膀,肘部和腕关节的所有动画信息

有关我使用的功能,请参见下文: 请注意,我已经将3D模型分别加载并保存到SCNNode上,并且已将其传递给我,以便可以将动画附加到其上

func loadAttachAnim_DAE(fileName: String, modelNode: SCNNode){
        let scene = SCNScene(named: fileName)!

        //find top level animation
        var animationPlayer: SCNAnimationPlayer! = nil


        scene.rootNode.enumerateHierarchy{ (child, stop)  in
            if !child.animationKeys.isEmpty {
                print ("child = \(child) -----------------")
                animationPlayer = child.animationPlayer(forKey: child.animationKeys[0])

                modelNode.addAnimationPlayer(animationPlayer, forKey: "\(child)")
                animationPlayer.play()

            }
        }
    }