FROM THE BLOG

Maya Joint Orient

Introdução

Quando se fala em rigging no Maya, a primeira questão que vem na minha cabeça é como ficam as orientações dos eixos locais dos bones? Até que ponto elas influenciam no bom funcionamento do rigging? Fazendo algumas pesquisas e conversando com alguns amigos, gostaria de compartilhar as diferentes formas de corrigir a orientação dos bones (os quais o Maya também chama de Joints) e as difentes opiniões a respeito do assunto.

Ao criar uma cadeia de bones, por alguma razão, o Maya não alinha os bones, mantendo a mesma orientação. A informação geral é que é importante deixar todos eles com a mesma orientação, não importando qual. E normalmente, essa mesma orientação é importante na mesma cadeia. Outras cadeias parecem poder ter outras orientações. Algumas pessoas vão dizer que é melhor que todos os bones tenham, sim, a mesma orientação, não importa a cadeia a qual ele pertença. E eu conversei com pessoas que sequer se preocupam com essa questão, alegando que isso não atrapalha o rigging.

jointorientation01

No manual do Maya, na seção que fala sobre orientação dos joints, lê-se o seguinte:

“Você pode configurar a orientação do eixo local do joint para manter a simetria do esqueleto do personagem. Por exemplo, se você criar uma cadeia para o braço direito, pode fazer uma cópia espelhada para ser o braço esquerdo. Você deve alinhar um dos eixos locais do joint com o bone afim de que o eixo aponte em direção à cadeia. Esse procedimento assegura que a cadeia de joints se comportará de forma correta quando o IK for aplicado.”

Bom, a conclusão que eu tiro disso é que existe uma importância na orientação dos eixos locais dos joints, pelo menos, no que diz respeito ao espelhamento de cadeias e ao uso do IK (e talvez, o que seja realmente importante é que apenas o eixo que segue a orientação do bone seja o mesmo para todos). Talvez, mesmo usando IK e sem se preocupar com a orientação dos bones, possa dar certo para riggins mais simples (e acredito que dependa também do tipo de animação). É bem possível que riggings mais complexos só funcionem bem com a correta orientação configurada.

Feitas as observações, gostaria de destacar algumas formas de fazer e/ou usar a orientação local dos joints. Mas antes, lembro que é importante deixar os valores de rotação (campo Rotate) dos joints, no Channel Box, zerados. Para o processo de correção da orientação, é bom visualizar os eixos locais dos joints. Para isso:

  1. Selecione os joints desejados
  2. Acesse Display > Transform Display > Local Rotation Axis
  3. Para esconder os eixos locais, basta fazer o mesmo procedimento

No final deste artigo tem um vídeo mostrando, na prática, os métodos descritos abaixo.

Método manual

Uma das formas de fazer a correção é girando manualmente o eixo local do joint.

  1. Na barra de ferramentas, clique no ícone Select by component type
  2. Agora clique em Select miscellaneous components
  3. Selecione o eixo local de um joint e, com a ferramenta Rotate, rotacione o eixo até deixá-lo na orientação desejada.

Sinceramente, acho esse método o menos indicado, porque é muito difícil acertar a orientação exata rotacionando “na unha”…

Método de orientação World

Outra forma de usar a orientação dos joints, é configurar tudo pra World, ou seja, deixando a orientação dos eixos locais iguais as do espaço 3D.

Aqui existe duas opções: ou se constrói as cadeias já na orientação World ou corrige depois de criada a cadeia.

Para construir a cadeia já com a orientação do espaço 3D:

  1. Antes de inserir qualquer joint, acesse as opções da ferramenta “Joint Tool“: F2 (módulo Animation > Skeleton > Joint Tool > options
  2. Mude a opção do campo Orientation para None
  3. Construa a cadeia

Para configurar a orientação para World, após a cadeia ter sido construída numa orientação qualquer:

  1. Isole todos os bones (unparent)
  2. Selecione um bone e acesse o Attribute Editor
  3. Zere os valores dos campos Joint Orient (faça isso para todos os bones)
  4. Re-Parent os bones na sequência original

Método pela ferramenta Orient Joint

Como eu citei na introdução, não parece haver uma orientação específica que deve ser seguida. Então, observe qual é a orientação que a maioria dos joints está usando e corrija os bones que estão com outra orientação, adotando a mais usada.

  1. Selecione o bone que está com a orientação incorreta
  2. Acesse F2 (módulo Animation) > Skeleton > Orient Joint > options

Aqui existem 3 campos os quais precisam ser compreendidos, pra não ficar clicando em todas as opções até chegar na orientação desejada:

Orientation: o importante é prestar atenção no primeiro eixo das opções. Nesse campo, se configura o eixo que apontará na direção do bone. Por exemplo, XYZ, quer dizer que o eixo X seguirá a orientação do bone. ZXY, quer dizer que o eixo Z seguirá a orientação do bone, e assim por diante.

Second axis world orientation: enquanto o campo acima guia o primeiro eixo das opções, este campo guia o segundo eixo. Mas em vez do segundo eixo seguir a orientação do bone, ele seguirá a orientação do World (espaço 3D). Exemplo, XYZ e +X, significa que o eixo local X do joint seguirá a orientação do joint enquanto o segundo eixo, Y, seguirá a orientação do eixo World X na direção positiva. ZXY e -Y, significa que o eixo local Z seguirá a orientação do joint e o eixo local X seguirá orientação World do Y na direção negativa, e assim por diante.

Hierachy: quando habilitado, muda a orientação de todos os joints abaixo do joint que está sendo corrigido. Cuidado! Nem todos os joints-filhos seguirão a orientação do joint-pai. Eu recomendo deixar essa opção desabilitada, fazendo com que a orientação mude apenas para o joint selecionado.

Método usando Constraint Aim

Dos métodos apresentados aqui, acredito que esse seja o mais complexo. Uma observação importante: ao montar a cadeia, se precisar rotacionar algum joint, faça isso via os campos do Joint Orient (para manter os campos Rotate zerados), dentro do Attribute Editor (clique dentro de um dos campos, CTRL + LMB e arraste o mouse, permitindo que os valores se alterem em tempo real).

O procedimento para esse método é o seguinte:

  1. Isole (unparent) o joint-pai e os joints com a orientação local incorreta
  2. Selecione esses joints isolados, acesse o Attribute Editor e zere os valores dos campos Joint Orient de cada um
  3. Crie um locator e posicione-o exatamente no centro do joint-pai (use o snap to point para posicioná-lo)
  4. Mova o locator, um pouco, para um dos lados (você vai entender mais pra frente o porquê disso)
  5. Selecione o joint-filho e em seguida o joint-pai (mantenha Shift pressionado) e acesse as opções do Constraint Aim (F2 > Constraint > Aim > options)

É importante saber o que o Constraint Aim faz: basicamente, ele faz com que um determinado objeto (driven) aponte na direção de outro (alvo). A ordem de seleção dos objetos define quem será o alvo (primeiro objeto selecionado). Assim, o joint-filho será o objeto alvo e o joint-pai, o driven. Seguem as explicações sobre os campos usados aqui, lembrando que 0 (zero) e 1 são o equivalente a desabilita e habilita determinado eixo, respectivamente, sendo que a direção do eixo pode ser positiva ou negativa (a ordem dos campos são respectivamente X, Y e Z):

  • Aim vector: especifica a direção do alvo. A configuração padrão (1,0,0) faz com que o eixo X, na direção positiva, aponte para o objeto alvo.
  • Up vector: enquanto o Aim Vector é o eixo que aponta para o alvo, o Up Vector é o eixo que aponta para uma outra direção, para tentar alinhar o objeto (no nosso caso, o eixo local) da forma desejada. A configuração padrão faz com que o eixo Y positivo do objeto driven (Up vector = 0,1,0) aponte na direção do eixo Y positivo do World (World up type = Vector e World up vector = 0,1,0).
  • World up type: especifica qual será a referência do Up vector. A opção padrão (Vector) faz com que a referência seja um dos eixos do World (definido no campo World up vector). Em vez de usar como referência o eixo World, vamos usar um outro objeto (locator) e, para isso, a opção escolhida deve ser alterada para Object up. Essa opção desabilita automaticamente o campo World up vector.
  • World up object: especifica o nome do objeto que será usado como referência para o alinhamento. No nosso caso, o nome do locator deve ser escrito aqui (o nome exato).

Após aplicar o constraint num bone e após se certificar se a orientação está correta, o constraint pode ser deletado (ele foi usado apenas para re-orientar o eixo do joint). Se você observar, os valores dos eixos de rotação no Channel Box não estão zerados, e é importante que esses valores sejam iguais a zero. Para fazer essa alteração, abra o Attribute Editor (com o bone selecionado) e copie os valores dos campos Rotate para os campos Joint Orient. Depois, zere os campos Rotate. Assim a orientação corrigida se manterá e os campos Rotate no Channel Box ficarão zerados.

Repita o procedimento acima para cada joint isolado, usando sempre como objeto-alvo o respectivo joint-filho. Não esqueça de alinhar o locator com o joint que terá sua orientação corrigida. No final do processo, é só “re-parentear” os joints na ordem original.

Método do Alinhamento

Eu vi esse método no tutorial sobre rigging do Danilo Pinheiro (obrigado Danilo!), da Vetor Zero (dêem uma olhada no tutorial dele. É muito bom). Independente do tipo de cadeia (perna, braço, coluna, etc) ele a cria com os bones todos retos, alinhados, com o grid visível e usando o Snap to Grid (tecla X). Isso faz com que tenhamos certeza de que a orientação dos joints seja a mesma. Depois, ele rotaciona e move  (com a opção “Along rotation axis” habilitada no painel Move do Tool Settings. Isso é muito importante para não alterar a orientação dos joints!) os bones até obter o correto posicionamento de cada joint na cadeia em questão.

Como os valores de rotação não ficam zerados, ele dá um Freeze Transformation, o que parece funcionar bem, já que ele faz automaticamente a transferência dos valores do campo Rotate para o campo Joint Orient, zerando o Rotate.

Método via Script

Uma das formas mais práticas e rápidas de re-orientar os eixos locais dos joints é usando um script. Porém, existem algumas questões que devem ser consideradas:

  • Se você não sabe escrever um script, vai depender de alguém que escreva ou de encontrar um script gratuíto para usar
  • Se o script tiver algum erro (de lógica, mesmo), ele não vai re-orientar os eixos de forma apropriada (por isso é bom que você o tenha escrito)

Eu baixei um do forum da 3D Buzzhttp://www.3dbuzz.com/vbforum/showthread.php?78879-how-to-re-orient-joints-after-rigging-animating

Conclusão

Eu não consigo me adaptar a montar um esqueleto sem me preocupar com a orientação dos eixos locais dos joints. Isso me incomoda bastante. Acho que existe um risco grande de alguma coisa dar errada, inclusive, quando já se está animando o personagem. Se isso fosse uma questão realmente sem importância, não existiriam profissionais adotando algum método para fazer a correção dessas orientações (nada contra aqueles que não se preocupam com isso. Experiência também conta).

Seja qual for o método adotado, apesar da orientação ser corrigida, os valores nos campos do Joint Orient nunca é igual de um método para outro. Como saber qual é o mais certo? A melhor forma é testar. Eu, particularmente, prefiro usar o Método Constraint Aim ou do Alinhamento, passado pelo Danilo Pinheiro. Acho que esses dois métodos deixam o esqueleto mais “limpo”, mais livres de bugs.

As diferenças que eu mais observo entre esses dois métodos é que, no primeiro, o posicionamento dos joints é mais fácil, gastando-se mais tempo re-orientando os eixos. No segundo, gasta-se mais tempo posicionando os joints, porém eles já estarão com a orientação correta.

Cabe a cada um escolher o que achar melhor.

Assista o vídeo do início do post mostrando os métodos acima.