Yeti Tutorial 04 - Expressions

Expressions

O Yeti aceita o uso de expressões dentro dos campos de seus nodes do grafo. É uma linguagem de programação simplificada que se baseia em expressões ou funções aritméticas. É muito útil para vários casos, ou mesmo para agilizar tarefas.

A documentação do próprio Yeti é uma boa fonte de consulta para utilizar estas expressões:
http://documentation.peregrinelabs.com/yeti/expressionref.html

Expressões Aritméticas Simples

Podemos combinar atributos com operações matemáticas como adição, multiplicação, etc. Os principais operadores aritméticos são:

                + : Adição
                - : Subtração
                * : Multiplicação
                / : Divisão
                ^ : Exponencial  

Parênteses () são essenciais para agrupar expressões aritméticas, visto que a ordem das operações pode influenciar o resultado final. Por exemplo, Divisões e Multiplicações sao executadas antes de Adição e Subtração, e Exponencial é executado antes de Divisões e Multiplicações. Então:

  • 2 + 5 * 3 = 17 Primeiro é executado 5 * 3 e depois é somado 2
  • (2 + 5) * 3 = 21 Tudo que está dentro de parênteses é resolvido primeiro, no caso 2 + 5 = 7, e só depois o resultado é multiplicado por 3.

Combinando estas operações aritméticas com atributos, temos uma forma eficiente de manipulá-los dentro do grafo. No exemplo a seguir, manipulamos um atributo do Groom dentro do node de Curl, para que ele atinja um um efeito diferente sem que haja a necessidade de editá-lo dentro do Groom.

Arquivo de Exemplo: Expression_Aritmetics_1.ma

Funções de Noise

Noise é fundamental para criar variações nos pelos ou instâncias, criando uma aparência mais natural. Há várias funções para controlá-los e criar efeitos diferentes. Para utilizar uma função, consulte na documentação do Yeti como ela funciona e a escreva seu nome sempre com (). Dentros destes parênteses, ficam os argumentos da função. No caso da função hash() ela possui a seguinte estrutura:

float hash ( float seed1, [float seed2, ...] )

O primeiro float significa que a função hash retorna um float no final de sua execução. Seu primeiro argumento pede um valor float que será distribuído utilizando outro float como seed do segundo argumento.

Cada fio possui um atributo global chamado id, que carrega um número exclusivo de zero até quantos fios existirem. Ao usá-lo na função hash(), esse número é embaralhado aleatoriamente e ganha um novo valor exclusivo entre 0 e 1. O segundo argumento muda a seed do aleatório, ou seja, atribui um valor diferente. Se não houver o segundo argumento, ele adotará 0 como padrão.

Esta função de hash() é muito utilizada para criar variações de maneira rápida e eficiente. Contudo, ela não utiliza nenhum padrão para distribuir seus valores, sendo que às vezes pode ser necessário um controle artístico dessa variação. Então, podemos usar outros tipos de Noise. Alguns estão exemplificados abaixo:

Hash: hash(id)*2

SNoise: snoise(P*.4) * 4

Noise: noise(P*.5)

Cellnoise: cellnoise(P*.5)

FBM: fbm(P*.8, 3.5, 1, 1.5)

Turbulence: vturbulence(P, 5, .5, 1)

Voronoi: voronoi(P, 1, 1.5, 1.5, 5, 5, 0.5)

Arquivo de Exemplo: Expression_Noise.ma

Nestes exemplos, ao invés de usar o id, usamos a variável global P, que é a posição no espaço de cada fio. Multiplicando P por um valor maior, aumentamos sua frequência. Outros argumentos como lacunaridade e octaves podem ser utilizados para refinar o noise nas funções que o permitem.

Expressões Condicionais

Uma expressão condicional funciona da seguinte maneira:

Se uma declaração é verdadeira então faça a instrução 1, senão faça a instrução 2
If an statement is true then return command 1, else return command 2

Por exemplo, se temos uma variável chamada “var” que possui valores entre 0 e 1, e queremos que os valores maiores que 0.5 se tornem 1 e os menores se tornem 0. Ficaria:

Se “var” > 0.5 então retorne 1 senão retorne 0
If “var” > 0.5 then return 1 else return 0

Que na linguagem de expression do Yeti ficaria:

É possível utilizar operadores lógicos para realizar expressões condicionais:

                >   Maior que             
                >=  Maior ou igual a         
                ==  É igual que
                <   Menor que             
                <=  Menor ou igual a        
                !=  É diferente de

                &&  AND                    
                ||  OR

Arquivo de Exemplo: Expression_Condition_1.ma

Expressões para Animação

Podemos utilizar expressões para criar animações procedurais, como de fios crescendo ao longo do tempo. Para isso, usamos as variáveis globais F (Frame) e time para modificar um valor.

Se usarmos a função clamp(), podemos limitar o valor máximo de crescimento. Esta função tem 3 argumentos:

Arquivo de Exemplo: Expression_Animation.ma

Anterior: 03. Global Variables Próximo: 05. Texture Node