КАК ДЕЛАЕТСЯ ОБРАЗЕЦ.
На входе растровый этюд, на выходе SVG из плоских треугольников. Здесь напечатан сам конвейер, параметры, с которыми собран каждый образец, и две ошибки, вокруг которых конвейер построен.
tools/polygon-lab/facet.mjs
tools/polygon-lab/forge.mjs
ОДИН ОБЩИЙ БРИФ. ТРИНАДЦАТЬ РАЗНЫХ ФОРМ.
Каждый этюд начинается с общего производственного брифа, напечатанного ниже, а затем получает отдельную постановку и анатомическую заметку для своего вида. Так коллекция говорит на одном языке сложенной бумаги, но не клонирует один силуэт тринадцать раз. Полный реестр промптов Nano Banana и выбранные PNG лежат рядом с посчитанными по ним сетками.
Форж — скрипт в том же репозитории, tools/polygon-lab/forge.mjs. Он запускается руками при добавлении образца и в сборку сайта не входит. Один и тот же этюд с тем же зерном воспроизводит ту же сетку байт в байт, поэтому новый образец приходит диффом, который можно прочитать глазами.
premium editorial low-poly folded-paper sculpture with crisp interlocking triangular facets, visible paper depth and small edge shadows; authentic species anatomy; saturated vermilion, orange, yellow, acid green, emerald, teal, cobalt, violet and magenta on a high-key neutral white seamless background; restrained grounding shadow only; complete subject fully inside a square composition with generous margin; no scenery, pedestal, frame, text, logo or watermark; collectible design-object quality
ОДИННАДЦАТЬ ШАГОВ ОТ ЭТЮДА ДО СЕТКИ.
Каждый шаг — функция в tools/polygon-lab/facet.mjs. Приведённые параметры — те, с которыми коллекция собрана на самом деле.
- 01
Этюд читается
sharp декодирует закоммиченный PNG и приводит его к 900 единицам по ширине. Все дальнейшие шаги работают в этом пиксельном пространстве, и оно же становится viewBox у SVG.
- 02
Фон отрезается
Маска по яркости оставляет каждый пиксель, чей самый тёмный канал ниже потолка: по умолчанию 244 из 255, для отдельного образца потолок ужимается в манифесте. На белой бумаге без падающей тени это одно сравнение и есть весь рез.
- 03
Маска закрывается, потом открывается
Дилатация, эрозия, эрозия, дилатация с радиусом в один пиксель. Закрытие первым заполняет проколы, которые оставляет сжатый этюд; открытие следом убирает крошку. В обратном порядке эрозия сводит лапу к нулю раньше, чем дилатация успевает её вернуть.
- 04
Мелкие компоненты выбрасываются
Маска разливается на связные области. Остаётся самая большая и каждая область, занимающая хотя бы четыре процента её площади. Здесь уходит случайная крошка и остатки тени.
- 05
Обходится контур
Каждый пиксель маски, у которого есть сосед-фон, — граничный. Их прореживают до одной точки на несколько пикселей и кладут в набор первыми, поэтому силуэт режется настоящими вершинами. Граница маски дополнительно вписывается в поле краёв на полную силу, что притягивает к очертанию и остальные точки.
- 06
Внутренность засевается точками
Точки бросаются внутри собственного ограничивающего прямоугольника маски, поэтому бюджет тратится там, где стоит образец. Поле краёв по Собелю решает судьбу кандидата: на ровном участке держится порог 0,035, на переломе он поднимается почти до единицы. В одну ячейку синего шума попадает одна точка, а размер ячейки считается от площади маски — cell = √(площадь маски / (точки · 1,15)) — и это не даёт граням слипаться. Генератор — mulberry32 с зерном из манифеста, поэтому розыгрыш повторяется в точности.
- 07
Точки триангулируются
Одна триангуляция Делоне по всему набору, контур и внутренность вместе, через Delaunator.
- 08
Треугольники вне маски выбрасываются
Треугольник, чей центроид попал на фон, отбрасывается; вместе с ним уходит любой треугольник площадью меньше квадратной единицы. Остаток покрывает образец и заканчивается на его краю.
- 09
Грань получает цвет
Усредняются четыре пробы: центроид и три точки на полпути от него к вершинам. Среднее садится на краски, назначенные образцу, — четыре из девяти красок логотипа на рыночной пластине и все девять на знаке студии, — где тон выбирает семейство, а светлота выбирает одну из трёх ступеней: затемнение к чернилам, сама краска, высветление к белому. Грань без выраженного тона садится на чернила или на бумагу. Форж сажает цвет на полную силу, поэтому каждая грань опубликованной сетки держит одно из этих плоских значений.
- 10
Грани ранжируются вдоль оси
Ковариация центроидов даёт главную ось образца, и ранг грани — её проекция на эту ось, записанная в полигон как --i. Развёртка идёт вдоль тела: от носа к хвосту у четвероногого, от клюва к лапам у голенастой птицы, и ручную ось не приходится держать в согласии с рисунком.
- 11
SVG записывается
Координаты округляются до целых единиц: viewBox — 900 в ширину, и десятая доля единицы это доля пикселя. Затем каждая вершина отодвигается на 0,45 единицы от центроида своей грани, соседи слегка перекрываются, и между ними не остаётся волоска бумаги. В полигоне лежат только ранг и заливка. Второй, более грубый проход на 26 процентах бюджета сливает одноцветные грани в один путь на краску — этот файл грузят ячейки сетки и марки по 64 пикселя.
ЭТЮД И СЕТКА, КОТОРОЙ ОН СТАНОВИТСЯ.
Сначала закоммиченный этюд, следом сетка, посчитанная по нему форжем с параметрами из таблицы ниже. Каждое число здесь читается обратно из файлов.

Закоммиченный этюд, приведённый к 900 пикселям и сохранённый в WEBP.
Готовая сетка: один SVG из плоских треугольников, каждый со своим рангом вдоль оси.
- Бюджет точек
- 470
- Точек поставлено
- 470
- Зерно
- 7
- Маска
- lum
- Ширина расчёта
- 900 px
- Семейства красок
- teal · blue · purple · green
- Граней
- 842
- Граней в сеточной форме
- 356
- Красок
- 13
- Размер сетки
- 61 KB
- Размер этюда
- 37 KB
- Внесён
- 2026-09-03
ДВЕ ОШИБКИ, ВОКРУГ КОТОРЫХ ПОСТРОЕН КОНВЕЙЕР.
Обе записаны в памятке по направлению, и обе объясняют, почему шаг выше выглядит именно так.
- 01
Тяжёлая тень ломает рез
Тёмная тёплая тень набирает достаточно насыщенности, чтобы маска прочитала её как часть объекта: рез обходит тень, и скульптура выезжает стоящей на плите. Поэтому производственный бриф допускает только лёгкую светлую опорную тень на нейтральном белом — выше порога яркости. Все образцы реестра режутся одной и той же детерминированной маской.
- 02
Ячейка по кадру теряет лапы
Ячейка синего шума, которая разводит точки, сначала считалась от всего кадра. Образец занимает примерно треть кадра, поэтому ячейка по кадру оставляет внутри маски меньше свободных клеток, чем просит бюджет точек: сэмплер исчерпывает попытки, пока тонкие части ещё пустые, а у лапы без внутренней точки нет треугольника, чей центроид попал бы внутрь. Первый бобёр вышел из форжа без лап. Размер ячейки от собственной площади маски и розыгрыш внутри ограничивающего прямоугольника закрыли обе половины проблемы.
ПЕРЕСЧИТАНО И СВЕРЕНО.
node tools/polygon-lab/forge.mjs --check
Запуск форжа с --check пересобирает каждый образец из закоммиченного этюда и сверяет результат с реестром. Расхождение по числу граней, размеру файла или числу красок печатается как дрейф, и команда выходит с ненулевым кодом. Тот же прогон меряет каждую сетку по её потолкам — размер файла, число граней, размер этюда — и отказывается проходить, когда потолок превышен.
Дата внесения передаётся команде аргументом вместо чтения часов, поэтому пересборка неизменного этюда оставляет дату на месте, и реестр продолжает честно показывать возраст коллекции.
Каждая сетка коллекции опубликована по лицензии Creative Commons Attribution 4.0 International. Их можно использовать, изменять и публиковать в коммерческих проектах; единственное условие — строка атрибуции едет вместе с файлом.
Marketing MIX — field guide, plate 01, North American beaver. CC BY 4.0. https://mmix.biz/field-guide/plate-01-beaver/
Подставьте номер пластины, название и адрес того образца, который берёте.
ГОТОВЫ СТАТЬ ВИДИМЫМИ ДЛЯ ЛЮДЕЙ И МАШИН?
Два варианта: 30-минутный звонок для определения задачи или бесплатный снимок видимости в основных AI-поисковиках.
Или свяжитесь со студией напрямую
+1 613 867 7767info@mmix.biz
