2016-03-07 3 views
2

Я пытаюсь сглаживает сетку я загруженную с помощью THREE.OBJLoaderthree.js - Сглаживание нормалей с использованием mergeVertices();

original result

Как вы можете видеть в этом исходном изображении всех полигоны граненые. Я пробовал другие загрузчики/форматы, но получал тот же результат. После укоренения я вижу, что возможным решением является слияние вершин перед вычислением нормалей. Когда я пытаюсь это сделать, я получаю «TypeError: geometry.mergeVertices не является функцией» в моей консоли. Вот код, выделяющий, где я вставил функцию mergeVertices().

 var loader = new THREE.OBJLoader(); 
     loader.load('../assets/models/nos2.obj', function (nos) { 
     var material = new THREE.MeshLambertMaterial({color: 0xffffff, side:THREE.DoubleSide}); 

     nos.children.forEach(function (child) { 
      child.material = material; 
      child.geometry.mergeVertices(); /* ADDED MERGE WHICH GIVES ERROR */ 
      child.geometry.computeFaceNormals(); 
      child.geometry.computeVertexNormals(); 
     }); 

     nos.scale.set(300, 300, 300); 
     nos.rotation.x = -0.3; 
     scene.add(nos);} 

Что я делаю неправильно?

ответ

0

Функция .OBJLoader() создает объект BufferGeometry - не объект Geometry.

Функция .mergeVertices() недоступна для объекта BufferGeometry - следовательно, ошибка.

Что касается решения проблемы достижения Smooth Shading на загруженный объект Я до сих пор борется с этой одной себя :-(

Одним из возможных вариантов, которые вы можете изучить, чтобы сделать объект геометрии из объекта BufferGeometry. затем примените функцию mergeVertices() к геометрии, затем либо используйте эту геометрию в вашей последней сетке, либо создайте новую буферную метрику (из геометрии) и используйте ее в своей последней сетке. Посмотрите на документацию по геометрии и геометрии буфера на this location.

ОБНОВЛЕНИЕ

Пользователь SPACORUM опубликовал полезный (исходный файл STL) решение here, который одинаково хорошо работает для исходных файлов OBJ. Код нуждается в коррекции путем удаления/отключения эти три строки: -

Sobject.computeBoundingBox(); 
Sobject.computeVertexNormals(); 
Sobject.center(); 

и о внесении изменений в следующую строку следующим образом: -

var attrib = Sobject.geometry.getAttribute('position'); 
0

Случалось этот вопрос для меня при загрузке файла OBJ. Если у вас есть программное обеспечение 3d, например 3dsmax:

Открыть файл obj, перейти в режим выбора полигонов и выбрать все полигоны. В панели «Свойства поверхности» нажмите кнопку «Автоматическое разглаживание». Экспортируйте модель обратно в формат obj

Теперь вам не нужно будет вызывать функции geometry.mergeVertices() и geometry.computeVertexNormals() ;. Просто загрузите obj и добавьте в сцену, сетка будет гладкой.

1

Преобразуйте в обычную геометрию, примените все необходимое и преобразуйте обратно в геометрию буфера. Я использую загрузчики модулей ES6, поэтому нет ТРИ. префикс

const tempGeo = new Geometry().fromBufferGeometry(child.geometry); 

tempGeo.mergeVertices(); 

// after only mergeVertices my textrues were turning black so this fixed normals issues 
tempGeo.computeVertexNormals(); 
tempGeo.computeFaceNormals(); 

child.geometry = new BufferGeometry().fromGeometry(tempGeo); 
Смежные вопросы