Três corpos: física real como identidade
Por que o coração deste site é uma simulação gravitacional de verdade — e não uma animação roteirizada.
Três corpos sob gravidade mútua não têm solução geral. É um resultado antigo, incômodo e bonito: qualquer perturbação mínima nas posições ou velocidades diverge, e o sistema desliza para o caos determinístico. Mas dentro desse caos existem ilhas raras — coreografias, soluções periódicas em que os três corpos dançam para sempre a mesma figura. A figura-oito de Chenciner e Montgomery (2000), onde os três se perseguem ao longo de uma lemniscata com período T ≈ 6.3259; os triângulos de Lagrange, girando desde 1772. Foi essa dualidade — caos genuíno e equilíbrios genuínos, sem nada no meio — que virou a espinha deste site.
A Entrada vive em caos: os três corpos se movem livres, com uma
semente que muda por dia. Cada um dos sete mundos é uma coreografia
diferente — sua figura, sua cor, sua escala. Viajar de um lugar a outro
não é uma transição de CSS nem um keyframe desenhado à mão:
é o sistema sendo guiado, com uma força de atração suave, das
condições atuais até as condições iniciais daquela coreografia — e então
solto. Se a física estiver certa, o equilíbrio se sustenta sozinho, sem
truque. Sair de um mundo é o inverso: perturbar o sistema, e o caos
retoma.
Por que isso importa mais do que parece
Era mais barato fingir. Um path de SVG animado por
requestAnimationFrame teria o mesmo efeito visual e custaria
uma fração do trabalho — sem singularidades para amortecer, sem energia
para conservar, sem a integração a recalcular 60 vezes por segundo.
Mas seria uma mentira pequena embutida na fundação: a promessa do site é
que os mundos coexistem em tensão real, não em coreografia de
apresentação. Física roteirizada seria decorar a metáfora por fora
enquanto ela fica oca por dentro. O integrador abaixo — velocity
Verlet, o mesmo método que a mecânica celeste usa para prever
órbitas de verdade — é a diferença entre simular uma ideia e ilustrá-la:
// lente/lente-corpos.js — um passo de velocity Verlet
function passo(dt) {
for (var i = 0; i < 3; i++) {
var c = corpos[i];
c.x += c.vx * dt + 0.5 * aAtual[i].x * dt * dt;
c.y += c.vy * dt + 0.5 * aAtual[i].y * dt * dt;
}
var aNova = acel(); // recalcula a gravidade mútua na posição nova
for (var k = 0; k < 3; k++) {
corpos[k].vx += 0.5 * (aAtual[k].x + aNova[k].x) * dt;
corpos[k].vy += 0.5 * (aAtual[k].y + aNova[k].y) * dt;
}
aAtual = aNova;
}
Nada aqui é decidido de fora: a posição de cada corpo no próximo quadro depende só da posição e velocidade que ele já tinha, e da gravidade que os outros dois exercem sobre ele naquele instante. É por isso que a abertura do site — o ∞ desenhado uma volta inteira, completo, antes de se romper na Entrada — não é uma peça de motion design pré-renderizada: é o mesmo motor, rodando ao vivo, que sustenta cada mundo depois dela.