Я давно хотел печатать на 3D-принтере своё. Скачать готовую модель и отправить в печать — дело пяти минут, но такая же штука стоит на полке у каждого, кто её скачал. Хотелось чего-то, чего больше ни у кого нет.

Помогли нейронки, которые делают из картинки 3D-модель. Онлайн-сервисы за это хотят денег: у Tripo тариф Pro — $20 в месяц примерно за 200 моделей, у Meshy — около $20 за 1000 кредитов, это до 100 моделей. На бесплатных тарифах — 13 и 10 моделей в месяц, плюс ограничения по лицензии: у Tripo нельзя коммерческое использование, у Meshy — CC BY с обязательным указанием авторства. Я пошёл другим путём: TRELLIS.2 от Microsoft бесплатно крутится у меня на ПК с RTX 5060 Ti 16 ГБ, и перегенерировать можно сколько влезет.

Так у меня появились два светильника: орочий череп, который светится изнутри, и планета-литофания на подставке из корней. Между красивой картинкой и вещью, которая собирается и светится, оказалась куча возни: полость под лампу, патрон, посадка, поддержки. А нейронка, как выяснилось, нужна не везде — гладкую планету проще посчитать формулой.

Орочий череп светится изнутри. Пока он стоит на подставке от планеты: своего провода у него ещё нет.
Орочий череп светится изнутри. Пока он стоит на подставке от планеты: своего провода у него ещё нет.
Планета на подставке из корней. Корни тоже пластиковые. Вживую рисунок виден лучше: камера пересвечивает яркие участки.
Планета на подставке из корней. Корни тоже пластиковые. Вживую рисунок виден лучше: камера пересвечивает яркие участки.

Скрипты, пример карты и инструкция — на GitHub, готовые STL — в релизе. Можно взять детали как есть или прогнать процесс со своим рисунком.

1. Череп: нейронка дала форму, обработка чуть не стёрла лицо

Начну с черепа: на нём лучше всего видно, что сырой выхлоп нейронки — ещё не модель для печати. В режиме 1536_cascade TRELLIS.2 не влез в 16 ГБ видеопамяти на декодировании. В 1024_cascade без текстур прогон занял 181 секунду с пиком 12 ГБ, на выходе — около 24 млн треугольников.

Напечатанный череп без подсветки. Эти глазницы и клыки обработка и должна была сохранить.
Напечатанный череп без подсветки. Эти глазницы и клыки обработка и должна была сохранить.

Сначала попробовал превратить сырую сетку в сплошное тело, а уже в нём вырезать место под лампу. Но обработка залепила глазницы и отверстия у висков. Череп стал выглядеть иначе, мне не понравилось. Вернулся к исходной сетке.

В build_preserved_shell.py вокселизуется только поверхность: вокруг неё наращивается узкая полоса материала, и из неё заново собирается сетка. Внутренний объём не заливается, поэтому глазницы и височные окна остаются открытыми. Мелкие щели при этом могут затянуться, так что толщину полосы подбираешь под размер деталей.

Вид сбоку. После смены оболочки сверяю профиль, клыки и отверстия, замкнутости сетки для этого мало.
Вид сбоку. После смены оболочки сверяю профиль, клыки и отверстия, замкнутости сетки для этого мало.

Потом вылезли две ошибки, которых на красивом рендере не видно. После утолщения часть оболочки ушла ниже нуля, и при переносе на стол опорное кольцо приподнялось примерно на 1,2 мм — принтер начал бы печать не с него. Помогло обрезать модель по плоскости стола до финального выравнивания. Вторая: короткое отверстие под лампу упиралось внутри черепа в плоский потолок. Продлил полость выше и закрыл её сужающимся сводом.

Разрез: опорное кольцо стоит на плоскости стола, полость закрывается наклонным сводом. Рендер.
Разрез: опорное кольцо стоит на плоскости стола, полость закрывается наклонным сводом. Рендер.

С поддержками не прокатило просто сделать стойки толще: некоторые участки всё равно начинались в воздухе. Тогда скрипт стал проходить модель снизу вверх, искать места, которым не на что опереться на предыдущем слое, и отмечать длинные мосты. Нашлось 12 таких зон — им добавили опоры.

Скрипт черепа заточен под эту модель: координаты опоры и полости привязаны к ней. В репе он лежит как пример подхода — под другую модель их придётся пересчитать. Своего провода у черепа пока нет, поэтому светится он на подставке от планеты. О ней дальше.

2. Планета: сначала размеры, потом рисунок

Планету я строил с другого конца — от покупных деталей. Светильник — это плафон, подставка и обычный узел: лампа, патрон, провод. E27 — это только резьба лампы, наружный диаметр корпуса патрона из неё не узнаешь. А колба должна пролезть в нижнее отверстие плафона: в 58,4 мм лампа диаметром 60 мм не войдёт.

Деталь или сопряжение

Размер в этой сборке

Зачем его знать

Планета

Диаметр 140 мм

Задаёт свободное место между корнями

Нижнее отверстие цельной планеты

58,4 мм

Через него проходят лампа и центрирующий пояс

Опорное кольцо планеты

Наружный диаметр 67,6 мм, высота 4 мм

Стоит на столе при печати, затем опирается на подставку

Полка и центрирующий пояс подставки

68 и около 57,6 мм

Полка несёт вес, пояс удерживает шар от бокового смещения

Корпус патрона

Не шире 46 мм и не длиннее 55 мм

Под него сделано гнездо 46,4 мм

Лампа

LED с колбой около 45 мм

Проходит через отверстие с запасом

Зазор между поясом и отверстием — (58,4 − 57,6) / 2 = 0,4 мм. Реальная печать его съедает, так что сначала лучше напечатать короткую посадочную часть planet_base_test_10mm.stl и примерить, а уже потом гнать весь шар.

3. Как плоская картинка становится светящимся шаром

Нейронка здесь не нужна. Планета — литофания: рисунок проявляется за счёт толщины пластика, тонкое светится ярче, толстое — темнее. Снаружи шар гладкий, рисунок меняет внутреннюю поверхность. На вход скрипту идёт плоская развёртка 2:1: горизонталь становится долготой, вертикаль — широтой. Левый и правый края встретятся на шаре, так что разрыв между ними превратится в заметный меридиан.

Пример карты из репозитория: белое станет тонким и ярким, чёрное — толстым и тёмным.
Пример карты из репозитория: белое станет тонким и ярким, чёрное — толстым и тёмным.

После перевода карты в серый и нормализации яркости толщина считается одной строкой. У меня минимум — 0,8 мм, максимум — 3 мм:

thickness = 0.8 + (1.0 - brightness) * (3.0 - 0.8)
# brightness: 0 — чёрное, 1 — белое

Для каждой точки сферы скрипт строит наружную и внутреннюю вершины, соединяет соседние точки треугольниками и замыкает нижний край. Возле основания переход устроен отдельно: узкая нижняя кромка должна устойчиво печататься. Всё это видно в make_clean_whole_lithophane.py.

Первую планету я печатал двумя половинками: их удобно класть на стол широкой стороной. Но на просвет клеевой шов стал частью рисунка — так себе. Цельный шар шов убирает, зато начинается с узкой нижней части. Поэтому у него кольцевой воротник шириной 4,6 мм и высотой 4 мм вместо тонкой кромки или однослойной «юбки».

Как повторить планету: команды, свой рисунок и проверки

Чтобы повторить пример в Windows с Python 3.12, скачайте репозиторий и выполните в его папке:

python -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe tools\rebuild_example.py planet

В build появятся planet.stl, отчёт planet_metrics.json и расчётная карта светопропускания. Повторный запуск собирает тот же STL, что у напечатанной планеты, байт в байт.

Для своего рисунка достаточно передать карту через --lightmap: на входе развёртка 2:1, на выходе сферический плафон. Для первой попытки лучше заменить только картинку, оставив проверенные размеры и толщины. Полная команда со всеми параметрами — в README. Форму генератор не меняет: им делаются шары с разными рисунками, череп так не построить.

После экспорта скрипт проверяет замкнутость сетки, число компонентов и 125 сечений нижних 25 мм. Проверка строгая: на подробной карте она может ругаться на внутренние полости, так что счётчик bad_sections — повод открыть сечения и посмотреть. Последнее слово за слайсером: нижние слои, нависания, траектории стенок.

4. Подставка: нейронка рисует корни, скрипт освобождает место

Для корней порядок обратный: сначала образ, потом механика. Эскиз нарисовал встроенный генератор картинок в Codex; локальная FLUX.1 Krea dev через ComfyUI на том же ПК тоже выдавала годные эскизы. Для 3D важнее читаемая форма, однотонный материал и чистый фон, чем выбор генератора. На слово «подставка» генераторы упорно рисовали глубокую чашу, в которой планета утонула бы наполовину, поэтому я просил открытое место между корнями. Дальше TRELLIS.2 перегнал эскиз в объём.

Но фронтальный рисунок ничего не говорит о глубине. В 3D верхушки корней оказались в 30–38 мм от оси при радиусе шара 70 мм: вычитание сферы просто срезало бы ветки. Попробовал поднять шар повыше — и вместо планеты в корнях получилась планета на трубе.

Отбракованный вариант: корни целы, но вместо планеты в корнях — планета на трубе. Рендер.
Отбракованный вариант: корни целы, но вместо планеты в корнях — планета на трубе. Рендер.

Решение — сначала плавно развести ветви, а потом вычитать место для шара. Основание остаётся на месте; смещение начинается на высоте 45 мм и достигает 30 мм к высоте 125 мм. Для перехода используется smoothstep: при нормированной высоте u коэффициент равен 3u² − 2u³. Поэтому у корней не появляется резкого излома на границе деформации. Центральная область под патрон из этого смещения исключена.

После разведения ветвей шар опускается между ними. Вес несёт полка, корни остаются декором.
После разведения ветвей шар опускается между ними. Вес несёт полка, корни остаются декором.

Дальше важная операция, которую легко пропустить: освободить не только конечное положение шара, но и весь путь установки сверху. Скрипт строит объём, занимаемый движущимся шаром, и вычитает его из корней. Центральный проход внутри нижнего отверстия оставляет — там должен находиться патрон. Если вычесть сплошную сферу без этого исключения, она срежет и допустимую центральную часть.

Как повторить подставку и адаптировать её под свою модель

Для геометрии — Python, NumPy и trimesh, для булевых операций — manifold3d. make_cradle.py получает уже замкнутую декоративную сетку. Чтобы повторить этап без TRELLIS, я положил в архив промежуточную stand_solid_04.stl: распакуйте его в папку reference и выполните:

.venv\Scripts\python.exe tools\rebuild_example.py stand

Пресет рассчитан на прежний шар с отверстием 59,2 мм. Для печати готовой сборки берите stand_print.stl, а под свои размеры пересчитывайте посадку целиком: параметры скрипта описаны в README.

Полку тоже пришлось переделать: плоское кольцо снизу давало нависание. Вместо поддержек я сделал нижнюю поверхность наклонной — полка 68 мм с фаской высотой 8 мм. Скрипт следит, чтобы высота фаски была не меньше радиального вылета.

Напечатанная подставка без плафона: видны патрон, опора и свободное место между корнями.
Напечатанная подставка без плафона: видны патрон, опора и свободное место между корнями.

Ещё одни грабли — облегчение модели. Два способа уменьшить число треугольников после булевых операций сломали топологию. Печатную версию пришлось собирать из более грубой промежуточной сетки с шагом 0,4 мм и заново повторять точные операции.

Каменная подставка вместо корней

А если вместо корней — другая подставка? Я прогнал тот же make_cradle.py на каменной композиции: код менять не пришлось, только заготовку и параметры посадки. Обработка заняла 14 секунд, проверка — ещё 27. Сетка замкнута, с плафоном не пересекается, Bambu Studio её нарезал; этот вариант я пока не печатал. Заготовка и пошаговая инструкция — в README. На входе нужна уже замкнутая модель: сырой выход нейросети сначала придётся замкнуть.

5. Что проверить в слайсере, прежде чем тратить катушку

У литофании надо смотреть, чем слайсер заполнил стенку. Если внутри осталась решётка, при включённой лампе её будет видно поверх рисунка. Поэтому в предпросмотре проверяю, чтобы в стенке плафона были только периметры и сплошные линии, без Sparse infill.

Настройки слайсера и порядок печати

Параметр

Цельная планета

Тёмная подставка

Сопло

0,4 мм

0,4 мм

Слой

0,10 мм

0,16–0,20 мм

Стенки

8, генератор Arachne

3–4

Заполнение

100%, проверка отсутствия решётки в стенке

20–25%

Внешняя кайма

Проверить по короткому тесту основания

5 мм

Старый 3MF с 0,20 мм, пятью стенками и 15% заполнения я бы без просмотра траекторий не переносил. Профиль материала — под свою катушку. Поддержек в STL нет: нужны ли они, видно по нарезке.

Порядок печати: сначала planet_base_test_10mm.stl тем же профилем, примерка к подставке, потом полный плафон. В полном STL стоит отдельно пройти первые слои, переход воротника в сферу и нависания, а у подставки — канал провода и обратные стороны ветвей.

Собирать при выключенном питании: патрон, лампа, потом шар вертикально на пояс — он должен садиться без усилия, не продавливаясь между корнями. Сетевую часть лучше взять готовую, исправный узел с проводом: напечатанный канал не заменяет нормальное крепление кабеля. Лампа — только LED.

Что получилось и что можно забрать себе

Для повторения основной пример — планета с древесной подставкой, для каменной композиции есть отдельный пресет. Ниже — космическая подставка, которую я напечатал раньше.

Второй вариант подставки без плафона.
Второй вариант подставки без плафона.
Та же сборка с зелёной подсветкой. Цвет лампы сильно меняет впечатление.
Та же сборка с зелёной подсветкой. Цвет лампы сильно меняет впечатление.

Готовая деталь

Примерная масса

Планета

140 г

Череп

157 г

Древесная подставка

Около 120 г

Космическая подставка

Около 85 г

Массы примерные, без брака и поддержек. Всё остальное — в репе со скриптами и инструкцией, архиве эталонных деталей и результатах проверок.

Корни и череп получились из картинок, но сразу печатать их не вышло. Посадки, полости и проверки геометрии пришлось делать отдельными скриптами с помощью ИИ-агента. А потом уже печатать и примерять детали.

Если тоже делаете модели из картинок — напишите в комментах, чем доводите сырую сетку до печати. И вообще интересно: печатаете своё или качаете готовое?

Комментарии (3)


  1. vokuzh_by
    20.10.2026 02:48

    Единственно оправданное применение ИИ


    1. andy212
      20.10.2026 02:48

      Применение 3D принтеров тоже было поначалу подобным описанному в статье. Печать всяких котиков и эльфов. Но сейчас уже не так. Даже не говоря про промышленное использование. Покупал на маркетплейсе копеечную отпечатанную запчасть для капучинатора кофемашины взамен оригинальной за бешеные деньги. И таких примеров множество.

      Технологии ИИ в целом хороши, если не ожидать от них возможностей Творца. Вопрос в правильном, а не бездумном применении.


      1. NeordPsy Автор
        20.10.2026 02:48

        Согласен! Детальки/запчасти ИИ тоже уже неплохо помогает делать в блендере