Официальная обложка img2threejs: одна фотография на входе, процедурная модель на выходе — винтовка AWP Medusa, 37 тысяч треугольников, 150 частей

«Фото → 3D» последние годы означало одно: нейросеть выдаёт готовый меш, вы качаете файл на 30–80 мегабайт, грузите его в браузер и молитесь, чтобы он влез в бюджет по памяти. img2threejs предлагает другой выход: на входе фотография, на выходе — код на TypeScript, который собирает объект из примитивов и процедурных шейдеров прямо в Three.js. Ни меша, ни текстур, ни скачивания.

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

«Качество будет хуже фотограмметрии»

Да, будет. Это не скан объекта, а реконструкция по одному снимку: оригинал виден только с одной стороны, скрытые грани достраиваются зеркалом, а не выдумкой. Репозиторий сам пишет об этом в разделе «Honesty about limits»: сильная сторона — предметы с жёсткими формами, персонажи выходят стилизованными, а не фотореалистичными, и фраза «по этому снимку заявленной точности не достичь» — нормальный ожидаемый результат. Мне такая честность в README нравится больше обещаний «100% похожести».

«Агент сожжёт токены, пока это ваяет»

Здесь наоборот: вся архитектура сделана вокруг экономии. Валидацию, гейты, сборку листов сравнения и состояние конвейера держат Python-скрипты, а модель тратит токены только на визуальное суждение и код — смотрит один лист, где референс стоит рядом с рендером, и решает: прошло или нет. Генерация идёт по проходам и не переписывает модель целиком, а строгий гейт останавливает слабую спецификацию до первой строки Three.js. Скрипты — чистый Python 3.10+ без зависимостей, PNG читают через struct и zlib: ставить нечего и отлаживать нечего.

«Ещё один генератор, который выдаст мусор»

Конвейер разбит на этапы: blockout → структура → форма → материал → поверхность → свет → интерактив → оптимизация, и каждый проходит визуальную приёмку. Перед генерацией собирается опись деталей, которые и делают объект узнаваемым: глянец, фаски, винты, гравировки, потёртости — и каждая должна лечь в реальный компонент или материал. На выходе — JSON-спецификация и фабрика createObjectNameModel(), возвращающая THREE.Group с узлами, сокетами и коллизиями в userData, чтобы модель можно было анимировать, а не только разглядывать.

Что я проверил сам

16,5 тыс. звёзд, лицензия Apache-2.0, язык Python, последний коммит 13 сентября, версия 2.0.0. Работает под Claude Code, Codex и OpenCode — к одному агенту не привязан. В галерее 15 демок: наушники Sony WF-1000XM3, велосипед BMX, скины ножей из CS2 с отдельными гейтами покрытия компонентов, домик Дораэмона. Три демки помечены как placeholder — рендерятся, но работой автора ещё не считаются.

Я не стану обещать клиенту, что по одному фото мы отдадим точную модель товара. Но как способ получить вращаемый объект для лендинга — без мегабайтов, без загрузки ассетов и с кодом, который можно править руками, — это первый инструмент такого рода, который я поставил себе в проект.

#apet #разработка #AI #код

← Ко всем статьям