javascript - Three.js:重新连接骨骼后如何重新绑定(bind)/重新连接网格骨架?

标签 javascript animation three.js mesh

基本上,我试图在全局轴上独立旋转我的装备手网格上的骨骼,并使用方向向量来计算它们的方向。我想出了这段代码来做到这一点:

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))

enter image description here

问题是,每次我在骨骼上调用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))

这会旋转手腕,但将手指的其余部分留在后面:

enter image description here


有谁知道在我的函数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/

相关文章:

javascript - 从数组中删除选中的项目

javascript - 如何使用 fetch.response.json() 的 reviver 函数

javascript - 最小化源代码文件后,JavaScript 源映射文件是否仍然有效?

ios - 如何给 UIView animateWithDuration 添加弹跳效果

javascript - Wow.js 不会加载延迟超过 1 秒的动画。为什么?

c# - 一个属性上的多个 Storyboard

javascript - 如何处理 Relay Modern 上的突变错误?

javascript - 在 ThreeJS 中结合 THREE.ShaderLib.phong 和次表面散射

javascript - 纹理未应用于 Three.js 中的侧面

JavaScript异常: "not well-formed" on firefox browser and "XMLHttpRequest.." error on chrome browser