В библиотеке Three.js примитивы предоставляют базовые геометрические формы, которые могут использоваться для построения сложных 3D-сцен. Одним из наиболее часто применяемых примитивов является BoxGeometry — куб или прямоугольный параллелепипед. Он создаётся с помощью конструктора:
const geometry = new THREE.BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments);
Если сегменты заданы больше 1, это позволяет выполнять более сложные операции на поверхности, например, деформацию или применение текстур с высокой детализацией.
BoxGeometry создаёт шесть граней (faces) куба,
каждая из которых состоит из двух треугольников. В Three.js геометрия
описывается через массив вершин
(geometry.attributes.position) и массив индексов
(geometry.index). Для куба с дефолтными сегментами порядок
индексов задаёт каждую грань как два треугольника:
Каждая вершина хранит координаты (x, y, z). Дополнительно можно
создавать массив нормалей (geometry.attributes.normal) для
корректного освещения и массив UV-координат
(geometry.attributes.uv) для наложения текстур.
Сегментация (widthSegments, heightSegments, depthSegments) критически важна для анимации и эффектов. Примеры применения:
Пример создания куба с высокой детализацией:
const detailedBox = new THREE.BoxGeometry(2, 2, 2, 4, 4, 4);
Каждая грань теперь состоит из 16 маленьких квадратиков, что позволяет работать с геометрией на уровне вершин.
Для визуализации BoxGeometry используется объект Mesh:
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
Ключевые особенности работы с материалами:
Комбинация геометрии с материалом даёт возможность создавать объекты, готовые к рендерингу и анимации.
BoxGeometry сама по себе не содержит информации о позиции, вращении или масштабе. Эти свойства задаются через объект Mesh:
cube.position.set(1, 2, -3);
cube.rotation.x = Math.PI / 4;
cube.scale.set(2, 1, 0.5);
Эти трансформации позволяют создавать сцены с множеством объектов, управлять их положением и анимацией.
Для наложения текстуры на куб используется объект TextureLoader и UV-координаты геометрии:
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('texture.jpg');
const material = new THREE.MeshStandardMaterial({ map: texture });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
UV-координаты по умолчанию равномерно распределены по каждой грани куба. Это упрощает стандартное наложение текстур, но для более сложных текстур может потребоваться ручная корректировка UV-координат.
Кубы на основе BoxGeometry легко анимируются с помощью встроенных возможностей Three.js:
function animate() {
requestAnimationFrame(animate);
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
С помощью событий мыши или касания можно создавать интерактивные сцены, например, изменять цвет или масштаб куба при наведении или клике.
При работе с большим количеством кубов важно учитывать оптимизацию:
BoxGeometry является фундаментальной основой для построения 3D-сцен в Three.js. Она сочетает простоту создания и гибкость применения, позволяя реализовывать как простые объекты, так и сложные анимации и взаимодействия.