0

我通过以下方式加载了一个装配好的网格:

var hand
const loader = new THREE.GLTFLoader().load('./hand.glb', function (gltf) {
    const Object3D = gltf.scene.children[0]

    hand = {
        Object3D: Object3D,
        skinned_mesh: Object3D.children[1],
        skeleton: Object3D.children[1].skeleton,
        position: Object3D.position,
        rotation: Object3D.rotation,
        quaternion: Object3D.quaternion,
    }

    const bones = hand.skeleton.bones;
    hand.forearm = bones[0];
    hand.wrist = bones[1];
    hand.palm = bones[2];
    hand.thumb = bones.slice(3, 7);
    hand.index = bones.slice(7, 11);
    hand.middle = bones.slice(11, 15);
    hand.ring = bones.slice(15, 19);
    hand.pinky = bones.slice(19, 23);

    hand.Object3D.traverse(child => {
        if (child.isMesh) {
            child.castShadow = child.receiveShadow = false
            child.material.metalness = 0
            child.material.roughness = 1
        }
    })

    scene.add(hand.Object3D)
    scene.add(new THREE.SkeletonHelper(hand.Object3D))
    physics.add.existing(hand.Object3D, { shape: 'convex', collisionFlags: 2 })
})

它按预期加载到场景中:

1

但是,当我尝试在网格上旋转单个骨骼时,网格和骨骼会按预期旋转,但物理体不会保持同步:

hand.palm.rotation.y += Math.PI / 2

2

有没有办法做到这一点?

文档说,对于 Kinematic body,您需要在更改旋转或位置时将 needUpdate 设置为 true。我尝试在通过 hand.Object3D.body.needUpdate = true 进行任何旋转或转换后进行设置,但这似乎也无法解决它。

我还尝试添加Object3D无头 GLTF 示例new ExtendedObject3D()中的a以查看这是否会产生影响

const Object3D = new ExtendedObject3D()
Object3D.add(gltf.scene.children[0])

这不起作用,而且似乎也没有必要,因为一旦hand.Object3D添加到物理中,它似乎会自动转换为 ExtendedObject3D。

我不确定除了移除物理体然后尝试在任何转换后逐帧重新添加它之外,还能尝试什么?但是,这似乎非常低效,必须有一个已经定义的方法来做到这一点,我错过了。


我正在使用库enable3d.js,它看起来本质上是 Ammo.js 的包装库,所以我相信我的问题与 Ammo.js 的关系比 enable3d 更重要。

4

0 回答 0