Feathers
O Yeti possui uma pena procedural interna formada por fios. Vários atributos podem ser editados e o seu formato pode ser customizado. Ela é mais leve e produz melhores resultados do que utilizando planos com texturas em alpha. Usamos o node Import para importá-la e a conectamos no segundo input de um node de Instance.
A maneira mais simples e comum de distribuir estas penas procedurais é utilizando um grafo normal de fios com os nodes Scatter e Grow e ligá-lo ao node de Instance, da mesma maneira que fazemos para instanciar objetos. Porém, podemos ter um controle maior sobre sua distribuição utilizando o node Convert com Guide Sets ou Grooms.
Guide Sets instanciando Penas
Arquivo de Exemplo: Feathers_GuideCurves.ma
Neste exemplo, um Guide Set é importado para a tree e convertido para fios de hair (Fibres) usando o node Convert no modo Strands to Fibres. Então, cada pena é instanciada em cima de cada guide, que virou um fio normal.
Grooms instanciando Penas
Seguindo esta mesma ideia, também é possível usar um Groom no lugar do Guide Set, para que uma pena seja instanciada em cima de cada strand do Groom.
Arquivo de Exemplo: Feathers_Groom.ma
Para que cada pena tenha o mesmo tamanho que cada guia tem, deve-se usar seu atributo length no campo Scale do node Instance. Este campo recebe um vetor no formato [x,y,z] correspondente à escala em largura, comprimento e espessura que a instância terá. Podemos assinalar o atributo length para o comprimento em y, e escrever sua largura x tanto diretamente, colocando um valor explícito, como em função do comprimento usando expressões matemáticas tipo length/2 (a largura sempre será metade do comprimento).
Para que as penas acompanhem o formato da curva, a opção Deform deve estar ativada na aba Objects do node de Instance.

Podemos criar atributos no Groom e pintar um valor diferente para cada pena. No exemplo acima, criamos um atributo chamado Roll para ser usado como rotação da pena, dentro do campo Twist. Como não é possível ter atributos com valores negativos dentro do Groom, podemos deslocar seus valores e convertê-los para valores positivos e negativos dentro do grafo. Seria semelhante a usar a função fit().

Pintar atributos direto no Groom que será convertido é interessante para casos em que poucas penas serão usadas, como Hero Feathers (Penas de Destaque). Contudo, com uma quantidade maior de penas pode ser trabalhoso pintar os atributos em tantas guia. Para resolver isto, podemos utilizar um Groom adicional com poucas guias apenas para definir o penteado e atributos. Podemos ainda dividir um Groom apenas para penteados e outro para Atributos, dependendo da complexidade do sistema.
Note que este sistema de Convert é mais pesado para se processar do que instanciar utilizando os nodes de Scatter e Grow. Mas permite um controle mais preciso sobre a posição de cada pena, o que pode ser necessário em alguns casos.
Arquivo de Exemplo: Feathers_Groom_Placement.ma
Texturing Feathers
Podemos mapear texturas ou Ramps para a pena através de suas coordenadas próprias de U e V, que já são criadas automaticamente pelo Yeti. Há duas maneiras de se fazer isso:
- Com um node de VRayUserScalar (VRay) ou aiUserDataFloat (Arnold) usando como atributo
feather_uefeather_v; - Com um node de place2dTexture, trocando o UV set name para
feather_uvwem 2D Placement Options.
Para ativar estas opções no VRay, ir na aba Attributes->VRay->2D Placement Options.
Para variar as texturas ou cores, podemos utilizar um node de condicional como mascara, atraves do id da pena ou qualquer outro atributo passado para o render pelo grafo.
Arquivo de Exemplo: Feather_Shading.ma
Feather Shapes and Attributes
Podemos editar os parâmetros que a pena interna do Yeti possui dentro do grafo. Todas as alterações feitas no grafo sobrescrevem os valores antigos. Para isso, utilizamos o node Attribute, sendo o nome do atributo a variável global da pena respectiva de cada parâmetro. Para consultar a lista de variáveis disponíveis, clicar com o botão direto sobre o node e ir na aba Attributes.
Arquivo de Exemplo: Feather_Attributes.ma
Importante: Lembrar de usar o Detail Type como Constant.
Usando atributos do Groom, podemos criar interpolações entre esses parâmetros. Podemos fazer uma região começar com o desenho da pena bem definido e ir ganhando deformações ao longo do corpo de um personagem. Lembrar de herdar cada um desses atributos do Groom ou outras variáveis globais que for necessário. Uma função interessante para aprimorar as interpolações é a fit(). Ela converte um range de valores em outro estipulado, mantendo a mesma proporção.
Apesar de a pena interna do Yeti ser bem flexível e customizável, até a versão que este manual foi escrito a pena ainda apresenta algumas limitações que dificultam chegar em resultados específicos.
Um deles é em relação à curvatura da pena, que pode não ser muito intuitiva para se controlar. Podemos utilizar combinações entre curvaturas e Normais tanto positivas quanto negativas para obter formatos diferentes. Também é possível editar os pontos de controle (Edit Mode - F8) para subir as cerdas ou forçar a curvatura.
Arquivo de Exemplo: Feathers_Shapes.ma
Arquivo de Exemplo: Feathers_Attribtues_Examples.ma
Up Vectors
Outro campo importante do node Instance quando se trata de penas e asas é o Up Vector. Ele é responsável por garantir que a orientação das penas sempre estará correta independente da rotação que a malha ou as curvas tiverem quando animadas. Por definição, o campo Up Vector vem preenchido com o valor de [0,1,0], ou seja, apontando na direção positiva de Y. O campo Alignment vem com a variável global N (Normal) preenchida.

Uma alternativa para corrigir este problema é usar o próprio vetor N como Up Vector ou o vetor Tangent. O vetor Tangent é criado no node Attribute, na aba Geometric->Add Tangent. O campo de twist pode ser utilizado para rotacionar a pena em relação aos seus vetores e fazer o ajuste final.
Para o caso de uma asa que sofrerá deformações extremas em sua malha durante a animação, especialmente quando a asa é fechada, vetores relativos as faces da malha como N e Tangent não serão suficientes para garantir que a orientação permaneça correta. Para isso, podemos utilizar vetores criados externamente como Up Vector, sendo passados através de Variáveis Globais Customizadas ou por parâmetros da curva.
Neste exemplo, os valores da translação X, Y, Z de um locator são usados para montar um vetor customizado global que será usado como Up Vector. Este locator poderá ser ligado ao Rig e animado, controlando diretamente a orientação de um grupo de penas. É uma solução simples que pode ser aplicada em diversas situações. Contudo pode ocasionar problemas em sistemas mais complexos, já que é passado o mesmo valor de Up Vector para todas as penas de um Guide Set, o que pode fazer algumas penas do grupo se orientarem errado.
Arquivo de Exemplo: Feathers_CustomUpVector.ma
Outra maneira de se passar o vetor externo para o Up Vector é através dos parâmetros individuais de cada guide.
Quando um grupo de guides é adicionado em um Set e este Set é adicionado no Input Guide Set do node superior do Yeti, em cada curva é criado automaticamente parâmetros adicionais chamados de Extra Attributes. Estes parâmetros podem ser usados de maneira semelhante à mapas de densidade, clumping, etc. Cada um destes parâmetros recebe um valor Float, podendo ser tanto positivo quanto negativo. Expressões podem ser adicionadas a cada campo para ligar os parâmetros das curvas com parâmetros do Rig ou de qualquer outro objeto.
No caso do alinhamentos das penas, podemos utilizar parâmetros não relevantes ao caso, como os de clumping (BaseAttraction, TipAttraction e AttractionBias), como ponte para enviar um vetores X, Y, Z para o Up Vector correspondente de cada pena.
Desta maneira, cada curva terá seu respectivo vetor de orientação, e consequentemente, cada pena também receberá o seu próprio Up Vector. Estes vetores de orientação deverão ser gerados a partir do Rig e ligados com a animação, sendo passados cada um via uma expression para os parâmetros de cada curva. Também é importante garantir que os Proxies das penas utilizem este mesmo vetor para se orientar, a fim de garantir o mesmo comportamento final.
Para receber estes vetores de orientação dentro da tree do Yeti, no campo de Up Vector do node de Instance deverá ser passado três parâmetros respectivos ao [x,y,z]. Neste exemplo, ficaria:
Up Vector = [baseAttraction, tipAttraction, attractionBias]
O parâmetro de Twist pode ser utilizado como um auxiliar de rotação para ajustes finos, sendo passado no campo Twist do node Instance. Valores positivos rotacionam para um sentido e negativos para o sentido inverso.
Custom Feathers
Pode ocorrer casos de que a pena procedural do Yeti não será flexível o suficiente para criar um desenho específico de pena, como uma pena de pavão ou penas de destaque da cabeça ou rabo do personagem por exemplo. Neste caso, podemos criar uma nova pena procedural desde o início com uma grande possibilidade de customização.
Devemos levar em conta de que este método é mais custoso em termos de processamento e memória do que a pena interna do Yeti, então só deverá ser usada quando realmente for necessário ou em pequena quantidade.
Começamos criado um hachi de geometria. Criamos um Groom sobre ele que ditará o formato das cerdas e terá os atributos para manipular os deformadores da pena.
Podemos usar nodes como Comb, Clumping e Bend para para acertar o formato desejado das cerdas, semelhante à um pentado normal. O node de Transform pode ser usado para achatar as cerdas verticalmente, e depois com o node de Bend criamos uma curvatura.
Também é possível dividir a pena em sessões, para criar um desfiado específico em algumas áreas, combinando tudo no final com um node de Merge ou Blend.
Para texturizar esta nova pena criada, precisamos mapear seu espaço para novas coordenadas u e v. Para isso, usamos o node de Attribute para criar duas novas variáveis renderizável e atribuímos os valores de P[0] e P[2], que são os valores do espaço em X e Z respectivamente. Como estes valores dependem da posição e escala globais do próprio objeto na cena, pode ser necessário calibrar este mapeamento.
Podemos adicionar ou subtrair valores para realizar um offset do mapeamento, e podemos multiplicar por valores menores ou maiores que 1 para alterar a sua frequência. Utilizamos as novas coordenadas u e v criadas em um node de VRayUserColor ou aiUserDataColor da mesma maneira que usamos na pena interna do Yeti com feather_u e feather_v.
Uma maneira fácil de visualizar este mapeamento é usar um node de Ramp no Shader com cores contrastadas no início e final.
Por fim, podemos instanciar a pena customizada em um objeto da mesma maneira que fazemos com a pena interna do Yeti. É necessário um node de Instance para cada parte da pena, incluindo para o hachi. Podemos ter variações desta pena e usar o comando de cycle para criar combinações.
É importante lembrar que as variáveis utilizadas para criar as novas coordenadas u e v devem ser herdadas por cada node de Instance. Mesmo com a pena sofrendo movimentação ou deformação no espaço, suas coordenadas novas continuam a funcionar, pois foram criadas na pena antes destas deformações. Podemos criar um atributo para separar o hachi e utilizá-lo como máscara para o Shader.
Arquivo de Exemplo: Custom_Hero_Feather.ma




















