Operações booleanas em 3D – O poderoso Cork!

Boolean
Modelos criados a partir de várias operações booleandas envolvendo uma face e um crânio de hominídeo.

For who speaks English, please, see this link: http://arc-team-open-research.blogspot.com.br/2014/10/boolean-operations-powerful-cork.html

Sempre li em sites de modelagem 3D que operações booleanas não eram coisas que deviam fazer parte do quotidiano de um artista envolvido com aquele meio. Além de gerar malhas poluídas, nem sempre o comando dava certo. Bastava colocar um modelo um pouco mais complexo na cena que o algoritmo travava ou mesmo apresentava um resultado longe, muito longe do esperado.

Modificador booleano no Blender, a esquerda “union”, ao centro “intersection” e a direita “difference”.

Mas esse ponto de vista não resistiu ao advento da impressão 3D e da evolução de campos como o planejamento de cirurgias e confecção de próteses e órteses. Eu mesmo tive de me adaptar e me render as facilidades oferecidas pelas operações booleanas, inclusive na reconstrução facial forense… onde, por exemplo, utilizo orelhas prontas fundindo-as com uma cabeça previamente esculpida… ninguém merece fazer orelhas novas a cada modelagem 🙂

IMG_info
Operações booleanas aplicadas na criação de uma simulação de molde para injeção de resina.

O Blender, como apresentado acima conta com um modificador onde podemos aplicar operações booleanas, no entanto essas operações (ainda que o algoritmo apresente melhorias a cada versão) se encontram muito distantes do ideal quando falamos dos campos de atuação supracitados. Sofri muito quando comecei a ministrar aulas para alunos que pretendiam aplicar o Blender em estudos de medicina, odontologia, pesquisas voltadas a locomoção humana e confecção de próteses. Tudo funcionava muito bem, mas quando começávamos a entrar na área que envolvia a subtração de uma malha por outra… ah meus amigos! Garanto a vocês que meus cabelos eram subtraídos ao caírem diante de minhas preocupações, pois nunca sabíamos a surpresa que o modificador booleano nos estava preparando.

10685985_10152772671082612_796502501_o
Malhas criadas por operações booleanas prontas para serem impressas em 3D.

A coisa ficou realmente tensa quando precisei cortar ossos com o tecido esponjoso. Além de ser uma malha pesada havia toda a complexidade de “um objeto dentro do outro”, uma realidade mortal para a subtração de malhas. Foi aí que pensei um pouco, o Blender usa uma biblioteca chamada Carve para efetivar essas operações… então, com certeza deveriam existir alternativas, ainda que fossem mais prolixas no sentido de manipulá-las. Lendo um pouco, encontrei um comentário do criador do CloudCompare, uma fantástica ferramenta de comparação de malhas. Nesse post ele citava uma biblioteca chamada Cork, dizendo-se interessado em adaptá-la ao código do software desenvolvido por ele.

ATUALIZAÇÃO! O CloudCompare já conta com um plugin para o Cork!!! ->

http://www.cloudcompare.org/doc/wiki/index.php?title=PluginCork

Entrei no site do Cork, baixei a biblioteca e compilei-a. Para aqueles que ficaram temerosos diantes da palavras “compilar”, podem ficar despreocupados, pois o processo é bastante simples, basta ter o GCC, a liblioteca Clang 3.1+ e a biblioteca GMP (GNU Multi-Precision arithmetic library), que são facilmente instaláveis via apt-get (testei no Ubuntu e terei que compilar em breve para o Windows e Mac).

Dentro do diretório “samples” vem dois arquivos no formato OFF (Object File Format) para você testar o software, que funciona em linha de comando e é muito tranquilo de ser ativado.

snapshot106Os arquivos são duas esferas, a ballA.off (à direita) e a ballB.off (à esquerda). Depois de compilar o programa, basta fazer referência ao executável, ou, se você estiver com preguiça, como eu, basta copiar os arquivos para dentro da basta /bin (não do sistema, claro!) onde se encontra o executável.

snapshot207Acima temos o resultado de uma operação, a intersecção entre ballA e ballB. Segue o comando utilizado:

$ ./cork -isct ballA.off ballB.off balINT.off

Onde “-isct” é o tipo da operação pretendida e ballINT.off o arquivo de saída. Não preciso dizer que o $ não deve ser digitado, pois serve apenas para informar que se trata do terminal.

snapshot308Acima temos a operação diferença, onde subtraímos a ballB da ballA.

$ ./cork -diff ballA.off ballB.off ballDIFF.off

O “-diff” vem de difference. Você pode inverter e ordem de arquivos (A e B) para produzir um resultado diverso.

snapshot409Por fim temos a operação de união entre duas malhas:

$ ./cork -union ballA.off ball.B ballUNION.off

Aproveitanto a oportunidade, é comum indivíduos que estão iniciando os estudos de boolean não entendem a diferença de, por exemplo, as duas esferas (primeira imagem mostrando as duas malhas), uma levemente dentro da outra e de uma malha criada por união (imagem acima). Basicamente a diferença é que com o “union” nós temos uma malha limpa, sem nada dentro dos seus domínios que não seja um espaço vazio.

Os exemplos das esferas foram usados apenas para a explanação do funcionamento do Cork. Se você precisar fazer operações simples e até manipular os objetos em tempo real… desde que sejam simples… aconselho a você usar o Blender. O Cork deve ser acionado em caso do uso de malhas complexas, como as que ilustram o início do post.

Captura de tela de 2014-10Acompanhe acima como foram efetuadas as operações tendo como base a face e o crânio de um hominídeo. Veja à direita como a trama da malha é densa… é quase um milagre que o boolean tenha funcionado tão bem!

Para fazer esse “milagre” no entanto, você precisa exportar os arquivos no formato OFF, pois o Cork só trabalha com ele. Se por padrão o Blender não traz esse exportador, o problema pode ser resolvido rapidamente baixando um add-on criado para esse fim.

Dica 1 (Modo grosseiro de resolver exportação triangulada):

monkeyAntes de importar a malha, entre em modo de edição e ative o Triangulate Faces através do comando Ctrl+T, isso garantirá o funcionamento das operações, posto que o Cork só funciona com malhas formadas por esses elementos.

Dica 2 (Modo elegante):

Depois de eu postar o link desse material no grupo de discussão BlenderDEV-BR, o usuário Dalai Felinto (que escreveu o livro Game Development with Blender), pontuou que o Blender conta com um modificador que triangula as malhas, evitando que o objeto original seja modificado. Obrigado pela dica!

Captura de tela de 2014-10-01 13:41:57Para acessar o modificador basta ir em Add Modifier -> Triangulate.

Captura de tela de 2014-10-01 13:38:39Porém, ao testar a exportação no modo padrão obtive um erro de mesh. Para que isso não aconteça, cuide para manter o “Quad Method” quanto e o “Ngon Method” ambos setados em “Beauty”, como aparece na imagem acima, daí sim funcionará perfeitamente, sem erros.

Agradecimentos

Agradeço aos meus alunos Dr. Everton da Rosa, Márcia Pietrobon e Dr. Rodrigo Dornelles. Também ao camarada Hermano Peixoto de Oliveira Júnior do CTI, graças a todas essas pessoas corri atrás dessa solução e felizmente encontrei-a, de modo que agora está viabilizando uma série de projetos interessantíssimos.

Agradeço ao amigo Cláudio Luís Marques Sampaio (patola) que apoiou esse projeto sedendo seu know-how em impressão 3D para validar as projeções e inclusive uma impressão, para que materializássemos os resultados.

Agradeço ao criador do Cork, o sr. Gilbert Bernstein pela excelente ferramenta e pela atenção que tem dado as experiências que tenho feito.

Agradeço ao criador do CloudCompare, Daniel Girardeau-Montaut, que além de me dar indiretamente a dica do Cork, também implementou um plugin (veja nos comentários abaixo) para que ele seja usado diretamente na aplicação desenvolvida por ele!

Um grande abraço a todos e a você, caro leitor. Nos vemos na próxima!


4 thoughts on “Operações booleanas em 3D – O poderoso Cork!

  1. Rodrigo

    “Quando o Mestre está pronto o aluno aparece”
    Agradeço a citação Cícero! Se não fosse por ti, esta explicação seria grego para mim. Tens a inquietação imprecindível aos que ensinam, aos auto-didatas e aqueles que pensam fora da caixa!
    Parabéns!

  2. Sergio

    Oi Cícero, tudo bem?
    Muito bom seu trabalho. Parabéns por toda dedicação!
    Vc vê alguma change da Biblioteca cork ser integrada no Blender, no lugar da carve? Já viu alguma movimentação nesse sentido na comunidade?
    Valeu!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Spam Protection by WP-SpamFree