是否可以通过使用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
谢谢!
答案 0 :(得分:14)
是的,你可以!
您需要设置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,其中&#34; i&#34;是分配给它的骨骼的索引。动画的其余部分,包括行走,是在编辑器中制作并加载的。可以在three.js中使用&#34; THREE.AnimationHandler.update(delta);&#34;然后改变单个骨头&#39;代码中的位置和旋转以解决这些问题。
答案 1 :(得分:-1)
我知道你可以用JSON格式从Blender导出一个骨骼驱动的动画,用于THREE.js,网上有一些教程。我希望这有帮助。祝你好运。
答案 2 :(得分:-4)
如果我没有想要在代码中自己创建动画? 你应该注意到这一点,在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
希望这会对你有所帮助:)。