Отразить нормали Three.JS после переворота геометрии

Я следовал этому примеру stackoverflow: переключение геометрии ThreeJS

Я успешно отразил свою геометрию. Однако теперь моя геометрия черная. Могу ли я перевернуть нормали одновременно с геометрией, чтобы исправить это? Или я должен был использовать другой подход для отражения геометрии с самого начала?

РЕДАКТИРОВАТЬ:

Попытался добавить обновления в этот код, но геометрия по-прежнему перевернута.

#transformation
mS.elements[5] = -1;
mesh.applyMatrix(mS);

#updates
mesh.geometry.verticesNeedUpdate = true;
mesh.geometry.normalsNeedUpdate = true;
mesh.geometry.computeBoundingSphere();
mesh.geometry.computeFaceNormals();
mesh.geometry.computeVertexNormals();

геометрия


person Laura    schedule 11.09.2014    source источник


Ответы (3)


mesh.geometry.verticesNeedUpdate = true;
mesh.geometry.normalsNeedUpdate = true;
mesh.geometry.computeBoundingSphere();
mesh.geometry.computeFaceNormals();
mesh.geometry.computeVertexNormals();

https://github.com/mrdoob/three.js/wiki/Updates

person IceCreamYou    schedule 14.09.2014
comment
После добавления этого кода я так и не смог вернуть геометрию в нормальное состояние (модель слева). - person Laura; 15.09.2014
comment
Попробуйте применить матрицу к геометрии, прежде чем добавлять ее в сетку. - person IceCreamYou; 18.09.2014
comment
Это не решит проблему: направление нормали вычисляется с помощью перекрестного произведения векторов. нужно инвертировать порядок трех целочисленных индексов на каждой грани геометрии. Возможно, это уже реализовано в последних Threejs. - person Arnaud; 07.08.2017

Это старый вопрос, но для тех, кто все еще запутался: нормаль лица вычисляется путем просмотра порядка вершин против часовой стрелки.

Поэтому, если вам нужно перевернуть нормали, вы должны изменить порядок вершин, назначенных грани. Например:

var tmp;
for(var f = 0; f < geometry.faces.length; f++) {
    tmp = geometry.faces[f].clone();
    geometry.faces[f].a = tmp.c;
    geometry.faces[f].c = tmp.a;
}
person Thomas Huijzer    schedule 03.11.2017

Вы можете попробовать:

mesh.geometry.reverse(computeFaceNormals());
mesh.geometry.reverse(computeVertexNormals());
person Phil Tornando    schedule 17.09.2014