Всем привет! На прошлой неделе я опубликовал видео, в котором показал, как применить Color Ramp вдоль оси Z объекта, как в локальном, так и в глобальном режиме, чтобы создать градиент по высоте объекта. В этом уроке я расширю концепцию отображения по оси, чтобы создать цветовой градиент и смешивание между двумя Shaders. Конкретный пример, это цветной индикатор выполнения, но показанные методы можно применять и в других ситуациях. При горизонтальном перемещении управляющего объекта Empty мы увидим, как индикатор заполняется, меняя цвет от красного к зелёному через жёлтый. Сначала покажу начальную настройку сцены. У нас есть объект Plane, который был растянут по оси X. Для удобства я поместил его Origin в верхний левый угол. Также к этому объекту были применены трансформации поворота и масштаба. Этот Plane больше не будет изменяться. Второй объект в сцене, это Empty, размещённый в той же точке, где находится Origin Plane. К нему также применены поворот и масштаб. Этот Empty будет управлять прогрессом индикатора, который будет реализован полностью через Material объекта Plane, без изменения его геометрии. Материал Plane должен выполнять две задачи. Сначала нужно задать градиент вдоль оси X. После этого мы сделаем так, чтобы все области справа от Empty стали прозрачными, а слева, окрашивались в градиент, который мы определим. Начнём с цветового градиента по всей поверхности объекта. Как и в прошлом уроке, нам понадобятся ноды Texture Coordinate, Separate XYZ и Color Ramp, соединённые последовательно. Мы используем выход Generated из нода Texture Coordinate, так как нас интересуют собственные размеры объекта Plane. Из нода Separate XYZ нам нужен выход X, который представляет собой локальную горизонтальную ось Plane. Теперь Color Ramp нужно подключить к ноду Emission, потому что мы хотим, чтобы материал всегда был видимым и не зависел от освещения. Поэтому мы заменяем стандартный нод Principled на Emission. Color Ramp можно настроить по своему вкусу. В моём случае я размещаю красный маркер слева, жёлтый в центре и зелёный справа, используя интерполяцию Ease, чтобы красный и зелёный не ограничивались только краями. Чтобы закрасить только левую часть относительно Empty, а правую сделать прозрачной, нужно добавить два Shader-нода в редакторе. Это ноды Transparent и Mix Shader. Обратите внимание, что нужно выбрать Mix Shader, а не Color Mix. Затем подключите нод Emission к первому входу Shader нода Mix Shader. Подключите нод Transparent, который должен быть чисто белым, ко второму входу Shader нода Mix Shader. Подключите выход нода Mix Shader ко входу Surface нода Material Output. На этом этапе у нас есть полупрозрачный Material с градиентом от красного до зелёного, через жёлтый. В ноде Mix, будь то Color или Shader, второй вход используется полностью только тогда, когда значение Factor равно 1. Поэтому нам нужно найти способ установить Factor равным 1 справа от позиции Empty. Добавим в редактор ноды Texture Coordinate и Separate XYZ и подключим выход X из Separate XYZ к входу Factor в ноде Mix Shader. На этот раз мы используем выход Object из нода Texture Coordinate и указываем Empty в поле Object этого нода. Теперь материал будет прозрачным справа от Empty и цветным слева, как и задумано. Однако мы видим, что материал остаётся полупрозрачным и далеко за пределами позиции Empty. Чтобы переход к ноду Emission происходил резко прямо на позиции Empty, вставим нод Math между Separate X и Mix Shader, установив режим Greater Than и значение порога Threshold равным 0. Таким образом, нод Greater Than будет использовать координату X объекта Empty и выдавать значение 1 для всех значений больше этой координаты. Тогда нод Mix Shader мгновенно переключится на второй Shader, то есть на Transparent. В завершение, мы можем сделать Empty дочерним объектом Plane. Таким образом, мы сможем перемещать Plane по сцене, и Empty будет следовать за ним, но при этом мы по-прежнему сможем независимо анимировать и перемещать сам Empty. На этом всё для этого урока! До скорой встречи!