ARKit/RealityKit中USDZ模型旋转动画无效果问题求助
ARKit/RealityKit USDZ模型旋转动画问题解决
问题描述
我是ARKit/RealityKit的新手,想要为加载的USDZ模型添加旋转动画,但始终无法实现。我尝试使用带时长参数的move(to:)方法,却完全没有效果,既无动画也不旋转;而直接设置orientation虽能旋转但无动画。相关代码如下:
guard let modelEntity = try? Entity.loadModel(named: "toy_biplane_idle") else { return } anchorEntity.addChild(modelEntity) var rotationTransform: Transform = Transform() rotationTransform.rotation = .init(angle: 30 * .pi / 180, axis: .init(x: 1, y: 1, z: 1)) // modelEntity.orientation = rotationTransform.rotation // this works but is not animated modelEntity.move(to: rotationTransform, relativeTo: modelEntity.parent, duration: 1.0) // no effect at all
问题原因
move(to:relativeTo:duration:)方法仅负责位置(position)的平滑过渡,不会处理旋转(rotation)的动画逻辑。你传入的Transform只设置了rotation,position为空(默认原点),但模型实际位置不在原点,导致动画执行后模型被移到不可见区域,旋转效果自然无法被观察到。
解决方案
方法1:使用专用旋转动画API
RealityKit提供了rotate(to:duration:timingFunction:)方法,专门用于实现旋转的平滑动画,直接指定目标旋转值即可:
guard let modelEntity = try? Entity.loadModel(named: "toy_biplane_idle") else { return } anchorEntity.addChild(modelEntity) // 目标旋转:绕x/y/z轴各旋转30度 let targetRotation = simd_quatf(angle: 30 * .pi / 180, axis: SIMD3(x: 1, y: 1, z: 1)) // 执行1秒的旋转动画,使用缓入缓出的时间曲线 modelEntity.rotate(to: targetRotation, duration: 1.0, timingFunction: .easeInOut)
方法2:修正move(to:)的使用逻辑
如果一定要用move(to:),需要保留模型当前的position,只修改rotation,确保动画只改变旋转属性:
guard let modelEntity = try? Entity.loadModel(named: "toy_biplane_idle") else { return } anchorEntity.addChild(modelEntity) // 基于当前Transform修改旋转,保留原有位置 var targetTransform = modelEntity.transform targetTransform.rotation = simd_quatf(angle: 30 * .pi / 180, axis: SIMD3(x: 1, y: 1, z: 1)) // 执行动画 modelEntity.move(to: targetTransform, relativeTo: modelEntity.parent, duration: 1.0)
额外注意事项
- 如果加载的USDZ模型自带动画(比如
toy_biplane_idle的 idle 动画),建议先暂停自带动画避免冲突:modelEntity.stopAllAnimations() - 确保模型已经被正确添加到场景实体树中(你当前的
anchorEntity.addChild(modelEntity)操作是正确的)
内容的提问来源于stack exchange,提问作者Programmer54
相关产品推荐
相关产品推荐

