有没有办法将网格贴到骨头上?例如,我加载动画.js字符,我想将武器附加到它的手上。
答案 0 :(得分:11)
可以在Bone和Object3D原型上使用一些简单的hack。由于骨骼从Object3D继承,它们可能有子,因此我们可以很容易地.add()网格到任何骨骼。
但是,SkinnedMesh只会在非骨骼儿童身上调用updateMatrixWorld(),而在骨骼儿童身上调用update()。另外,骨骼为每个孩子调用update()(不管它是否是骨头)。以下代码段会更改此行为:
// modify bone update function to also update its world matrix
// possibly do this only to skeletons you need it for, not for all bones
var update = THREE.Bone.prototype.update;
THREE.Bone.prototype.update = function(parentSkinMatrix, forceUpdate) {
update.call(this, parentSkinMatrix, forceUpdate);
this.updateMatrixWorld( true );
};
// add noop update function to Object3D prototype
// so any Object3D may be a child of a Bone
THREE.Object3D.prototype.update = function() {};
// create buffalo ...
// create a mesh and add it to some bone
var mesh = new THREE.Mesh( new THREE.SphereGeometry(20), new THREE.MeshNormalMaterial() );
var bone = buffalo.bones[5];
bone.add(mesh);
答案 1 :(得分:9)
Three.js版本68处理这个开箱即用,但有点不同。 不需要更改内部功能。
它现在的工作原理如下:
现在可以在SkinnedMesh的子项中找到骨骼层次结构。
在子列表中找到骨骼,然后将对象附加到它:
player.children[0].add(testObj);
注意:如果您有骨骼层次结构(例如在导出的混合器模型中),那么它也会以three.js表示。如果你的目标骨骼有一个父骨骼,它将如下所示:
player.children[0].children[1].add(testObj);