You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:53:09