首页 > 解决方案 > three.js 问题:角色切换时出现多个动画但不播放

问题描述

新手来了 我已经加载了一个 ,fbx 角色,以及来自 Mixamo 的其他动画剪辑。这个想法是当点击一个键(“Q”)时动画切换。运行时,角色加载并播放第一个动画剪辑。按键时,动画剪辑发生变化,但动画不播放。这是我目前所在的地方..角色动画

这是相关的代码片段......

        let Actions = [];
        let action;
        let animPaths = [ "./models/T-Pose.fbx","./models/Walking.fbx","./models/Running.fbx","./models/Idle.fbx" , "./models/Dancing.fbx"];
        let pathIDs = ["t-pose","walking", "running", "idle", "dancing"];
        let moe;
        let mixer;

        
        const loader = new FBXLoader();

        loader.load("./models/T-Pose.fbx", function(object){
            object.scale.set(0.1, 0.1, 0.1);
           /* object.traverse(function(child){
                if(child.isMesh){
                    child.material = material;
                }
            })*/
            moe = object;
            moe.position.y = -70;
            mixer = new THREE.AnimationMixer(object);
            action = mixer.clipAction(object.animations[0]);
            Actions.push(action);
            //action.play();
            scene.add(object);
            loadNextAnimation(loader);
            
        });


        function loadNextAnimation(loader){
            for(let i=1;i<animPaths.length;i++){
                
                loader.load(animPaths[i], (object) =>{
                    mixer = new THREE.AnimationMixer(moe);
                    Actions.push(mixer.clipAction(object.animations[0]));
                    scene.add(object);
                    action = Actions[i];
                    mixer.stopAllAction();
                    action.play();
                })
            }
            
        }


        let i = 0;
        let fwd = true;
        document.onkeydown = function(event) {
            // 81 = q
            
            if(event.keyCode == 81){
                if(i < 1) fwd = true;
                if(i > Actions.length) fwd = false;
                if(fwd){
                    i++;
                }else{
                    i--;
                }
                
                action = Actions[i];
                mixer.stopAllAction();
                //mixer.reset();
                action.play();
                
                console.log("i = " + i);
                console.log(animPaths[i]);
                document.getElementById("testtext").value = "currentClip = "+pathIDs[i];
                animate();
            }
        };

谁能告诉我我在哪里搞砸了?谢谢。

标签: javascriptthree.js

解决方案


找到解决方案(感谢 Harold)。我在上传 T-Pose 时创建了一个混音器。然后,在loadNextAnimation(loader)函数中,每次加载新动画时,我都会创建一个新的混音器,覆盖之前的混音器。只需删除线混合器 = new THREE.AnimationMixer(moe); 解决了这个问题。


推荐阅读