我正在尝试构建一个可以显示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);
    }
});


上面的代码似乎可以解决问题。我可以看到为什么选择了这种设计,但是它确实带来了一个难题,也许可以覆盖三个方法上的localToWorldworldToLocal方法。

10-08 08:37