Подтвердить что ты не робот

Three.js - проблемы гладкого затенения материала Ламберта на пользовательской геометрии

Я создал пользовательскую геометрию в файле Three.js. Теперь я хотел бы создать сетку, в которой используется материал Lambert с гладким оттенком. Используя цикл, я создал массив вершин, затем лица, а потом я назвал

geometry.computeCentroids();
geometry.computeFaceNormals();
geometry.computeVertexNormals();

var colorMaterial =  new THREE.MeshLambertMaterial( {color: 0x0000ff, side: THREE.DoubleSide} );
var mesh = new THREE.Mesh( geometry, colorMaterial );
scene.add(mesh);

Результат почти идеальный, за исключением того, что кажется, что материал использует shading: THREE.FlatShading, как показано ниже:

enter image description here

в то время как я ожидал появления по умолчанию, которое обычно ожидают с помощью shading: THREE.SmoothShading. Что мне нужно добавить/изменить, чтобы получить гладкое затенение Ламберта?

(Если это помогает, полный живой пример находится в http://stemkoski.github.io/Three.js/Marching-Cubes.html, а геометрия и сетка создаются вокруг строк 250-280.)

4b9b3361

Ответ 1

Это потому, что соседние грани не разделяют вершины в вашей модели.

Если вы вызываете geometry.mergeVertices() сразу после завершения создания своей геометрии и до того, как вы назовете geometry.computeVertexNormals(), ваше затенение будет выглядеть гладко.

three.js r.58