gpt4 book ai didi

three.js - 获取骨骼的全局位置

转载 作者:行者123 更新时间:2023-12-03 19:40:39 31 4
gpt4 key购买 nike

我正在尝试构建一个组件,该组件可以显示 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 的任何实例执行更新。相反,它委托(delegate)给骨骼的更新方法,该方法维护一个矩阵“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 THREE.Bone 上的方法将是一个半解决方案?

关于three.js - 获取骨骼的全局位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691474/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com