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

眉间皱痕 提交于 2019-12-11 23:34:03

问题


I'm rewriting this question since I understand more about the bug now. It looks like when using the JSONLoader in r74, the first named bone in an exported Maya scene gets a duplicate of all the geometry.

EDIT: Here's a JSFiddle

In this example I have 2 boxes. Each box is bound to a single bone, and each of those bones has keyframes that animate the position and rotation. There is another bone that has no geometry bound to it, and has keyframes that make no change to its position or rotation.

The stationary bone is called "joint1" in Maya. The bones that actually have geometry bound to them are called "joint2" and "joint3". If I were to rename the stationary bone "joint4" the result would be a duplicate of both boxes attached to the currently animating "joint2".

My guess is that either this is a bug, or I'm doing something wrong when loading the animations. Any tips would be appreciated. The only workaround I can figure out right now is to separate each animated object into a separate file, and that's really not feasible. Plus, that wouldn't solve the issue when I have a multi-bone skeleton. This example is just single bone rigs with no actual deformation.

Here's my current loader code.

        //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();

回答1:


This is still an issue, but I've found an ok workaround.

Since the duplicated geometry always gets assigned the default lambert shader that is always included when using the Maya Exporter. As long as all the objects that are intended to be kept have a material other than the default in Maya, you can insert

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

into the loader code which will make any material with the default lambert invisible.

Here's a fiddle



来源:https://stackoverflow.com/questions/35614699/three-js-r74-jsonloader-binds-duplicate-of-all-geometry-to-first-bone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!