Комментарии 11
Балдеж! Надо писать больше статей о 3D-графоне на Хабр)
Модельки красивые, зашёл на сайт, покрутил, круто)
Классная статья, спасибо! Надеюсь, найду время что-нибудь набросать из своих моделек
P.S. Приятно видеть как увлечение лего стимулирует другие активности которые вроде бы изначальное с лего и не связаны :)
Эх, а я как ни начну играть в детское лего, то у меня то томограф получается:
то промышленная рентгеновская система для неразрушающего контроля:
Профессиональная деформация, так сказать... За наводку на glTF формат - спасибо, пригодится.
Я перепробовал несколько редакторов 3D-моделей Лего (моим главным условием была работа на Linux, либо в вебе)
А пробовал ли автор LeoCAD?
https://github.com/leozide/leocad/
Офлайн, опенсорс, в Linux работает.
как смешивать текстуры с разными развёртками, я не придумал.
Бежим по всем примитивам (треугольники и квадраты) модели использующей текстуру, а затем для примитива бежим по каждому пикселю (необходимый шаг итерации оцениваем переводя uv в пиксельные координаты, мы же знаем для какой они текстуры какого полного размера). Берём цвет и пишем его во вторую текстуру по другим uv координатам.
Единственный особый случай, который может быть нужно обработать - несовпадение размера в пикселях примитивов в разных текстурах. Тогда потребуется фильтрация либо при загрузке цвета, либо при сохранении.
Если у двух моделей общая normal map, но разная bump map и наоборот получатся разные текстуры для разных моделей. Если одинаковые, можно объединить и результат, обойдя все модели, но используя одну и ту же текстуру как таргет для записи. Но это не точно.
В таком алгоритме я вижу некоторые проблемы. Главным образом, они связаны с тем, что UV-маппинг - насколько я понимаю - не обязан быть обратимым.
Несколько треугольников модели могут иметь одни и те же UV для одной текстуры, но разные для другой.
Не для всех треугольников, у которых есть маппинг в одну текстуру, есть маппинг в другую. Скорее всего, такое реализовано просто маппингом всего треугольника в одну точку на текстуре.
То есть, грубо говоря, вот этот шаг не будет работать:
Берём цвет и пишем его во вторую текстуру по другим uv координатам.
Автор, может, сделаете тогда для этого формата какой-нибудь UMBXLoader для Three.js? Думаю, могут принять (хотя, вообще, там довольно жёстко -- говорю как человек, часто туда коммитящий).
Я не пользуюсь Three.js напрямую, поэтому с кодом не знаком. Плюс, то, что я уже сделал, в целом, покрывает мои требования. Поэтому писать такой лоадер мне уже не очень интересно. Если будет интересно кому-то другому, то код открыт :)
Если вдруг есть потребность - мой код можно использовать как препроцессор, а загружать в Three.js уже полученный glTF.
Как я разбирал нестандартный формат 3D-моделей, чтобы показывать Лего у себя на сайте