代码之家  ›  专栏  ›  技术社区  ›  Georgi B. Nikolov

三js蒙皮点而不是网格

  •  1
  • Georgi B. Nikolov  · 技术社区  · 7 年前

    我正在导入一个动画机器人手的.fbx模型。我想使用蒙皮网格,但渲染gl.POINTS,而不是标准网格。

      loader.load('/robot-arm-01.fbx', (object) => {
    
        let children = object.children.map(child => {
          child.material = new THREE.ShaderMaterial({
            vertexShader,
            fragmentShader,
            skinning: true
          })
          let points = new THREE.Points(child.geometry, child.material)
          points.position.copy(child.position)
          points.scale.copy(child.scale)
          points.rotation.copy(child.rotation)
          return points
        })
        object.children = children
      })
    

    问题肯定不在我的顶点着色器中,如果我不交换子数组,我就可以播放动画

    这可以用gl.POINTS正确显示我的模型,但我的动画根本没有启动。我错过了什么?

    我唯一的想法是改变这三个。js mesh在运行时从gl.TRIANGLES到gl.POINTS的draw调用。人们是如何做到这一点的?有没有更明智的方法来解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   avseoul    5 年前

    这可能不是理想的方法,但到目前为止,它对我来说没有问题。我所做的只是复制所有 SkinnedMesh 参数输入到 Points .希望这有帮助

    getSkinnedPoints(skinnedMesh) {
        const points = new THREE.Points(skinnedMesh.geometry, skinnedMesh.material);
    
        points.skeleton = skinnedMesh.skeleton;
        points.bindMatrix = skinnedMesh.bindMatrix;
        points.bindMatrixInverse = skinnedMesh.bindMatrixInverse;
        points.bindMode = skinnedMesh.bindMode;
        points.drawMode = skinnedMesh.drawMode;
        points.name = skinnedMesh.name;
        points.parent = skinnedMesh.parent;
        points.uuid = skinnedMesh.uuid;
        points.type = skinnedMesh.type;
    
        points.isSkinnedMesh = true;
        points.bind = skinnedMesh.bind;
        points.clone = skinnedMesh.clone;
        points.initBones = skinnedMesh.initBones;
        points.normalizeSkinWeights = skinnedMesh.normalizeSkinWeights;
        points.pose = skinnedMesh.pose;
        points.updateMatrixWorld = skinnedMesh.updateMatrixWorld;
    
        return points; 
    }