Yeti Tutorial 09 - Groups

Groups

Podemos criar grupos de fios ou partículas baseado na interação com outros objetos ou por expressões. Grupos são úteis para limitar o efeito de um node, sendo que todos os nodes possuem a opção de se aplicar grupos.

O nome do grupo é o que será usado nos nodes que se quer aplicá-lo, sempre na última aba chamada Common. Podemos utilizar três modos para criar grupos:

Bounding Object

Usa a geometria do segundo input para determinar que fios ou particulas pertencem ao grupo.

Arquivo de Exemplo: Groups_BoundingObject.ma

Neste modo, apenas o campo Sideness será utilizado. Podemos definir se os fios do grupo estão dentro do volume da geometria, no caso de uma malha fechada, ou abaixo, se for um plano. Se está fora do volume ou acima do plano. E se está próximo da geometria, neste caso o campo de baixo Distance from Surface será utilizado para determinar a distância entre a geometria e os fios para que eles sejam considerados parte do grupo. O campo Attribute diz qual atributo da geometria será considerado para a operação, sendo a posição P o default.

Este modo é muito útil no caso de o personagem estar usando roupas ou acessórios que são animados ou simulados. Assim garantimos que não haverá penetração dos fios através da geometria, limitando seu crescimento em áreas de contato com a roupa ou acessório.

Bounding Volume

Similar ao anterior, porém ao invés de utilizar o segundo input, este modo utiliza os campos Origin e Radius para criar uma geometria esférica provisória com o pivot determinado pelo vetor de Origin e o raio da esfera pelo campo Radius.

Expression

Neste modo, apenas o campo Expression é utilizado, independente de ter uma geometria conectada no segundo input. Se o retorno da expressão forem maior que 0, então os fios fazem parte do grupo.

No exemplo a seguir os grupos são utilizados para restringir os efeitos de nodes deformadores para apenas objetos especificados. Muito útil em casos de multidões (crowds) na qual se deseja criar variações procedurais nos fios.

Podemos importar múltiplas geometrias com único node de Import utilizando o símbolo ***** (wildcard). Neste caso usamos _Bunny*Shape para importar todas as malhas dos coelhos. Cada geometria recebe automaticamente um número inteiro sequencial chamado objectId, que é uma variável global. Assim, podemos usá-la para separar os fios que nascem em cada geometria em grupos, e assim aplicar nodes deformadores.

Arquivo de Exemplo: Groups_Expression.ma

Para uma multidão de coelhos, podemos utilizar algumas funções para separar os grupos. A função hash(objectId) retorna os valores de objectId reordenados aleatoriamente entre 0 e 1. Então, usando a expressão hash(objectId) > 0.5 obtemos a metade dos objetos para pertencer ao grupo, selecionados aleatoriamente.

Caso essa seleção necessite ser mais controlada, podemos utilizar a função fmod(Float X, Float Y). Esta função corresponde a operação matemática de módulo, na qual se obtém o resto inteiro de uma divisão X/Y.

Grupos para Camera Frustum

Podemos utilizar o Yeti para distribuir uma vegetação proceduralmente sobre um terreno. Dependendo do tamanho deste terreno e da complexidade da vegetação, a cena poderá se tornar extremamente pesada para se processar e demorada para renderizar, isto se a memória for suficiente para comportar uma quantidade tão elevada de polígonos. Podemos otimizar esta situação fazendo uso de grupos.

Camera Frustum é todo o volume ou área que é visível pela câmera. Podemos criar uma geometria que contorna esta área visível e usá-la com Bounding Object de um grupo para limitar o crescimento e efeito dos nodes do Yeti para que apenas processe o que está visível para a câmera. Isto já otimiza o processamento de forma considerável, especialmente em situações na qual a câmera rotaciona em volta do cenário ou se move de um ponto à outro.

Outra otimização seria dividir esta geometria do Camera Frustum de acordo com a sua proximidade em relação à câmera. Cada parte se torna uma nova geometria que irá dividir os grupos, seguindo a lógica de que quanto mais próximo da câmera, maior a resolução necessária e mais pesado e lento será o processamento. A parte mais longe da câmera será o mais simples possível, para que seja leve e dê a impressão de que se trata dos mesmos objetos próximos à câmera. Podemos até substituir as instâncias de vegetação modeladas por fios simples da mesma cor ou por Image Planes com uma textura da vegetação.

Arquivo de Exemplo: Groups_CameraFrustum.ma

Anterior: 08. Instance Node Próximo: 10. Feathers