Three.js предоставляет гибкие инструменты для работы с несколькими объектами сцены одновременно. Одним из ключевых подходов является использование групп (THREE.Group). Группа позволяет объединять несколько мешей или других объектов в единый контейнер, сохраняя их индивидуальные трансформации, но позволяя манипулировать всей группой как единым объектом.
const group = new THREE.Group();
const geometry1 = new THREE.BoxGeometry(1, 1, 1);
const material1 = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const cube1 = new THREE.Mesh(geometry1, material1);
const geometry2 = new THREE.SphereGeometry(0.5, 32, 32);
const material2 = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const sphere = new THREE.Mesh(geometry2, material2);
sphere.position.set(2, 0, 0);
group.add(cube1);
group.add(sphere);
scene.add(group);
Ключевые моменты при работе с группами:
В Three.js объект THREE.Mesh может иметь один материал
для всей геометрии, но при необходимости возможно назначение
нескольких материалов для разных частей геометрии. Для
этого используется массив материалов и индексные группы
(geometry.groups).
const geometry = new THREE.BoxGeometry(2, 2, 2);
// Определение двух материалов
const materials = [
new THREE.MeshStandardMaterial({ color: 0x0000ff }),
new THREE.MeshStandardMaterial({ color: 0xffff00 })
];
// Настройка групп граней
geometry.clearGroups();
geometry.addGroup(0, 6, 0); // первые 6 вершин -> первый материал
geometry.addGroup(6, 30, 1); // оставшиеся вершины -> второй материал
const multiMaterialMesh = new THREE.Mesh(geometry, materials);
scene.add(multiMaterialMesh);
Принципы работы с многоматериальными мешами:
geometry.addGroup(startIndex, count, materialIndex), где
startIndex — индекс вершины, count —
количество вершин, materialIndex — индекс материала в
массиве.MeshStandardMaterial или
MeshPhongMaterial.Для крупных сцен удобно объединять возможности групп и многоматериальных мешей. Например, можно создать сложный объект с различными материалами и поместить его в группу с другими объектами для удобного управления:
const mainGroup = new THREE.Group();
const boxGeometry = new THREE.BoxGeometry(1, 1, 1);
const materials = [
new THREE.MeshStandardMaterial({ color: 0xff00ff }),
new THREE.MeshStandardMaterial({ color: 0x00ffff })
];
boxGeometry.clearGroups();
boxGeometry.addGroup(0, 6, 0);
boxGeometry.addGroup(6, 30, 1);
const multiBox = new THREE.Mesh(boxGeometry, materials);
multiBox.position.set(0, 0, 0);
const sphereGeometry = new THREE.SphereGeometry(0.5, 32, 32);
const sphereMaterial = new THREE.MeshStandardMaterial({ color: 0xffffff });
const sphereMesh = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphereMesh.position.set(2, 0, 0);
mainGroup.add(multiBox);
mainGroup.add(sphereMesh);
scene.add(mainGroup);
Преимущества комбинирования:
Three.js позволяет менять материалы и геометрию после создания меша:
mesh.material = newMaterial — смена одного
материала.mesh.material[index].geometry.groups и добавляя новые через
addGroup.multiBox.material[1].color.set(0xffaa00);
boxGeometry.clearGroups();
boxGeometry.addGroup(0, 12, 0);
boxGeometry.addGroup(12, 24, 1);
Это особенно важно для интерактивных сцен, где объекты должны изменять внешний вид в зависимости от действий пользователя или логики приложения.
InstancedMesh, если объекты идентичны.Группы и многоматериальные меши формируют основу гибкой и масштабируемой архитектуры сцен в Three.js, позволяя управлять визуальными объектами эффективно и с высокой степенью контроля над трансформациями и материалами.