Динамическая анимация костей в Three.js

Можно ли создать динамическую анимацию, применив преобразования к костям 3D-модели, используя three.js? Я попытался перемещать и вращать кости 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 и экспортированной в модель jsON. Ссылка на модель выглядит следующим образом:

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

Спасибо!

Ответы

Ответ 1

Да, вы можете! Вам нужно установить mesh.skeleton.bones[i], как mesh.skeleton.bones[i].rotation, так и mesh.skeleton.bones[i].position. Вращение имеет тип Euler. Позиция имеет тип Vector3. Я действительно протестировал это, используя свой код здесь https://github.com/lucasdealmeidasm/three-mm3d (который включает рабочую оболочку с объектами, прикрепленными к кости), и действительно можно сделайте это.

Обратите внимание, что ответ Инатено очень не прав, есть много случаев, когда это необходимо. Например, в FPS используется динамическая и нединамическая анимация. Когда персонаж бежит и держит пистолет, направление, в котором он указывает пистолет, динамически устанавливается (можно использовать mesh.skeleton.bones [i].rotation, где "i" - это индекс кости, назначенный на руку для этого), в то время как остальная часть анимации, включая ходьбу, сделана в редакторе и загружена. В трех случаях можно использовать "THREE.AnimationHandler.update(delta)"; а затем изменить положение и поворот отдельных костей в коде, чтобы решить эти проблемы.

Ответ 2

Я знаю, что вы можете экспортировать анимацию, управляемую костями, из Blender в формате JSON, для использования в THREE.js, есть несколько руководств по всему миру. Надеюсь, это поможет. Удачи.

Ответ 3

Если я понимаю, вы хотите сами создать анимацию внутри кода? Вы, как предполагается, должны это делать, в Unity у вас есть простой редактор анимации, вы никогда не манипулируете костями непосредственно в коде.

Это долгий, скучный, неэффективный. Для анимации модели используйте анимацию напрямую. Здесь результат анимации с некоторыми манипуляциями с костями, но есть анимация.

http://threejs.org/examples/webgl_animation_skinning_morph.html

Вот учебник по созданию простой анимации, если вам нужно http://blog.romanliutikov.com/post/60461559240/rigging-and-skeletal-animation-in-three-js

И вот связанный пост о проблемах с анимацией на всякий случай Блендер экспортирует анимацию three.js - кости вращаются странно

Надеюсь, это поможет вам:)