2017-09-20 19 views
0

私は逆骨マトリックスと、スキンメッシュにバインドするボーンのセットと、メッシュ全体のワールド変換マトリックスを設定しました。私はボーンを正しく適用できますが、メッシュ全体のメッシュ変換はできません(同様に、メッシュ変換を適用するとスキニング変換が正しくない場合)three.js内のSkinnedMeshにスケルトンをバインドする正しい方法は何ですか?

このコードでは正しいスキンが適用されます、arbritary骨を回転させると、変換が正しいと):私はそれは効果がありませんSkinnedMeshオブジェクトに私の行列を適用すると

skeleton = new THREE.Skeleton(bones , boneInvMtx); 
skeleton.pose(); 
mesh.bind(skeleton); 

しかし、メッシュ変換は、動作しません。ワールドマトリックスの更新を強制することは効果がありません(そして、マテリアルのスキニングを無効にすると、トランスフォームはうまく適用されます)。

mesh.applyMatrix(meshXform) 

私はバインド機能にmeshXformを渡す代わりにした場合、適用される変換が、現在はすべての骨の変換は、(回転を適用する間違っているが、世界の軸ではなく、関節軸、無変換の周りに回転させますシーンの親から適用されます)

mesh.bind(skeleton, meshXform); 

このようなメッシュを設定する正しい方法についての考えはありますか?

私は(階層に配置)骨と、このような骨の行列の集合を設定する(と私はhierachyを確認することができますし、行列が正しい)

const bones = []; 
const boneInvMtx = []; 

for(i=0;i<numBones;i++) 
    bones.push(new Bone()); 
    boneInvMtx.push(boneData[i].invMtx); 
}; 
for(i=0;i<numBones;i++) 
    bones[boneData[i].parent].add(bone[i]); 

私はジオメトリを作成し、材料、メッシュをこのようにします(ジオメトリにボーンを追加することは効果がありません)。

var geom = new THREE.BufferGeometry(); 
geom.setIndex(new THREE.BufferAttribute(indBuffer, 1)); 
geom.addAttribute('position', new THREE.BufferAttribute(posBuffer, 3)); 
geom.addAttribute('normal', new THREE.BufferAttribute(normBuffer, 3)); 
geom.addAttribute('uv', new THREE.BufferAttribute(uvBuffer, 2)); 
geom.addAttribute('skinWeight', new THREE.BufferAttribute(weightsBuffer, 4)); 
geom.addAttribute('skinIndex', new THREE.BufferAttribute(boneIndBuffer, 4)); 

const nodeMaterial = new THREE.MeshNormalMaterial({ skinning:true}); 
const mesh = new THREE.SkinnedMesh(geom, nodeMaterial); 

答えて

0

Ahhが解決しました。メッシュにルートボーンを追加する必要があります。

mesh.add(bones[0]) 
関連する問題