所以我有一组反向骨矩阵,以及一组我希望绑定到蒙皮网格的骨骼,以及整个网格的世界变换矩阵。我可以正确应用骨骼,但不能应用整个网格的网格变换(同样,如果我应用网格变换,那么蒙皮变换是不正确的)
此代码将具有正确的皮肤(我可以调试渲染骨骼,并旋转骨骼并且变换是正确的):
skeleton = new THREE.Skeleton( bones , boneInvMtx);
skeleton.pose();
mesh.bind( skeleton);
但是网格变换不起作用,当我将矩阵应用于SkinnedMesh对象时,它没有任何效果。强制世界矩阵更新无效(如果我在材质中禁用蒙皮,则转换应用得很好)。
mesh.applyMatrix(meshXform)
如果我将meshXform传递给bind函数,则应用变换但现在所有骨骼变换都不正确(应用旋转会导致绕世界轴旋转,而不是关节轴,并且不会应用变换场景父母)
mesh.bind( skeleton, meshXform );
有关正确设置网格的方法的想法吗?
我设置了骨骼(按层次结构排列)和一组像这样的骨骼矩阵(我可以验证层次结构和矩阵是否正确):
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 :(得分:0)
mesh.add(bones[0])