Three.js предоставляет мощный механизм для динамического добавления,
удаления и управления 3D-объектами в сцене. Основой является
сцена (THREE.Scene), которая хранит все
объекты, освещение и камеры. Любой объект, унаследованный от
THREE.Object3D (например, THREE.Mesh,
THREE.Group), может быть добавлен или удалён из сцены в
любое время.
Для добавления объекта используется метод
scene.add(obj). Пример создания и добавления куба:
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
Ключевые моменты:
THREE.Group), что удобно для
управления множеством объектов одновременно.renderer.render(scene, camera).Удаление объекта выполняется через scene.remove(obj).
Однако для корректного управления памятью важно также очищать геометрию
и материалы:
scene.remove(cube);
cube.geometry.dispose();
cube.material.dispose();
Почему это важно: WebGL использует GPU-память для
хранения геометрии и текстур. Если не вызвать dispose(),
память не освобождается, что может привести к падению производительности
при длительной работе приложения.
Объекты могут изменять своё состояние на лету:
obj.position.set(x, y, z)obj.rotation.x += 0.01obj.scale.set(sx, sy, sz)Пример анимации куба:
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
THREE.Group позволяет объединять объекты и управлять ими
как единым целым. Это особенно полезно при создании динамических сцен с
большим количеством элементов:
const group = new THREE.Group();
for (let i = 0; i < 10; i++) {
const sphere = new THREE.Mesh(
new THREE.SphereGeometry(0.5, 16, 16),
new THREE.MeshStandardMaterial({ color: Math.random() * 0xffffff })
);
sphere.position.set(i, 0, 0);
group.add(sphere);
}
scene.add(group);
Удаление всех объектов группы:
group.children.forEach(child => {
child.geometry.dispose();
child.material.dispose();
});
scene.remove(group);
dispose() предотвращает
утечки памяти.THREE.Group позволяет манипулировать множеством объектов
одновременно, что упрощает анимацию и удаление.Для динамического управления большим количеством элементов удобно хранить их в массиве:
const cubes = [];
for (let i = 0; i < 50; i++) {
const cube = new THREE.Mesh(
new THREE.BoxGeometry(1, 1, 1),
new THREE.MeshStandardMaterial({ color: Math.random() * 0xffffff })
);
cube.position.set(Math.random() * 10, Math.random() * 10, Math.random() * 10);
scene.add(cube);
cubes.push(cube);
}
// Удаление всех кубов
cubes.forEach(c => {
scene.remove(c);
c.geometry.dispose();
c.material.dispose();
});
cubes.length = 0;
Динамическое добавление объектов тесно связано с системами коллизий и взаимодействия:
Cannon.js
или Ammo.js) требует синхронизации состояния объекта в
Three.js и физическом движке при добавлении или удалении.Динамическое управление объектами в Three.js — это базовый инструмент для создания интерактивных 3D-сцен. Оно требует внимания к управлению памятью, правильного использования геометрии и материалов, а также структуры сцены через группы и массивы. Эффективное применение этих подходов позволяет создавать сложные сцены с сотнями и тысячами объектов без снижения производительности.