Применить модификатор подразделения three.js без изменения внешней геометрии?

Я пытаюсь взять любую геометрию three.js и разделить ее существующие грани на более мелкие грани. По сути, это дало бы геометрии более высокое «разрешение». В примерах three.js есть инструмент модификатора подразделения, который отлично подходит для того, что я пытаюсь сделать, но в конечном итоге он меняет и трансформирует исходную форму геометрии. Я хотел бы сохранить первоначальную форму.

Просмотреть пример модификатора подразделения


Пример поведения текущего модификатора подразделения:

введите описание изображения здесь

Грубый пример того, как я хотел бы, чтобы он вел себя:

введите описание изображения здесь


Модификатор подразделения применяется следующим образом:

let originalGeometry = new THREE.BoxGeometry(1, 1, 1);
let subdivisionModifier = new THREE.SubdivisionModifier(3);
let subdividedGeometry = originalGeometry.clone();
subdivisionModifier.modify(subdividedGeometry);

Я попытался найти источник модификатора подразделения., но я не знал, как изменить его, чтобы получить желаемый результат.

Примечание. Подразделение должно применяться к любой геометрии. В моем примере желаемого результата может показаться, что PlaneGeometry three.js с увеличенными сегментами будет работать, но мне нужно, чтобы это применялось к различным геометриям.


person jackrugile    schedule 05.06.2017    source источник
comment
В коде SubdivisionModifier он использует веса вершин и ребер для позиционирования новых вершин подразделения. У меня нет времени вникать в математику того, что происходит, но если вы можете изменить/заменить логику позиционирования, чтобы разместить новую вершину вдоль исходного ребра, тогда ваши геометрии должны сохранить свою форму, но при этом быть разделенными на большее количество граней. .   -  person TheJim01    schedule 05.06.2017
comment
@ TheJim01 TheJim01 Спасибо, я немного поработал с этими значениями и думаю, что близок к решению. Опубликую ответ, если найду надежное решение.   -  person jackrugile    schedule 05.06.2017


Ответы (2)


Основываясь на предложениях в комментариях TheJim01, я смог просмотреть исходный код и изменить вес вершины, вес ребра и бета-значения, чтобы сохранить первоначальную форму. Мои модификации должны удалить любое усреднение и перенести весь вес на исходную форму.

Было три раздела, которые нужно было изменить, поэтому я пошел дальше и сделал параметр, который можно передать в конструктор с именем retainShape, который по умолчанию равен false.

Я сделал вывод с измененным кодом для SubdivisionGeometry.js.

Просмотреть измененный Gist SubdivisionGeometry.js


Ниже приведен пример разделения куба с выключенной и включенной опцией.

Слева: new THREE.SubdivisionModifier(2, false);

Справа: new THREE.SubdivisionModifier(2, true);

введите описание изображения здесь

Если у кого-то возникнут какие-либо проблемы с этим или есть какие-либо вопросы, дайте мне знать!

person jackrugile    schedule 05.06.2017
comment
Это действительно круто. Вы должны отправить свои изменения в качестве дополнения к THREE.SubdivisionModifier! :) github.com/mrdoob/three.js - person TheJim01; 06.06.2017
comment
Потрясающий! Постараюсь отправить это в ближайшее время, в том числе и для THREE.BufferSubdivisionModifier. - person jackrugile; 06.06.2017
comment
Если его использовать семантически, в Blender есть возможность использовать модификатор подразделения в простом режиме, который позволяет избежать морфинга формы, возможно, вы можете назвать свое свойство простым, поскольку может быть причина, по которой оно называется так - person Neil; 08.06.2017

Текущая версия three.js имеет необязательные параметры для PlaneGeometry, которые определяют количество сегментов для ширины и высоты; оба по умолчанию равны 1. В приведенном ниже примере я установил для widthSegments и heightSegments значение 128. Это имеет тот же эффект, что и использование SubdivisionModifier. На самом деле SubdivisionModifier искажает форму, но указание сегментов не искажает форму и работает лучше для меня.

var widthSegments = 128;
var heightSegments = 128;
var geometry = new THREE.PlaneGeometry(10, 10, widthSegments, heightSegments);
//    var geometry = new THREE.PlaneGeoemtry(10,10); // segments default to 1
//    var modifier = new THREE.SubdivisionModifier( 7 );
//    geometry = modifier.modify(geometry);

https://threejs.org/docs/#api/en/geometries/PlaneGeometry< /а>

person Don Smith    schedule 15.03.2020
comment
Это правда, но см. примечание в конце моего вопроса. - person jackrugile; 17.03.2020