RealityKit – 在 Xcode 13 中播放 USDZ 文件中的动画

RealityKit – Playing animation from USDZ file in Xcode 13

我正在尝试播放 usdz 文件中的动画。所以我得到了一个 .dae 文件和一个 .scn 文件,两者都是一样的。对于 RealityKit,他们只接受 .usdz 文件。所以我使用 Xcode 的导出器并将它们都导出为 .usdz 格式。但是动画不会转移。我还尝试复制 .scn 文件的场景图并将其粘贴到 .usdz 文件中,然后在 Xcode 中按下查看器底部中心的播放按钮。我可以看到动画播放了。

但是这是错误的,因为无法编辑 .usdz 文件。所以它不保存。因此,当我在 Xcode 上 运行 时,它不会在 ARview 中播放。这是我播放动画的代码。我已经尝试从堆栈溢出和苹果开发者论坛中查看一堆post。

bird = try! Entity.load(named: "plane")
bird.name = "bird"
resultAnchor.addChild(bird)
            
arView.scene.subscribe(to: SceneEvents.AnchoredStateChanged.self) { [self] (event) in
    if resultAnchor.isActive {
        for entity in resultAnchor.children {
            for animation in entity.availableAnimations {
                entity.playAnimation(animation.repeat())
            }
        }
    }
}.store(in: &birdAnimations) // Remember to store the cancellable!

我在 post

中找到了代码的结构

此外,我想重要的是要注意我在网上找到了一个包含动画的 .usdz 文件。当我在 finder 中右键单击-> 快速查看文件时,快速查看能够播放它。但是当我尝试在 Xcode 上播放动画时,它又没有播放。

如果您有任何疑问,需要我正在做的事情的清晰度或屏幕记录,请直接提问。

要播放动画,请使用 DidAddEntity 结构而不是 AnchoredStateChanged

import UIKit
import RealityKit
import Combine

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    var subscriptions: [AnyCancellable] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let model = try! Entity.load(named: "drummer.usdz")
        let anchor = AnchorEntity()
        anchor.addChild(model)
        arView.scene.anchors.append(anchor)
        
        arView.scene.subscribe(to: SceneEvents.DidAddEntity.self) { _ in
            if anchor.isActive {
                for entity in anchor.children {
                    for animation in entity.availableAnimations {
                        entity.playAnimation(animation.repeat())
                    }
                }
            }
        }.store(in: &subscriptions)
    }
}

我的问题不在于我的代码。这就是我将 .blend/.dae 文件转换为 .usdz 的方式。

我首先在 Blender 和 Maya 中将其导出为 .glb(适用于两者)。然后使用 Apple's Reality Converter 将其导出为 .usdz。能够正常播放动画。