Three.js将对象附加到骨骼

Gug*_*gis 10 javascript webgl three.js

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

mor*_*is4 11

可以在Bone和Object3D原型上使用一些简单的hack.由于骨骼从Object3D继承,它们可能有子,因此我们可以很容易地.add()网格到任何骨骼.

但是,SkinnedMesh只会在非Bone子项上调用updateMatrixWorld(),而对Bone子项调用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);
Run Code Online (Sandbox Code Playgroud)

  • 哇.这样的答案.很抱歉.非常感谢你.哇. (3认同)

JPS*_*JPS 9

Three.js版本68开箱即用,但有点不同.不需要更改内部功能.

它现在的工作方式如下:

现在可以在SkinnedMesh的子项中找到骨骼层次结构.

在子列表中找到骨骼,只需将对象附加到它:

player.children[0].add(testObj);
Run Code Online (Sandbox Code Playgroud)

注意:如果您有骨骼层次结构(例如在导出的混合器模型中),那么它也以三个.js表示.如果你的目标骨骼有一个父骨骼,它将如下所示:

player.children[0].children[1].add(testObj);
Run Code Online (Sandbox Code Playgroud)