我正在尝试构建一个可以显示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);
});
Run Code Online (Sandbox Code Playgroud)
并且明显的变化,不幸的是这似乎不起作用,所有的骨头,除了根报告位置0,0,0.根骨骼报告与SkinMesh相同的全局位置
我究竟做错了什么?还有其他方法吗?
好的,我自己找到了答案.
SkinMesh重载了updateMatrixWorld的实现,它不会对THREE.Bone的任何实例执行更新.相反,它委托了骨骼的更新方法,该方法维护矩阵'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);
}
});
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎可以解决问题.我可以看到,为什么已经选择了这个设计,但它确实提出了一种疑难杂症,也许是重写localToWorld和worldToLocal方法上THREE.Bone将是一个半的解决方案?
| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |