是否可以通过使用three.js将转换应用于3D模型的骨骼来创建动态动画?我尝试移动和旋转SkinnedMesh的骨骼,但未更新网格。

        loader = new THREE.JSONLoader();
        loader.load('/JS-Projects/Virtual-Jonah/Modelos/initialPose.js',function jsonReady( geometry )
        {
            mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshNormalMaterial({skinning : true}) );
            mesh.scale.set( 10, 10, 10 );
            mesh.position.z = mesh.position.y = mesh.position.x = 0;
            mesh.geometry.dynamic = true;
            scene.add( mesh );

            var index = 0;
            for (var i = 0; i < mesh.bones.length; i++)
            {
                if (mesh.bones[i].name == "forearm_R")
                {
                    index = i;
                    break;
                }
            }


            setInterval (function ()
            {
                mesh.bones[index].useQuaternion = false;
                mesh.bones[index].position.z += 10;
                mesh.bones[index].matrixAutoUpdate = true;
                mesh.bones[index].matrixWorldNeedsUpdate = true;
                mesh.geometry.verticesNeedUpdate = true;
                mesh.geometry.normalsNeedUpdate = true;

                renderer.render(scene, camera);
            }, 33);

            renderer.render(scene, camera);
        });

我使用的模型是使用makeHuman(每晚构建)创建的,导出到Collada,导入Blender并导出到three.js JSON模型。该模型的链接如下:

https://www.dropbox.com/sh/x1606vnaoghes1y/gG_BcZcEKd/initial

谢谢!

最佳答案

是的你可以!
您需要同时设置mesh.skeleton.bones[i]mesh.skeleton.bones[i].rotation。旋转类型为mesh.skeleton.bones[i].position。位置类型为Euler。实际上,我已经使用https://github.com/lucasdealmeidasm/three-mm3d(包括带有骨骼可附着对象的工作皮肤网格)中的代码进行了实际测试,并且确实可以做到这一点。

请注意,Inateno的答案是非常错误的,在很多情况下这是必要的。
例如,在FPS中,人们同时使用动态和非动态动画。
当角色奔跑并握住枪支时,他将枪支指向的方向是动态设置的(可以使用mesh.skeleton.bones [i] .rotation,其中“i”是为此分配给手臂的骨骼的索引)动画的其余部分(包括行走)在编辑器中制作并加载。在three.js中,一个可以使用“THREE.AnimationHandler.update(delta);”然后在代码中更改单个骨骼的位置和旋转以解决这些问题。

10-06 15:26