基本上,我试图在全局轴上独立旋转我的装备手网格上的骨骼,并使用方向向量来计算它们的方向。我想出了这段代码来做到这一点:
function boneLookAtLocal(bone, position) {
bone.updateMatrixWorld()
let direction = position.clone().normalize()
let pitch = Math.asin(-direction.y)
let yaw = Math.atan2(direction.x, direction.z);
let roll = Math.PI;
bone.rotation.set(roll, yaw, pitch);
}
function boneLookAtWorld(bone, v) {
scene.attach(bone)
boneLookAtLocal(bone, v)
bone.parent.attach(bone)
}
在手腕和食指上调用此代码会产生我想要/期望的手指姿势:
// hand.wrist and hand.index[0:3] are bones
boneLookAtWorld(hand.wrist, new THREE.Vector3(1, 1, 1))
boneLookAtWorld(hand.index[0], new THREE.Vector3(1, 1, 1))
boneLookAtWorld(hand.index[1], new THREE.Vector3(1, 0, 1))
boneLookAtWorld(hand.index[2], new THREE.Vector3(0, -1, 0))
问题是,每次我在骨骼上调用boneLookAtWorld()后,它都会中断与网格的连接,正如您从骨架助手中看到的那样,蓝色/绿色骨架线不再连接在手腕和食指上我在其上调用了boneLookAtWorld() 的骨骼。
因此,这个解决方案一直有效,直到我想要更改我已经调用过的骨头的方向。boneLookAtWorld()。因此,如果我在之前的调用之后再次在手腕上调用boneLookAtWorld():
// hand.wrist and hand.index[0:3] are bones
boneLookAtWorld(hand.wrist, new THREE.Vector3(1, 1, 1))
boneLookAtWorld(hand.index[0], new THREE.Vector3(1, 1, 1))
boneLookAtWorld(hand.index[1], new THREE.Vector3(1, 0, 1))
boneLookAtWorld(hand.index[2], new THREE.Vector3(0, -1, 0))
...
boneLookAtWorld(hand.wrist, new THREE.Vector3(0, 0, 1))
这会旋转手腕,但将手指的其余部分留在后面:
有谁知道在我的函数boneLookAtWorld()中将骨骼重新附加到其父级以解决此问题后如何将骨骼重新绑定(bind)到网格体/骨架?
最佳答案
如果这对任何人都有帮助,则无需执行任何类型的重新网格化。
发生这种情况的原因是:
function boneLookAtWorld(bone, v) {
scene.attach(bone)
boneLookAtLocal(bone, v)
bone.parent.attach(bone)
}
当我们将骨骼附加到场景时,场景成为骨骼的新父级。因此,在我们通过boneLookAtLocal()执行旋转并重新附加骨骼后,我们不会将骨骼重新附加到原始父级!骨骼刚刚重新附加到它已经附加到的场景。
通过将boneLookAtWorld()更改为以下内容可以解决此问题:
function boneLookAtWorld(bone, v) {
const parent = bone.parent;
scene.attach(bone)
boneLookAtLocal(bone, v)
parent.attach(bone)
}
关于javascript - Three.js:重新连接骨骼后如何重新绑定(bind)/重新连接网格骨架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68852637/