我正在尝试构建一个可以显示SkinMesh骨骼的位置和方向的组件,并且遇到了一些障碍。我无法确定骨骼的整体位置。
我努力了:
this.updateMatrixWorld(true);
this.traverse(function (bone) {
var twinGlobalPos = new THREE.Vector3().getPositionFromMatrix(bone.matrixWorld);
console.log(typeof (bone), "GlobalPos", twinGlobalPos.x, twinGlobalPos.y, twinGlobalPos.z);
});
和明显的变化,不幸的是,这似乎行不通,除根以外,所有骨骼的位置均为0,0,0。根骨头报告的全局位置与SkinMesh相同
我究竟做错了什么?有其他替代方法吗?
最佳答案
好的,我自己找到了答案。
SkinMesh重载了updateMatrixWorld的实现,该实现不会对THREE.Bone的任何实例执行更新。相反,它委托给骨骼的update方法,该方法维护矩阵“ skinmatrix”。
Skinmatrix的工作原理与worldMatrix相似,但它使用SkinnedMesh作为全局参考而不是场景。结合使用SkinnedMesh的worldMatrix和骨骼的SkinMatrix可以达到目的。
this.updateMatrixWorld(true);
// assuming this is a SkinnedMesh
var meshGlobal = new THREE.Vector3().setFromMatrixPosition(this.matrixWorld);
this.traverse(function (bone) {
if(bone instanceof THREE.Bone) {
var twinGlobalPos = new THREE.Vector3().setFromMatrixPosition(bone.skinMatrix).add(meshGlobal);
console.log(typeof (bone), "GlobalPos", twinGlobalPos.x, twinGlobalPos.y, twinGlobalPos.z);
}
});
上面的代码似乎可以解决问题。我可以看到为什么选择了这种设计,但是它确实带来了一个难题,也许可以覆盖三个方法上的
localToWorld
和worldToLocal
方法。