如何反向播放USDZ实体动画? 我试图给速度设置一个负值,就像我在SceneKit中所做的那样,以使动画反向播放,但它不起作用. 以下是我的代码:

import SwiftUI
import RealityKit

struct ImmersiveView: View {
    @State var entity = Entity()
    @State var openDoor: Bool = true
    
    var body: some View {
        RealityView { content in
            if let mainDoor = try? await Entity(named: "Door.usdz") {
                
                if let frame = mainDoor.findEntity(named: "DoorFrame")
                {

                    frame.position = [0, 0, -8]

                    frame.orientation = simd_quatf(angle: (270 * (.pi / 180)), axis: SIMD3(x: 1, y: 0, z: 0))
                    
                    content.add(frame)
                    
                    entity = frame.findEntity(named: "Door")!
                    
                    entity.components.set(InputTargetComponent(allowedInputTypes: .indirect))
                    
                    entity.components.set(HoverEffectComponent())
                    
                    let entityModel = entity.children[0]
                    
                    entityModel.generateCollisionShapes(recursive: true)
                }
            }
        }
        .gesture(
            SpatialTapGesture()
                .targetedToEntity(entity)
                .onEnded { value in
                    print(value)
                    if openDoor == true
                    {
                        let animController = entity.playAnimation(entity.availableAnimations[0], transitionDuration: 0 , startsPaused: true)

                        animController.speed = 1.0
                        animController.resume()
                        
                        openDoor = false
                    }
                    else
                    {
                        let animController = entity.playAnimation(entity.availableAnimations[0], transitionDuration: 0 , startsPaused: true)
                        
                        animController.speed = -1.0 // it does not work to reverse
                        animController.resume()
                        
                        openDoor = true
                    }
                }
            )
    }
}

门应该在已经发生的第一次点击时打开,在第二次点击时关闭,因为它不会反转播放动画

enter image description here

如果你想试试,这里还有我的门USDZ的链接 enter link description here

推荐答案

在visionOS 1.1中,AnimationPlaybackController对象仍然不能像在iOS RealityKit中那样播放反转资源动画.目前,我建议使用Autodesk Maya等创作工具来创建USDZ模型的反向动画.

struct ContentView: View {
    @State var controller: AnimationPlaybackController? = nil
    
    var body: some View {
        RealityView { content in
            if let sktr = try? await Entity(named: "Skater.usdz") {
                sktr.position.z = -3
                
                let resource = sktr.availableAnimations[0].repeat(count: 5)
                controller = sktr.playAnimation(resource)

                controller?.speed = -1.0         // not working in visionOS
                content.add(sktr)
            }
        }
    }
}

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

SwiftUI正在初始化不带状态变量的绑定变量

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

了解SWIFT中的命名VS位置函数调用

Swift数据关系

有没有办法让文本字段以不同的 colored颜色 显示而不影响半透明背景?

如何在 SwiftUI 中为过渡动画保持相同的标识

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

macOS 的窗口框架中使用的真实类型和真实类型是什么?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

如何删除 macOS 中的所有命令?

SwiftUI 分段 Select 器的问题

在 Swift 中为(递归)扩展提供默认实例参数

如何获得不同的插入和移除过渡动画?

在 SwiftUI 中,如何在 UIView 内或作为 UIView 使用 UIHostingController?

快速覆盖属性

不能从非开放类继承 swift

ld:入口点(_main)未定义.对于架构 x86_64:Xcode 9

swift中的匿名类