обновление нормали в bufferGeometry в three.js

У меня есть два цилиндра, которые пересекаются на одном конце. Я могу изменить радиус пересечения отдельно, но они все равно встречаются на одном конце, как показано ниже. Однако я хочу, чтобы пересечение между этими двумя точками было плавным или, другими словами, чтобы их нормали на пересечении были общими, как указано здесь: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/. Я установил обновления нормалей TRUE, а также изменил все компоненты y нормалей на ноль в пересечении. Он по-прежнему не показывает плавного пересечения. Эти два цилиндра созданы с помощью BufferGeometry.введите здесь описание изображения

поэтому более важная часть моего кода: 1- поскольку геометрия BufferGeometry, я сначала использую две команды ниже для обеих геометрий, чтобы создать нормали:

comp.mesh.geometry.computeFaceNormals();
comp.mesh.geometry.computeVertexNormals();

2- затем, поскольку обе геометрии имеют одинаковое количество вершин, я устанавливаю компонент y всех вершин равным 0:

for (i=0;i<comp.mesh.geometry.attributes.position.array.length;i++){
comp.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
comp1.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
}

Когда я позволяю программе показывать нормали, их компонент y нормалей равен 0, но геометрия еще не гладкая.


person Hesamoy    schedule 25.04.2017    source источник
comment
Покажи свой код.   -  person WestLangley    schedule 25.04.2017
comment
Спасибо УэстЛэнгли. Пожалуйста, смотрите код в добавленной ссылке.   -  person Hesamoy    schedule 26.04.2017
comment
Пожалуйста, поделитесь своим кодом в своем посте (желательно в виде фрагмента). Если jsfiddle когда-либо будет удален, контекст вашего вопроса исчезнет вместе с ним.   -  person TheJim01    schedule 26.04.2017


Ответы (1)


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

person pailhead    schedule 25.04.2017
comment
Технически вам не нужно комбинировать геометрию, если нормали настроены правильно. Вот пример, где два отдельных меша едва соприкасаются, но выглядят гладкими, потому что я отрегулировал их нормали. jsfiddle.net/TheJim01/gnoxeoem - person TheJim01; 26.04.2017
comment
Вы явно устанавливаете их, и это нормально, если вы знаете, какими они должны быть. Для более общего решения нужно как-то сказать вертам там, какие грани им надо усреднять. - person pailhead; 27.04.2017
comment
Вместо этого я обновил свой пример, чтобы вычислить их. Конечно, у меня очень простой пример. Для чего-то вроде того, что пытается сделать Hesamoy, нужно собрать нормали для всех вершин в определенном месте, усреднить их и применить среднее значение ко всем упомянутым нормалям в буфере. Можно даже использовать существующие индексы, чтобы помочь. Да, можно сделать буфер более эффективным, удалив дубликаты, но для получения всех нормалей граней для тех вершин, нормали которых только что были признаны недействительными, все равно потребуется выполнить кучу перекрестных произведений. Лучше оставить индексацию в покое. - person TheJim01; 27.04.2017