-
zhangwei
2024-08-21 4abaa346a1593d0721bc1aa0989f1007e16d3301
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
export default function(gltf, THREE) {
  const clone = {
    animations: gltf.animations,
    scene: gltf.scene.clone(true)
  }
 
  const skinnedMeshes = {}
 
  gltf.scene.traverse(node => {
    if (node.isSkinnedMesh) {
      skinnedMeshes[node.name] = node
    }
  })
 
  const cloneBones = {}
  const cloneSkinnedMeshes = {}
 
  clone.scene.traverse(node => {
    if (node.isBone) {
      cloneBones[node.name] = node
    }
 
    if (node.isSkinnedMesh) {
      cloneSkinnedMeshes[node.name] = node
    }
  })
 
  for (let name in skinnedMeshes) {
    const skinnedMesh = skinnedMeshes[name]
    const skeleton = skinnedMesh.skeleton
    const cloneSkinnedMesh = cloneSkinnedMeshes[name]
 
    const orderedCloneBones = []
 
    for (let i = 0; i < skeleton.bones.length; ++i) {
      const cloneBone = cloneBones[skeleton.bones[i].name]
      orderedCloneBones.push(cloneBone)
    }
 
    cloneSkinnedMesh.bind(new THREE.Skeleton(orderedCloneBones, skeleton.boneInverses), cloneSkinnedMesh.matrixWorld)
  }
 
  return clone
}