Scenekit中如何启停导入USDZ文件的骨骼动画?
处理USDZ骨骼动画的启停方法
1. 定位包含骨骼动画的节点
USDZ里的骨骼动画不会绑定在单个几何体节点(比如你之前用的Geom),而是绑定到骨骼根节点(通常命名为Armature、Skeleton这类),或者场景的根节点。你可以用这段代码遍历节点树,找出所有带动画的节点:
func scanAnimatedNodes(node: SCNNode) { if !node.animationPlayers.isEmpty { print("动画节点:\(node.name ?? "未命名"),对应动画键:\(node.animationPlayers.keys)") } node.childNodes.forEach { scanAnimatedNodes(node: $0) } } // 传入你的backgroundNode或者场景根节点执行 scanAnimatedNodes(node: backgroundNode)
运行后控制台会输出目标节点名称和对应的动画键,这就是你需要的信息。另外你提供的SceneKit预览场景图里,也可以直接查看节点树,找到带有骨骼标识的节点,大概率就是动画载体。
2. 启停骨骼动画的代码实现
找到正确的节点和动画键后,启停逻辑和无骨骼动画一致,只是更换目标节点:
// 替换成你扫描到的节点名称和动画键 guard let skeletonRoot = backgroundNode.childNode(withName: "Armature", recursively: true), let animPlayer = skeletonRoot.animationPlayer(forKey: "Action") else { print("未找到目标动画") return } // 停止动画 animPlayer.stop() // 触发播放(主线程延迟执行确保渲染队列同步) DispatchQueue.main.asyncAfter(deadline: .now()) { animPlayer.play() }
3. 关于动画名称的说明
骨骼动画的键名没有固定值,完全看USDZ的导出设置:
- Blender导出的USDZ,默认动画键通常是
Action - 其他3D工具导出的话,可能是你设置的动画自定义名称
- 用上面的扫描代码或者Xcode预览的检查器(选中节点后看Animations面板),能直接拿到准确的动画名称
内容的提问来源于stack exchange,提问作者czane
相关产品推荐
相关产品推荐

