三.js r74 JSONLoader 将所有几何图形的副本绑定到第一个骨骼

Three.js r74 JSONLoader binds duplicate of all geometry to first bone

本文关键字:绑定 副本 第一个 几何图形 r74 js JSONLoader      更新时间:2023-09-26

我正在重写这个问题,因为我现在对这个错误有了更多的了解。看起来在 r74 中使用 JSONLoader 时,导出的 Maya 场景中的第一个命名骨骼会获得所有几何体的副本。

编辑:这是一个JSFiddle

在这个例子中,我有 2 个盒子。每个框都绑定到单个骨骼,并且每个骨骼中的每一个都有用于对位置和旋转进行动画处理的关键帧。还有另一块骨骼没有绑定几何图形,并且具有不更改其位置或旋转的关键帧。

静止骨骼在玛雅语中称为"joint1"。实际上绑定了几何形状的骨骼称为"关节2"和"关节3"。如果我将静止的骨骼重命名为"joint4",结果将是附加到当前动画"joint2"的两个框的副本。

我的猜测是,要么这是一个错误,要么我在加载动画时做错了什么。任何提示将不胜感激。我现在能想到的唯一解决方法是将每个动画对象分离到一个单独的文件中,这确实不可行。另外,当我有一个多骨骨架时,这并不能解决问题。此示例只是没有实际变形的单骨钻机。

这是我当前的加载程序代码。

        //Load Scene, Materials, and Animation
        var mixer, mesh;
        var actions = {};
        var sceneLoader = new THREE.JSONLoader();
        sceneLoader.load( sceneFile, function( geometry,materials ) {
           materials.forEach( function( material ){
              material.skinning = true; 
           });
            mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial( materials ) );
            mixer = new THREE.AnimationMixer( mesh );
            actions.main = mixer.clipAction( geometry.animations[ 0 ]);
            actions.main.setEffectiveWeight( 1 );
            actions.main.play();
            scene.add( mesh );
        });
        //Render
        var render = function () {
            requestAnimationFrame( render );
            controls.update;
            var delta = clock.getDelta();
            var theta = clock.getElapsedTime();
            if ( mixer ) { mixer.update( delta ); }
            renderer.render(scene, camera)
        }
        render();

这仍然是一个问题,但我找到了一个不错的解决方法。

由于复制的几何体始终被分配默认的朗伯着色器,因此在使用Maya导出器时始终包含该着色器。只要要保留的所有对象都具有 Maya 中默认材质以外的材质,就可以插入

mesh.material.materials[0].visible = false;

进入加载器代码,这将使任何具有默认朗伯的材料不可见。

这是一个小提琴