Qt3D/QML导入glTF文件播放动画的ChannelMapper配置问题
Qt3D/QML 播放glTF内嵌动画解决方案
核心结论:你不需要手动配置ChannelMapper,Qt3D的SceneLoader加载完glTF文件后会自动解析内嵌动画,生成已经配置好映射关系的ClipAnimator实例,直接调用即可。
修正后可直接运行的代码
Entity { id: root Transform { id: planeTransform scale: 0.1 } components: [planeTransform, planeScene] SceneLoader{ id:planeScene source: "qrc:/Modells/3DModelle/plane/scene.gltf" onStatusChanged: { if (status === SceneLoader.Ready) { // 加载完成后获取内嵌的第一个动画 const animators = planeScene.animations if (animators.length > 0) { const planeClip = animators[0] planeClip.loops = Animation.Infinite planeClip.running = true // 把动画组件挂载到根Entity上 root.addComponent(planeClip) } } } } }
原代码问题说明
- 单独实例化的
AnimationClipLoader和ClipAnimator没有和SceneLoader加载的模型节点做属性绑定,手动配置ChannelMapper需要匹配glTF内的动画通道名和目标节点属性,实现成本高 - 没有利用SceneLoader内置的动画解析能力
其他适用场景说明
如果有自定义动画绑定、多动画切换的需求,可以参考以下方案:
- 多动画切换:直接遍历
planeScene.animations数组,按需控制不同ClipAnimator的running属性即可 - 手动配置ChannelMapper:
先打印动画通道名确认映射关系:
然后为每个通道添加对应ChannelMapping即可,示例:onStatusChanged: { if (planeClipLoader.status === AnimationClipLoader.Ready) { console.log(planeClipLoader.clip.channelNames) } }ChannelMapper { mappings: [ ChannelMapping { channelName: "Animation_0:plane_node.translation" target: planeTransform property: "translation" }, ChannelMapping { channelName: "Animation_0:plane_node.rotation" target: planeTransform property: "rotation" } ] }
内容的提问来源于stack exchange,提问作者Hammerpeter
相关产品推荐
相关产品推荐

