SimpleMeshLayer предназначен для отображения произвольных 3D-мешей, загружаемых или создаваемых программно, с возможностью инстансинга и привязки геометрии к данным. Слой работает поверх WebGL и опирается на концепцию «одна геометрия — множество экземпляров», что делает его удобным для визуализации повторяющихся объектов: зданий, транспортных средств, биологических структур, датчиков, точек с объемным представлением.
Основная особенность слоя заключается в разделении:
SimpleMeshLayer строится вокруг WebGL-рендеринга через шейдеры и атрибуты вершин. Каждый экземпляр меша получает собственные матрицы трансформации и параметры цвета.
Ключевые компоненты:
SimpleMeshLayer принимает геометрию в нескольких форматах:
Geometry (из Three.js-совместимых структур)positions, normals,
indicesТипичная структура:
const mesh = {
positions: new Float32Array([...]),
normals: new Float32Array([...]),
indices: new Uint16Array([...])
};
Важным аспектом является то, что геометрия должна быть корректно нормализована, поскольку трансформации выполняются на уровне инстансов.
Определяет базовую геометрию. Один и тот же mesh используется для всех элементов данных.
Массив объектов, каждый из которых представляет отдельный экземпляр:
[
{position: [x, y, z], color: [r, g, b]},
{position: [x, y, z], color: [r, g, b]}
]
Функция или строка доступа к координатам:
getPosition: d => d.position
Определяет цвет экземпляра. Поддерживаются RGBA массивы:
getColor: d => [255, 120, 0, 200]
Масштабирование меша на уровне инстанса:
getScale: d => d.scale || 1
Позволяет задавать поворот в виде Euler-углов или кватернионов.
SimpleMeshLayer использует WebGL instancing, что позволяет:
Каждый экземпляр получает:
GPU выполняет трансформацию вершин для каждого instance параллельно.
Слой поддерживает базовую модель освещения:
Материал не является физически корректным PBR, но позволяет:
Нормали mesh критически важны для корректного освещения.
import {SimpleMeshLayer} from '@deck.gl/mesh-layers';
const layer = new SimpleMeshLayer({
id: 'mesh-layer',
data: points,
mesh,
getPosition: d => d.coordinates,
getColor: d => d.color,
getScale: d => d.size,
sizeScale: 10,
parameters: {
depthTest: true
}
});
SimpleMeshLayer работает в координатной системе карты (например, Web Mercator). Это означает:
Поддерживаются:
Ключевые факторы производительности:
1. Размер mesh
2. Количество инстансов
3. Атрибуты данных
4. Буферизация
При масштабировании данных применяются техники:
SimpleMeshLayer хорошо комбинируется с другими слоями, например, ScatterplotLayer или ColumnLayer для гибридных сцен.
Mesh может поддерживать UV-координаты, позволяя накладывать текстуры:
Пример:
texture: 'buildingTexture.png'
Важно учитывать:
Поддерживаются несколько стратегий:
Типичная проблема — gimbal lock при использовании Euler, поэтому для динамических сцен предпочтительнее кватернионы.
Часто используется совместно с загрузчиками:
Пайплайн:
SimpleMeshLayer поддерживает picking для взаимодействия:
Каждый instance имеет уникальный индекс, передаваемый в pickingInfo:
onClick: info => {
const object = info.object;
}
SimpleMeshLayer часто используется в композиции:
Комбинация позволяет строить многослойные 3D-сцены с различной семантикой данных.
Внутренний pipeline включает:
Производительность зависит от: