【问题标题】:Dynamic bones animation in Three.jsThree.js 中的动态骨骼动画
【发布时间】:2013-12-24 08:52:05
【问题描述】:

是否可以通过使用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

谢谢!

【问题讨论】:

  • 我猜网格需要根据新的骨骼位置进行更新。方法 animation.update() 可能包含答案。否则,我找到了可能有帮助的方法 mesh.updateMorphTargets() 和 Bone.update()...
  • 这是否特定于three.js 和 Unity?一些答案似乎表明它是。

标签: javascript three.js


【解决方案1】:

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

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

【讨论】:

  • 谢谢卢卡斯,完美的答案!我现在可以让它工作了:)
  • @ProllyGeek 对不起,我不习惯发帖。它现在被标记为正确答案 =)
  • @FábioPicchi 很高兴你做到了,也很高兴你能找到答案:)
  • 导出到 Three.js 后,我的网格没有 skeleton 属性。相反,它有一个geometry 属性,它具有pos 和rotq 属性,这两个属性都是数组。如果我修改这些值,这仍然有效吗?知道为什么我的出口与您的不同吗?
  • 我想我只是自己想通了。只需将我的 Three.Mesh 更改为 Three.SkinnedMesh。
【解决方案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

这里有一篇关于动画问题的相关帖子,以防万一 Blender exports a three.js animation - bones rotate strangely

希望对你有帮助:)

【讨论】:

  • 对不起,我不同意。在大多数基本情况下你是对的,但是由于你需要用反向运动学制作一些高级动画(以避免月球行走,脚完全接触),你需要对骨骼应用动态规则,因此,使代码管理至少部分骨骼;甚至使用 Unity
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 2013-11-03
  • 2016-09-13
  • 2013-09-22
  • 2023-03-23
  • 2021-08-03
  • 2014-12-15
  • 2012-10-17
相关资源
最近更新 更多