Как стать автором
Обновить

Как я разбирал нестандартный формат 3D-моделей, чтобы показывать Лего у себя на сайте

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров8K
Всего голосов 87: ↑87 и ↓0+87
Комментарии11

Комментарии 11

Балдеж! Надо писать больше статей о 3D-графоне на Хабр)

Модельки красивые, зашёл на сайт, покрутил, круто)

Классная статья, спасибо! Надеюсь, найду время что-нибудь набросать из своих моделек
P.S. Приятно видеть как увлечение лего стимулирует другие активности которые вроде бы изначальное с лего и не связаны :)

Эх, а я как ни начну играть в детское лего, то у меня то томограф получается:

то промышленная рентгеновская система для неразрушающего контроля:

Профессиональная деформация, так сказать... За наводку на glTF формат - спасибо, пригодится.

невероятно круто!

Я перепробовал несколько редакторов 3D-моделей Лего (моим главным условием была работа на Linux, либо в вебе)

А пробовал ли автор LeoCAD?

https://github.com/leozide/leocad/

Офлайн, опенсорс, в Linux работает.

Честно говоря, я просто не разобрался в ее интерфейсе. Mecabricks в этом плане для меня оказался проще.

как смешивать текстуры с разными развёртками, я не придумал.

Бежим по всем примитивам (треугольники и квадраты) модели использующей текстуру, а затем для примитива бежим по каждому пикселю (необходимый шаг итерации оцениваем переводя uv в пиксельные координаты, мы же знаем для какой они текстуры какого полного размера). Берём цвет и пишем его во вторую текстуру по другим uv координатам.

Единственный особый случай, который может быть нужно обработать - несовпадение размера в пикселях примитивов в разных текстурах. Тогда потребуется фильтрация либо при загрузке цвета, либо при сохранении.

Если у двух моделей общая normal map, но разная bump map и наоборот получатся разные текстуры для разных моделей. Если одинаковые, можно объединить и результат, обойдя все модели, но используя одну и ту же текстуру как таргет для записи. Но это не точно.

В таком алгоритме я вижу некоторые проблемы. Главным образом, они связаны с тем, что UV-маппинг - насколько я понимаю - не обязан быть обратимым.

  • Несколько треугольников модели могут иметь одни и те же UV для одной текстуры, но разные для другой.

  • Не для всех треугольников, у которых есть маппинг в одну текстуру, есть маппинг в другую. Скорее всего, такое реализовано просто маппингом всего треугольника в одну точку на текстуре.

То есть, грубо говоря, вот этот шаг не будет работать:

Берём цвет и пишем его во вторую текстуру по другим uv координатам.

Автор, может, сделаете тогда для этого формата какой-нибудь UMBXLoader для Three.js? Думаю, могут принять (хотя, вообще, там довольно жёстко -- говорю как человек, часто туда коммитящий).

Я не пользуюсь Three.js напрямую, поэтому с кодом не знаком. Плюс, то, что я уже сделал, в целом, покрывает мои требования. Поэтому писать такой лоадер мне уже не очень интересно. Если будет интересно кому-то другому, то код открыт :)

Если вдруг есть потребность - мой код можно использовать как препроцессор, а загружать в Three.js уже полученный glTF.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий