Нормальный трипланарный маппинг в Blender

Злые языки поговаривают, что в Блендере нет нормального трипланарного маппинга. И эти претензии отнюдь не безосновательны. Ведь можно в настройках ноды текстур включить Box проекцию, но стоит только попытаться подвигать текстуру на свой вкус, как трипланарный маппинг тут же скукоживается.

badmapping_1.webp

Поэтому сегодня мы сделаем нормальный трипланарный маппинг в Блендере. И для этого нам понадобится совсем немножко шейдер нодов. Создадим новый материал и удалим всё лишнее. Затем добавим текстуру радиального градиента. И отколоррампим её так, чтобы радиальный градиент набегал с краев оси Y на края оси X.

pic_1.jpg

Теперь нам нужна маска, с помощью которой мы этот градиент нарежем на кусочки, из которых потом соберем специальную квадратную маску для трех проекций текстур. Поэтому копируем ноду градиента и колоррампа. И переключаем колоррамп с линейной интерполяции на постоянную. Получается вот такая красивая маска.

pic_2.jpg

Теперь эту маску нам нужно повернуть на ось X. Поэтому добавим ноду вектор ротате и поворачиваем маску.

pic_3.jpg

Теперь из первого градиента отрезаем кусочки с помощью маски и ноды Math Subtract.

pic_4.jpg

Теперь нам надо сделать регулируемый бленд, как в стандартной ноде текстур. Для этого добавим одну мапранже на выход нашей маски, а вторую мапранже на ноду валуе, через которую будем управлять силой размытия шва между проекциями текстур. Отмапранжированное значение валуя подаётся на мин и макс выходной мапранжы через пару матвычетаний со значениями 0.5001 и 0.5002. Почему именно такие значения? Это вам вопрос для самостоятельного изучения.

pic_5.jpg

Теперь через нашу валую мы можем блендить края маски.

pic_6.webp

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

pic_7.jpg

Теперь скопируем этот фрейм и повернем ее весь на 90 градусов по оси X.

pic_8.jpg

Склеим наши два фрейма вместе с помощью Math Add. И в итоге у нас получилась одна проекция квадрата на нормали по оси Х!

pic_9.jpg

Нам надо ещё две таких же проекции. Поэтому к нашим двум фреймам прикручиваем один общий вектор ротате, чтобы крутить квадрат во все стороны. И встраиваем наши два фрейма вместе с нодой вращения в ещё один общий фрейм для красоты.

pic_10.jpg

Теперь копируем наш суперфрейм два раза. И поворачиваем второй суперфрейм на 90 по Z, а третий - на 90 по Y.

pic_11.jpg

У нас получились квадратики для каждой оси! Разве это не прекрасно!? Этими квадратиками мы нарежем текстуры.

pic_12.jpg

А чтобы нарезать текстуры квадратиками, их нужно добавить. Поэтому добавляем три текстуры и поворачиваем их так, чтобы одна смотрела в сторону Z, вторая - в сторону X, третья - в сторону Y.

pic_13.jpg

Теперь нарезаем текстурки квадратиками. Текстуру с оси Z склеиваем с текстурой с оси X через маску-квадратик из суперфрейма с оси X. Результат смешиваем с текстурой с оси Y через маску оси Y. И в конце к результату приклеиваем еще раз текстуру с оси Z через маску оси Z. Зачем текстура с оси Z два раза? - спросите вы. Это единственный способ заткнуть дыры в бленде швов, который я смог придумать. ¯\_(ツ)_/¯

pic_14.jpg

Готово! Теперь нашим валуем мы можем поблендить швы между проекциями!

pic_15.jpg

Не блендится! - скажете вы. И будете правы. Ведь мы ещё не пробудили функцию бленда швов! Для этого нам надо отыскать во втором и третьем суперфрейме по паре нижних нод Math Subtract.

pic_16.jpg

И переключить их с вычетания на сложение.

pic_17.jpg

Швы сразу начнут блендиться в нужных местах! В ненужных - не будут. И можно будет, наконец-то, начать пользоваться нормальным трипланарным маппингом в Блендере! Как видите, ничего сложного. Делов на пять минут.

pic_19.webp

А если у вас ничего не получилось, то можете свериться вот с этой небольшой картинкой.

pic_18.jpg

Вот и трипланарной сказочке конец. А кто слушал - молодец.

758 0 850 4
32
2024-11-29
основное свойство трипланара ("нормального") - единая размерность текстур для разных объектов. Когда в максе натягиваешь одну ткань на диваны, кресла, стулья - и везде она выглядит одинаково. + локальные повороты объектов тоже учитываются. Д,а в блендоре в ноде TexCor - можно указать кубик и им задать единую размерность. Но качество отображения ткани на разных объектах будет полное г.., не применимое в работе...
2024-11-29
Сергей, ну, как говорится - терпим. Или забыл, в какой проге работаешь? 🤔
2024-11-29
да привык уже.. усредняю масштаб uv... но обыдна.
2024-11-29
Перешёл по ссылке....увидел совсем немного нод🫤открыл субстанс
2024-11-29
Это невероятно удобно. Как жил раньше без этого.
2024-11-30
Сергей, я может чего-то не понимаю, но в чём проблема вот такого подхода, с указанием контрольного объекта для общего масштаба текстуры?
2024-11-30
Сергей, в качестве результата - при натягивании единого материала ткани на разные предметы мебели (стулья, диваны, кресла), которых много, стоят инстансами под разными углами, - на примерно трети из них образуется проплешины, при мелкой ткани это очень заметно...
2024-11-30
Сергей, а если так?
2024-11-30
Сергей, на первый взгляд выглядит получше... надо будет потестировать на диванах...
2024-11-30
Сергей, в некоторых случаях уже применимо, но сползание текстуры обивки при поворотах объекта не побороть... в максе оно не сползает...
2024-11-30
Сергей, я вошёл во вкус. Чот, как ни кручу - ничего не сползает. Уверены, что правильно сетап собрали?
2024-11-30
Сергей, да вроде.. кручу диван по Z вокруг своей оси... евой...
2024-11-30
Сергей, вот это ключевой момент, который легко пропустить
2024-11-30
Сергей, в 4.2.4 собралось вот так
2024-11-30
Сергей, да, прошу прощения, дезинформировал. Тогда вот так, даже ещё проще сетап. Там где внизу подписано "опционально" это если хочется на уровне всей сцены через контрольный объект масштабировать текстуру. А так можно просто scale в ноде Mapping крутить
2024-11-30
Сергей, это решает задачу масштабирования одного объекта, и если один диван - действительно не сползает. Но задача в том чтобы снять TexCor с кубика и натянуть его на многие разные объекты (одновременно на диван, стул, кресло под разными углами), и там при их кручении все сползает...
2024-11-30
Сергей, я что-то не так делаю, но как ни кручу - не сползают текстуры, хоть ты тресни 😑
2024-11-30
Сергей, так правильно ты снял TexCor с этого же дивана, его и крутишь. А ты сними их с кубика, который крутиться не будет, он стоит на месте. а диван крутиться и их мировые координаты не совпадают...
2024-11-30
Сергей, а в чем смысл этого упражнения? Зачем мне снимать координаты с кубика??
2024-11-30
Сергей, Опишите задачу, а то я реально не понимаю, какого эффекта Вы пытаетесь добиться :)) Вот он трипланарный мэппинг (то, что он в блендере называется Box Mapping сути не меняет - это одно и то же), вот мы отвязали его от масштаба объекта в сцене. При этом текстура вращается вместе с объектом. При этом масштаб текстуры контролируется глобально через контрольный объект. Я что-то упускаю?
2024-11-30
Сергей, чтобы попытаться приблизиться к максовскому трипланару - кубик будет выдавать ендиный масштаб uv для любого объекта в сцене. Но объекты не могут добавлять свой локальный поворот относительно кубика, чтобы компенсировать сползание...
2024-11-30
Сергей, я просто хочу аналог максовского получить, но хрен. Тут только box - к нему тот же генератор кирпичей не подключишь - там тока flat... чтобы ткань на мебели лежала прямо к крутилась вместе с ней..
2024-11-30
"Но объекты не могут добавлять свой локальный поворот относительно кубика, чтобы компенсировать сползание..." © Не понял, не должны или сейчас не могут добавлять локальный поворот? Ладно, давайте по-другому попробуем. Сейчас, в решении которое я предложил, что конкретно не работает? - Текстура наложена через трипланар ✅ - Текстура не сползает ✅ - Масштабируется глобально контрольным объектом ✅
2024-11-30
Сергей, у меня как только поворот по Z дивана отличается от кубика - сползает... атрибут видимо не возвращает локальное вращение дивана нивкакую...
2024-11-30
Сергей, попробуйте тут. Это файл, с которого я записывал видосы (текстур только нет внутри). Собран в 4.3.0
2024-11-30
Сергей, вижу не сползает, а почему? т.к. в TexCor не указан никакой объект. значит он берет его с самого дивана.... и вращение совпадает... а как укажешь там box, все сползет...
2024-11-30
Сергей, вообще изначальная мысль о компенсации локального вращения объекта мне кажется правильной, надо будет на досуге подумать основательно...
2024-11-30
Сергей, так не надо указывать там box. Масштаб текстуры берется уже из ноды Attribute
2024-11-30
Сергей, у тебя там копии одного объекта, а не разные... запихни диван, кресло, стул... и поймешь зачем нужен box...
2024-11-30
Сергей, всё ожидаемо работает как положено с любыми объектами
2024-12-02
Слишком переусложнённый механизм получения масок по направлениям осей. Это делается гораздо проще. Параметр Fade отвечает за ширину зоны смешивания. Чем он выше - тем уже полоска смешивания.
2024-12-02
жостко)))
RENDER.RU