Three.js предоставляет набор встроенных геометрий для быстрого создания сложных форм. Одной из наиболее универсальных является PolyhedronGeometry, которая позволяет формировать многогранники произвольной конфигурации на основе набора вершин и индексов треугольников. Эта геометрия служит фундаментом для создания таких фигур, как тетраэдры, октаэдры, икосаэдры и другие сложные полиэдры.
Создание объекта происходит через конструктор:
const geometry = new THREE.PolyhedronGeometry(vertices, indices, radius, detail);
[x1, y1, z1, x2, y2, z2, …]. Каждая тройка
чисел описывает одну вершину.vertices.Пример создания простого тетраэдра:
const vertices = [
1, 1, 1,
-1, -1, 1,
-1, 1, -1,
1, -1, -1
];
const indices = [
0, 1, 2,
0, 3, 1,
0, 2, 3,
1, 3, 2
];
const geometry = new THREE.PolyhedronGeometry(vertices, indices, 1, 0);
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
Параметр detail позволяет получить сглаженные фигуры,
особенно заметно при создании сферических объектов, таких как икосаэдры.
Каждое увеличение detail делит каждую грань треугольника на
четыре меньших треугольника, что приближает фигуру к сферической
форме.
detail = 0 — базовая фигура с оригинальными
гранями.detail = 1 — каждая грань делится на 4
треугольника.detail = 2 — каждое последующее деление делает
поверхность ещё более гладкой.Важно учитывать, что увеличение detail резко повышает
количество полигонов, что может повлиять на производительность.
Three.js предоставляет готовые классы, основанные на PolyhedronGeometry, для наиболее часто используемых многогранников:
Создает тетраэдр — четырехгранник. Конструктор:
const geometry = new THREE.TetrahedronGeometry(radius, detail);
radius — масштаб тетраэдра.detail — уровень детализации, аналогично
PolyhedronGeometry.Создает октаэдр — восьмигранник. Конструктор:
const geometry = new THREE.OctahedronGeometry(radius, detail);
Создает икосаэдр — двадцатигранник. Часто используется как основа для сферических объектов с высокой степенью гладкости.
const geometry = new THREE.IcosahedronGeometry(radius, detail);
Создает додекаэдр — двенадцатигранник с правильными пятиугольными гранями.
const geometry = new THREE.DodecahedronGeometry(radius, detail);
Все эти производные автоматически определяют массивы вершин и индексов, необходимые PolyhedronGeometry, что упрощает использование.
Для визуализации необходимо использовать Mesh с материалом. PolyhedronGeometry и производные поддерживают любые стандартные материалы Three.js, включая MeshStandardMaterial, MeshPhongMaterial и MeshNormalMaterial.
Пример с анимацией вращения:
const geometry = new THREE.IcosahedronGeometry(1, 2);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00, flatShading: false });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
function animate() {
requestAnimationFrame(animate);
mesh.rotation.x += 0.01;
mesh.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
Использование flatShading позволяет сохранить четкость граней, даже при высоком уровне детализации.
detail > 2 количество треугольников растет
экспоненциально. Для интерактивных сцен рекомендуется ограничивать
детализацию.computeVertexNormals() и
UVGenerator.geometry.attributes.position.needsUpdate = true позволяет
создавать динамические, деформируемые полиэдры.PolyhedronGeometry и её производные предоставляют мощный инструмент для создания как простых, так и сложных геометрических форм, обеспечивая высокую гибкость в управлении формой и уровнем детализации. Их использование является фундаментальной практикой при построении трехмерных сцен в Three.js.