在三个.js中将Skeleton绑定到SkinnedMesh的正确方法是什么?

时间:2017-09-20 09:13:49

标签: three.js

所以我有一组反向骨矩阵,以及一组我希望绑定到蒙皮网格的骨骼,以及整个网格的世界变换矩阵。我可以正确应用骨骼,但不能应用整个网格的网格变换(同样,如果我应用网格变换,那么蒙皮变换是不正确的)

此代码将具有正确的皮肤(我可以调试渲染骨骼,并旋转骨骼并且变换是正确的):

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 );

1 个答案:

答案 0 :(得分:0)

啊,把它解决了。您需要将根骨骼添加到网格中:

mesh.add(bones[0])