2013-09-26 7 views

答えて

11

BoneおよびObject3Dのプロトタイプで簡単なハックを使用することは可能です。ボーンはObject3Dから継承されるので、それらは子を持つ可能性があるので、メッシュを任意のボーンに簡単に追加()することができます。

ただし、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); 
+3

wowのようになります。そのような答え。非常に助けてください。大変ありがとうございます。ワオ。 – Gugis

8

Three.jsバージョン68はこれをそのまま使用しますが、少し異なります。 内部機能の変更は必要ありません。

それは今、このように動作します:

ボーン階層は、現在SkinnedMeshの子どもたちに発見されました。

は、子どもたちのリストに骨を見つけ、単にそれにオブジェクトを添付:

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

注:(エクスポートブレンダーモデルで例えば)骨の階層構造を持っている場合、これは3で表されます。 jsも。骨を対象とする場合は、親骨があります。

player.children[0].children[1].add(testObj); 
関連する問題