# Casca esférica volumétrica — a "orb de fumaça cáustica"

first seen: referência colada pelo dono 2026-09-03, 800x600, orb NASH
status: receita RENDERIZADA e vista (lab/smoke-shader.js, render d1-t0.png);
        a aderência à referência ainda NÃO passou por diff medido nem cego —
        o arquivo de origem nunca chegou ao disco.

Anel de fumaça branca turbulenta enrolando um disco quase preto, sobre fundo
preto. Lê como bolha de sabão vista de perto ou plasma frio.

recipe (fragment shader, quad de tela cheia, WebGL2):

- raymarch ortográfico de uma casca esférica fina, 72 passos, acumulação
  aditiva sem absorção
- perfil da casca: gaussiana `exp(-x*x)` com `x = (r - rs)/shell`,
  `shell = 0.050` em unidades de raio
- `rs = 1 + warpAmp * (fbm(dir*warpFreq) - 0.5) * 2`, com `warpAmp = 0.13`,
  `warpFreq = 1.15` — é o que torce o contorno e faz a espessura variar
- filamentos: fbm de CRISTA (`1 - |2n-1|`, ao quadrado, 3 oitavas) com domain
  warping, amostrado pela POSIÇÃO 3D e não pela direção
- fios finos: segunda camada de crista, `pow(rfbm, 7)`, peso 0.5
- realce rasante `pow(1 - |dir.z|, 1.45)` multiplicando a densidade
- curva de tom `pow(acc*gain, 1.20)`, joelho `c/(1+0.35c)`, gama 0.9
- rampa de cor: azul-frio (0.62,0.70,1.00) no véu → branco no corpo →
  quente (1.00,0.97,0.90) no núcleo

os dois achados que decidem a imagem:

1. **Amostrar o ruído de detalhe pela posição 3D, não pela direção.** Pela
   direção o ruído é constante ao longo do raio, as amostras se reforçam e o
   resultado é um listrado radial saindo do centro, com o disco todo preenchido.
   Pela posição as amostras se descorrelacionam num raio frontal e somam num
   raio tangente ao limbo — o miolo escurece sozinho.
2. **O realce rasante é o que faz o anel existir.** Só a geometria da casca fina
   dá razão limbo/centro de ~3,8x, insuficiente: o disco inteiro acende. Um
   `pow(1 - |dir.z|, e)` com `e` entre 1,3 e 1,8 modela o filme fino visto de
   frente contra visto de raspão e derruba o miolo para preto. Abaixo de 1,1 o
   miolo enevoa; acima de 2,0 o anel vira um fio.

connotes: casca sem núcleo — contorno nítido e interior vazio. O anel diz
presença, o miolo preto diz que não há nada lá dentro para inspecionar; a
fumaça nunca fecha a mesma forma duas vezes, então a identidade fica no
contorno e não no conteúdo. Para a NASH — cujo tema é a variável fantasma, o
que existe no equilíbrio sem estar visível — a leitura é direta: o objeto se
declara pela borda do que não se pode ver.

## Correção v2: era gênero errado, não parâmetro errado

O diff sighted com o dono (2026-09-03, mesma sessão) rejeitou a v1 acima:
"nada ver". A causa não era ajuste fino — era o modelo geométrico. A v1
raymarcha uma casca 3D isotrópica e sempre converge para espessura uniforme
com textura de pêlo radiando do centro (bola de pelo). A referência é uma
FITA de espessura muito assimétrica por ângulo — fininha e nítida de um
lado, grossa e encorpada do outro — com veios que correm AO REDOR do anel
(dobras tangenciais), não pra fora dele.

fix: abandonar o raymarch 3D. Shader 2D direto:
- espessura por ângulo: um harmônico dominante `w(θ) = wMid + wAmp·cos(θ -
  thickAngle)` (fino num lado, grosso no oposto) + um entalhe local
  (gaussiana negativa) para a mordida que corta o anel num ponto, ambos
  sobre ruído de baixa frequência multiplicativo para não ficar geométrico
  demais
- veios: fbm em crista amostrado em `(dir·tangFreq, d·radFreq)` — periódico
  em `dir=(cosθ,sinθ)` (tangencial, sem costura no wrap) e genuinamente
  radial em `d=(r-rs)/w` (não em `dir`). A MESMA regra da v1 (posição, não
  direção, no eixo que deve variar de verdade) mas agora aplicada corretamente:
  o eixo tangencial DEVE ser amostrado por direção — é a definição de
  periodicidade angular — só o radial não pode
- pluma: uma gaussiana angular que empurra o raio da casca pra fora e alarga
  localmente num ponto só, para a mecha que escapa
- tangFreq baixo (5.5, não 9+) e só 2 oitavas no streak evitam o look
  "terra rachada" — mais oitavas/frequência lê como trinca, não como dobra
  de tecido

Ainda sem diff medido nem cego (falta o arquivo em disco) — isto é apenas o
diff SIGHTED do dono confirmando que o gênero da forma virou o certo.
