O que é geometria octaédrica na prática
Geometria octaédrica é basicamente uma maneira de representar superfícies ou normais usando um octaedro como base. Em vez de trabalhar com esferas, você projeta a malha em seis faces triangulares. Isso parece menos intuitivo no início, mas tem vantagens reais quando você está lidando com texturização ou codificação de normais.O octaedro tem seis vértices e doze arestas. Quando você mapeia algo sobre ele, cada face corresponde a um quadrante da superfície. O truque é que essa projeção preserva melhor a uniformidade do que o mapeamento esférico em certos cenários, especialmente quando o objeto tem simetria ou quando você precisa evitar distorções nos polos.
Como aplicar geometria octaédrica em fluxos de trabalho reais
Primeiro você precisa decidir o que vai projetar. Se for normale map, o processo é direto: pegue o vetor normal unitário, projete-o no plano octaédrico usando uma transformação específica que leva coordenadas esféricas para um octaedro regular. A fórmula básica transforma (x, y, z) em dois valores no intervalo [-1, 1] que depois são codificados em RGB como [0, 255]. Aqui está onde a maioria das pessoas erra. A transformação mais comum é: primeiro normalize o vetor, depois aplique a projeção octaédrica envolvendo o valor absoluto. Mas existem duas variantes principais — a simplex e a não-simplex — e elas produzem resultados ligeiramente diferentes. A simplex distribui os vértices de forma mais uniforme, o que significa menos compressão em certas regiões. A não-simplex é mais fácil de implementar mas cria áreas de maior distorção.
Na prática, eu recomendo a simplex se estiver trabalhando com normais de alta frequência. Para geometria geral de malhas, a diferença é menos crítica, mas ainda assim existe.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Um problema real que eu enfrentei
Eu estava convertendo normais de um asset importado do Substance Painter para um formato customizado que usava geometria octaédrica. O resultado vinha completamente errado em cerca de 40% dos polígonos. A causa não era a matemática — estava correta —, era a orientação das normais. A biblioteca que eu estava usando assumia que as normais estavam todas apontando para fora, mas a malha tinha algumas faces invertidas por causa de um erro de normalização durante a exportação. Quando você projeta no octaedro, faces invertidas geram coordenadas espelhadas que parecem normais completamente aleatórias. A solução foi simples mas demorada: um script que varre todos os polígonos, calcula o produto escalar entre a normal e o vetor do centro do polígono ao ponto de vista, e inverte qualquer face com produto negativo. Isso corrigiu o problema em questão de minutos. O ponto é que a geometria octaédrica é tão sensível à qualidade das normais de entrada que você nunca deve pular a etapa de verificação.
Dicas que ninguém conta
Se você está usando geometria octaédrica para compressão de normais em texturas, fique ciente de que o formato octaédrico pode representar apenas normais perfeitamente unitárias. Se houver algum ruído ou erro de normalização na malha original, essas normais não-unitárias vão gerar artefatos visíveis na textura final. O workaround é rodar uma normalização pós-processamento antes da codificação. Em ferramentas como Blender, o nó "Normalize Normal" faz isso automaticamente, mas engines como Unity e Unreal às vezes aplicam a geometria octaédrica diretamente sem essa etapa. Outro detalhe importante: a direção de leitura dos canais. Alguns pipeline leem o canal R como o primeiro componente octaédrico e o G como o segundo. Outros invertem essa ordem. Se você estiver escrevendo shaders customizados, verifique qual convenção o motor espera. Confundir isso produz normais que parecem funcionar mas ficam espelhadas em um dos eixos, e levar horas para identificar o problema.
Finalmente, a geometria octaédrica não é uma solução universal. Ela funciona bem para normais e mapeamento UV de superfícies suaves, mas se você está lidando com geometria que tem bordas afiadas ou cantos muito pronunciados, a distorção acumula rápido. Nesses casos, um mapeamento UV tradicional ou cubemap pode ser mais adequado. Não tente forçar octaedro onde ele não cabe. Se quiser testar, existem bibliotecas open-source em GLSL e HLSL que implementam a codificação e decodificação octaédrica. A versão simplex é mais rara, então certifique-se de que a implementação que você está usando corresponde exatamente ao que seu shader espera. Um mismatch aqui gera problemas difíceis de debugar porque a textura de normal parece "quase certa" visualmente.