Grid Material в CesiumJS представляет собой один из процедурных материалов, используемых для визуального наложения регулярной координатной сетки на поверхности геометрии. Он применяется для визуальной ориентации в пространстве сцены, анализа масштабов, отладки геометрии и создания технических визуализаций, где требуется подчеркнуть структуру поверхности или объёма.
Grid material относится к классу процедурных материалов, генерируемых на основе математических функций в шейдере, а не текстурных изображений. В отличие от image-based материалов, grid-материал формируется динамически на GPU и зависит от параметров координат поверхности.
Основная идея заключается в разбиении поверхности на равномерную сетку линий, задаваемую параметрами:
Grid материал может применяться к примитивам (primitives), полигонам, стенам (wall geometries), эллипсам, а также к extruded geometries.
В CesiumJS система материалов базируется на унифицированных шейдерных шаблонах. Каждый материал описывается как набор:
Grid material является встроенным типом материала и подключается
через Material.fromType("Grid") или через
GridMaterialProperty в entity API.
Основной принцип работы:
Grid материал имеет набор управляемых параметров, которые определяют визуальную структуру сетки:
Grid material чаще всего используется через свойство
GridMaterialProperty, которое интегрируется с системой
сущностей.
Пример конфигурации:
viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
-100.0, 30.0,
-90.0, 30.0,
-90.0, 40.0,
-100.0, 40.0
]),
material: new Cesium.GridMaterialProperty({
color: Cesium.Color.BLUE.withAlpha(0.2),
lineColor: Cesium.Color.WHITE,
cellAlpha: 0.1,
lineCount: new Cesium.Cartesian2(10, 10)
})
}
});
В этом контексте материал применяется к поверхности полигона и динамически обновляется при изменении свойств.
На уровне primitives grid material подключается через
MaterialAppearance или
EllipsoidSurfaceAppearance.
Пример:
const instance = new Cesium.GeometryInstance({
geometry: new Cesium.RectangleGeometry({
rectangle: Cesium.Rectangle.fromDegrees(-120, 20, -60, 50)
})
});
const primitive = new Cesium.Primitive({
geometryInstances: instance,
appearance: new Cesium.EllipsoidSurfaceAppearance({
material: Cesium.Material.fromType("Grid", {
color: Cesium.Color.BLACK,
cellAlpha: 0.2,
lineColor: Cesium.Color.YELLOW
})
})
});
Внутри CesiumJS grid material реализован через fragment shader, где используется разложение координат на сеточную структуру.
Типичная логика:
Псевдологика:
vec2 coord = st * lineCount;
vec2 grid = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);
float line = min(grid.x, grid.y);
float alpha = 1.0 - smoothstep(0.0, thickness, line);
Такая реализация обеспечивает:
Grid material имеет важную особенность — он не зависит от разрешения текстуры, но зависит от масштаба сцены.
При увеличении масштаба:
При уменьшении масштаба:
Для стабилизации поведения применяются:
lineCountGrid material часто используется в следующих задачах:
В отличие от текстурированных материалов, grid материал сохраняет чёткость при любом уровне приближения, что делает его удобным для аналитических систем.
Alpha blending в grid material имеет ключевое значение. Параметры прозрачности влияют не только на фон, но и на восприятие сетки.
Важные моменты:
Grid material имеет ряд ограничений:
Также следует учитывать производительность:
Grid material может изменяться в runtime, что позволяет использовать его для интерактивных систем.
Пример изменения параметров:
entity.polygon.material.cellAlpha = 0.3;
entity.polygon.material.lineColor = Cesium.Color.RED;
entity.polygon.material.lineCount = new Cesium.Cartesian2(20, 20);
Такая динамика полезна для:
Grid material входит в набор встроенных процедурных материалов, среди которых:
В отличие от них, grid material ориентирован на регулярную двумерную структуру и наиболее близок к координатной визуализации.
Grid material демонстрирует различное поведение в зависимости от геометрии:
Искажения на сферических поверхностях являются ожидаемым результатом, так как сетка проецируется в геодезическом пространстве.
Grid material часто используется как вспомогательный слой визуализации в комплексных сценах:
Его ключевая ценность заключается в универсальности и независимости от внешних ресурсов, таких как текстуры или серверные данные.