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.
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 🙂
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.
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.
Os 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.
Acima 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.
Acima 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.
Por 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.
Acompanhe 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):
Antes 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!
Para acessar o modificador basta ir em Add Modifier -> Triangulate.
Poré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!
“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!
Muito bom! Adoro fazer moldes! Acho muito importante contar com uma ferramenta desse tipo! Valeu!
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!
Nice work!
Speaking of CloudCompare and Cork, I think you might be interested: we’ve just added a new plugin for boolean operations on meshes based on Cork. It is named .
It is already integrated in the latest beta release. There’s link to it in this