Three.js将对象附加到骨骼

时间:2013-09-26 14:36:02

标签: javascript three.js webgl

有没有办法将网格贴到骨头上?例如,我加载动画.js字符,我想将武器附加到它的手上。

2 个答案:

答案 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);