2013-09-26 49 views

回答

11

可以在Bone和Object3D原型上使用一些簡單的黑客技巧。由於骨骼繼承自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); 
+3

哇。這樣的答案。非常幫助。非常感謝你。哇。 – Gugis

8

Three.js版本68處理此開箱即用,但有點不同。 不需要更改內部功能。

現在是這樣工作的:

的骨骼層次現在已經在SkinnedMesh的孩子找到。

查找孩子列表中的骨只需連接對象吧:

player.children[0].add(testObj); 

注意:如果你有一個骨骼層次(例如,在導出的攪拌機型號),那麼這三個表示。 js也是。如果你的目標骨骼有一個母骨,它會看起來像這樣:

player.children[0].children[1].add(testObj);