точки с кожей three.js вместо сетки

Я импортирую модель анимированной руки робота .fbx. Я хочу использовать сетку со скелетом, но визуализировать gl.POINTS вместо стандартной сетки.

Вот моя первая (наивная) попытка. Я меняю местами отдельные элементы с THREE.Mesh на THREE.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, но моя анимация просто не работает. Что мне здесь не хватает?

Моя единственная идея - изменить вызов отрисовки меша three.js с gl.TRIANGLES на gl.POINTS во время выполнения. Как это сделать и есть ли более разумный подход к проблеме?


person Georgi B. Nikolov    schedule 04.08.2017    source источник


Ответы (1)


Вероятно, это не лучший способ сделать это, но пока он работает для меня без проблем. Я просто скопировал все 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; 
}
person Sehyun Kim    schedule 30.07.2019