0

Collada 形式 (knight.dae & archer.dae) の複数のモデルがあります。私の問題は、それらすべてをアニメーション化できないことです(Idle with 2-3framesとしましょう)。シーンをロードすると、1 つのアニメーション モデルと 1 つのスタイル モデルのみが取得されます (アニメーションなし、何もありません。3ds max でモデル化されているようです)。私の問題はスキンとモーフにあることはわかっていますが、たくさん検索しても答えが見つかりませんでした。経験不足のため、これまでのところ失敗しています。助けてください!

//animation length of the model is 150(and it hosts 4 different animations)
var startFrame = 0, endFrame = 150, totalFrames = endFrame - startFrame, lastFrame;
var urls = [];
var characters = [];
urls.push('3D/archer/archer.dae');
urls.push('3D/archer/archer.dae');
//here's the loader
loader = new THREE.ColladaLoader();
        loader.options.convertUpAxis = true;
        for (var i=0;i<urls.length;i++) {                           
        loader.load(urls[i],function colladaReady( collada ){
            player = collada.scene;
            player.scale.x = player.scale.y = player.scale.z =10;
            player.position.y=115;
            player.position.z=i*200;
            player.updateMatrix()
            skin = collada.skins [ 0 ];
            //skinArray.push(skin);;
        var mesh=new THREE.Mesh(new THREE.CubeGeometry(10,20,10,1,1,1));
        player.add(mesh);
        characters.push(mesh);
        scene.add( player );
            });
        }
//i added the cube because i use raycaster and it doesnt detect collada obj


// Here is where i try my animation.
        function animate() {
        requestAnimationFrame( animate );
        render();

    }
        function render() {
        update();
        renderer.render(scene,camera);

    }
    function update() {
        var delta = clock.getDelta();
        delta = delta / 2;      
        if ( t > 1 ) t = 0;
        if ( skin )
            {
        skin.morphTargetInfluences[lastFrame] = 0;
        var currentFrame = startFrame + Math.floor(t*totalFrames);
        skin.morphTargetInfluences[currentFrame] = 1;
        t += delta;
        lastFrame = currentFrame;
        }
    }
4

2 に答える 2

0

次のようなことを試してください....最初に:

var skins = [];

コラーダのコールバックで、すでに考えているように見える何か:

skins.push(collada.skins[0]);

レンダラーで、現在の if (skin) 句の代わりに:

t += delta;
lastFrame = currentFrame;
var currentFrame = startFrame + Math.floor(t*totalFrames);

for (var i = 0; i < skins.length; i++) {
  var skin = skins[i];
  if (skin) {
    skin.morphTargetInfluences[lastFrame] = 0;
    skin.morphTargetInfluences[currentFrame] = 1;
  }
}

つまり、 update() 関数ですべてのスキンをループする必要があります。それは問題ではなかったので、私はフレーム処理コードを非常に注意深くチェックしませんでした..スキンに異なる量のフレームがある場合は、コードでそれらを考慮する必要があります(おそらく、lastFrame、currentFrameなどの変数を、一致する配列にしますスキン配列)。

于 2013-04-25T10:32:30.037 に答える
0
        if ( skinArray[0] && skinArray[1] )
        {
        skinArray[0].morphTargetInfluences[lastFrame] = 0;
        skinArray[1].morphTargetInfluences[lastFrame] = 0;
        var currentFrame = startFrame + Math.floor(t*totalFrames);
        skinArray[0].morphTargetInfluences[currentFrame] = 1;
        skinArray[1].morphTargetInfluences[currentFrame] = 1;
        t += delta;
        lastFrame = currentFrame;
        }

私はこのコードを思いつきました、それは仕事をしますが、主にハードコードされているように感じるので、私はそれが好きではありません.

于 2013-04-25T11:44:02.083 に答える