Обновить нормали анимированной сетки в Three.js? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть простая анимированная модель, анимированная через скиннинг, и я даю ей ShaderMaterial, которая отображает ее нормали:

gl_FragColor = vec4(vNormal, 1.0);

https://codepen.io/marco_fugaro/pen/ZEEBjKz?editors=0010

Проблема в том, чтонормали не обновляются со скином модели, и они всегда остаются такими же, как и в неанимированной позиции объекта (см. VertexNormalsHelper).

Как получить нормали для обновления или какполучить нормали анимированных вершин?

model.geometry.computeVertexNormals() не работает

model

1 Ответ

0 голосов
/ 22 октября 2019

Я закончил monkeyPatching вершинного шейдера MeshNormalMaterial и удалил логику, что нормали относительно камеры, вот окончательный код:

import * as THREE from 'three'
import normalVert from 'three/src/renderers/shaders/ShaderLib/normal_vert.glsl'

// like MeshNormalMaterial, but the normals are relative to world not camera
const normalMaterialGlobalvert = normalVert.replace(
  '#include <defaultnormal_vertex>',
  THREE.ShaderChunk['defaultnormal_vertex'].replace(
    'transformedNormal = normalMatrix * transformedNormal;',
    // take into consideration only the model matrix
    'transformedNormal =  mat3(modelMatrix) * transformedNormal;'
  )
)

И затем используйте его как:

mesh.material = new THREE.ShaderMaterial({
  vertexShader: normalMaterialGlobalvert,
  fragmentShader: `
    varying vec3 vNormal;

    void main() {
      gl_FragColor = vec4(vNormal, 1.0);
    }
  `,
})

Спасибо Гман за указание мне в правильном направлении!

...