如何在Xcode中使用ARKit在特定的时间间隔内播放COLLADA动画(.dae)?

时间:2019-07-06 08:54:41

标签: xcode scenekit augmented-reality arkit realitykit

我的动画模型的总时间间隔为45秒。我点击模型,应该可以从一开始就播放,而不是从第15秒开始播放。

如果您以任何方式认为这是可能的,谁能帮我吗?

编辑:

一旦我加载动画模型,SceneKit就会播放动画。现在有了键,我借助遇到的自定义方法裁剪了动画。

通过点击模型,我列举了所有父/子节点以停止或从场景中删除动画。到目前为止,一切都很好。

当我尝试将裁剪的动画重新添加到场景时,出现问题。实际上没有任何事情发生,因为场景仍然闲置,没有任何动作。

我在这里做错什么了吗?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touchLocation = touches.first!.location(in: sceneView)

        // Let's test if a 3D Object was touch
        var hitTestOptions = [SCNHitTestOption: Any]()
        hitTestOptions[SCNHitTestOption.boundingBoxOnly] = true

        let hitResults: [SCNHitTestResult]  = sceneView.hitTest(touchLocation, options: hitTestOptions)

        let animation = animScene?.entryWithIdentifier("myKey", withClass: CAAnimation.self)
        print(" duration is...", animation!.duration)

        let animationNew = subAnimation(of:(animation)!, startFrame: 10, endFrame: 360)
        print("New duration is...", animationNew.duration)

        sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
            node.removeAllAnimations()
        }

        sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
            node.addAnimation(animationNew, forKey: "myKey")
        }        
   }

2 个答案:

答案 0 :(得分:1)

假设您可以使用RealityKit框架的move(to:relativeTo:duration:timingFunction:) method完成此操作。但是我还没有用过。

@discardableResult func move(to target: Transform, 
            relativeTo referenceEntity: Entity?, 
                              duration: TimeInterval, 
                        timingFunction: AnimationTimingFunction) -> AnimationPlaybackController

此方法可帮助您在一段时间内将实体移动到变换指定的新位置。但是您可以在macOS15 / iOS13及更高版本以及Xcode 11中使用它。

我认为使用.usdz比使用.dae文件格式更好。

答案 1 :(得分:0)

似乎我的.dae文件具有许多动画(具有多个ID),因此应将它们分组为一个。将它们组合在一起后,我就可以控制动画了,可以从我想要的任何帧播放它们。