PointsMaterial — это специализированный материал для
рендеринга точек (THREE.Points) в сцене. Он позволяет
контролировать цвет, размер и прозрачность отдельных точек, а также
поддерживает текстуры и эффекты освещения в ограниченном объёме. В
отличие от стандартных материалов для мешей
(MeshBasicMaterial, MeshStandardMaterial),
PointsMaterial ориентирован именно на визуализацию облаков
точек, частиц и других аналогичных структур.
Для создания материала используется конструктор
THREE.PointsMaterial с объектом параметров:
const material = new THREE.PointsMaterial({
color: 0xff0000, // Цвет точек
size: 1.0, // Размер каждой точки
sizeAttenuation: true, // Зависимость размера от расстояния
transparent: true, // Включение прозрачности
opacity: 0.8, // Прозрачность
});
Ключевые параметры:
0xRRGGBB или объект
THREE.Color.true, размер
точки уменьшается с увеличением расстояния до камеры, создавая эффект
перспективы.Текстуры делают точки более выразительными. Наиболее часто применяются PNG-файлы с альфа-каналом:
const textureLoader = new THREE.TextureLoader();
const sprite = textureLoader.load('textures/particle.png');
const material = new THREE.PointsMaterial({
color: 0xffffff,
size: 5,
map: sprite,
transparent: true,
alphaTest: 0.5 // Отсечение полностью прозрачных пикселей
});
Особенности:
transparent: true и, при необходимости,
alphaTest.alphaTest помогает избегать наложения
прозрачных пикселей и улучшает производительность рендеринга.PointsMaterial часто используется вместе с
BufferGeometry для управления большим количеством
точек:
const geometry = new THREE.BufferGeometry();
const positions = [];
for (let i = 0; i < 1000; i++) {
positions.push(
(Math.random() - 0.5) * 100,
(Math.random() - 0.5) * 100,
(Math.random() - 0.5) * 100
);
}
geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
const points = new THREE.Points(geometry, material);
scene.add(points);
Особенности:
position.color,
size или кастомные атрибуты для шейдеров, если требуется
индивидуальное управление каждой точкой.Для сложных эффектов можно применять пользовательские шейдеры.
PointsMaterial поддерживает стандартные свойства, но их
можно расширять через onBeforeCompile:
material.onBeforeComp ile = function(shader) {
shader.vertexShader = shader.vertexShader.replace(
'#include <common>',
`
#include <common>
attribute float customSize;
`
);
shader.vertexShader = shader.vertexShader.replace(
'#include <begin_vertex>',
`
#include <begin_vertex>
transformed *= customSize;
`
);
};
Преимущества:
BufferGeometry вместо
Geometry. Это критично для большого количества точек.frustumCulled = true для
объектов, которые не видны камере.sizeAttenuation, чтобы избежать слишком больших элементов
на близком расстоянии.PointsMaterial не реагирует на свет стандартным
образом, если используется базовый color. Для освещённой
сцены можно применять THREE.PointsMaterial с шейдерами или
использовать THREE.PointsStandardMaterial (через
пользовательский шейдер).sizeAttenuation создаёт иллюзию перспективного
уменьшения точек, делая облака точек более естественными.PointsMaterial является основой для создания визуально
богатых и оптимизированных точечных сцен в Three.js, сочетая простоту
использования с высокой производительностью и гибкостью для кастомных
эффектов.