Na semana passada, publiquei um vídeo onde mostrei como mapear um Color Ramp ao longo do eixo Z de um objeto, tanto no modo local quanto global, para criar um gradiente ao longo da altura do objeto.
Transcrição do vídeo
Olá a todos! Na semana passada, publiquei um vídeo onde mostrei como mapear um Color Ramp ao longo do eixo Z de um objeto, tanto no modo local quanto global, para criar um gradiente ao longo da altura do objeto.
Neste tutorial, vou expandir o conceito de mapeamento baseado em eixo para criar tanto um gradiente de cor quanto uma mistura entre dois Shaders. O exemplo concreto será uma barra de progresso colorida, mas os métodos mostrados podem ser aplicados em outros contextos também. Especificamente, ao mover o Empty de controle na horizontal, veremos a barra progredir, colorida com um gradiente que vai do vermelho ao verde, passando pelo amarelo.

Primeiro, vou mostrar como está configurada a cena inicial. Temos um objeto Plane que foi escalado para esticá-lo um pouco ao longo do eixo X. Por conveniência, coloquei o Origin do objeto no canto superior esquerdo. Também apliquei as transformações de rotação e escala nesse objeto. Esse Plane não será mais modificado.

O outro objeto na cena é um Empty, posicionado no mesmo ponto do Origin do Plane, e que também teve suas transformações de rotação e escala aplicadas. Esse Empty vai controlar o progresso da barra, que será implementado inteiramente através do Material do Plane, sem modificar a geometria do Plane.

O Material do Plane precisa ter duas funções. Primeiro, precisamos definir o gradiente ao longo do eixo X do Plane. Depois disso, vamos garantir que todas as partes à direita do Empty fiquem transparentes, enquanto todas as partes à esquerda fiquem coloridas com o gradiente que definimos.
Vamos começar com o gradiente de cor ao longo de todo o objeto. Como no tutorial da semana passada, precisamos de um node Texture Coordinate, um node Separate XYZ e um node Color Ramp, conectados em sequência.
Usamos a saída Generated do node Texture Coordinate, já que estamos interessados nas dimensões do próprio Plane. Do node Separate XYZ, usamos a saída X, que representa o eixo horizontal local do Plane.
O Color Ramp agora deve ser conectado a um node Emission, porque queremos que o Material esteja sempre visível e não seja afetado pela iluminação. Então, substituímos o node Principled padrão por um node Emission.

Agora o Color Ramp pode ser personalizado como quiser. No meu caso, coloco um marcador vermelho à esquerda, um amarelo no centro e um verde à direita, usando interpolação Ease, para que o vermelho e o verde não fiquem limitados apenas aos extremos.


Para colorir apenas a parte à esquerda do Empty e deixar o lado direito transparente, primeiro precisamos adicionar dois nodes Shader no editor. Especificamente, um node Transparent e um node Mix Shader. Atenção para escolher o node Mix Shader, não o node Color Mix.
Em seguida, conecte o node Emission à primeira entrada Shader do node Mix Shader. Conecte o node Transparent, que deve estar totalmente branco, à segunda entrada Shader do node Mix Shader.
Conecte a saída do node Mix Shader à entrada Surface do node Material Output. Neste ponto, temos um Material semi-transparente com um gradiente que vai do vermelho ao verde, passando pelo amarelo.

Em um node Mix, seja ele de cor ou Shader, a segunda entrada só é usada totalmente quando o valor de Factor é 1. Então precisamos de uma forma de fazer com que esse Factor seja igual a 1 no lado direito da posição do Empty.
Para isso, adicione um node Texture Coordinate e um node Separate XYZ ao editor, e conecte a saída X do node Separate XYZ à entrada Factor do node Mix Shader.
Desta vez, no entanto, usamos a saída Object do node Texture Coordinate e especificamos o Empty no campo Object do node.

Agora o Material ficará transparente à direita do Empty e colorido à esquerda, como planejado. No entanto, podemos ver que o Material continua semi-transparente muito além da posição do Empty.

Para fazer com que a transição para o node Emission ocorra de forma brusca exatamente na posição do Empty, inserimos um node Math entre o Separate X e o node Mix Shader, configurado para o modo Greater Than, com o valor Threshold igual a 0.

Dessa forma, o node Greater Than usará a coordenada X do Empty e retornará 1 para todos os valores maiores que essa coordenada. O node Mix Shader então mudará bruscamente para o segundo Shader, ou seja, o node Transparent.
Por fim, podemos tornar o Empty filho do Plane. Assim, poderemos mover o Plane livremente pela cena, com o Empty o acompanhando, mas ainda seremos capazes de mover e animar o Empty separadamente.
Isso é tudo para este tutorial! Até breve!