Установить материал для фиксированной части сетки в Three.js - PullRequest
0 голосов
/ 11 октября 2018

Допустим, у меня есть 3DObject в three.js:

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);

Эта сетка также является динамической, то есть пользователь устанавливает ее размер, который динамически устанавливается как scaleсетка.

widthInput.subscribe(value => this.mesh.scale.x = +value); // just to get the idea

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

Проблема в том, что пользователь может установить ширину в диапазоне 200 - 260, но мне нужен другой материал в самом правом углу сетки с фиксированным размером 10. Я не совсем уверен, какя бы сделал это без создания другой геометрии.Есть ли способ установить материал на фиксированной части сетки?или есть ли способ установить сегменты так, чтобы один из них всегда имел фиксированный размер?Заранее благодарим.

Для визуализации проблемы (белая область должна иметь фиксированную ширину 10, а красная область изменяется)

enter image description here

1 Ответ

0 голосов
/ 11 октября 2018

Есть ли способ установить материал на фиксированную часть сетки?

Как вы уже упоминали, есть способ установить разные материалы на разные частигеометрия.Проблема здесь заключается в том, чтобы определить, что означает fixed :

или есть ли способ установить сегменты так, чтобы один из них всегда имел фиксированный размер?

Да.Вы должны изменить геометрию самостоятельно.Доберитесь до g.attributes.position.array и измените вершины, составляющие сегмент.Это более низкий уровень и отличается от графа сцены.

Может быть, нет веских причин для того, чтобы держать все в одной геометрии.Это имело бы смысл, если бы вы использовали цвета вершин, например, для рисования различных сегментов и, возможно, анимировали экструзию в GLSL, а не с scale.set().Но так как вы хотите применять разные материалы и не пишете GLSL, вы все равно будете в конечном итоге получать колл-коллы.

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

...