Jogali!

Início › Blog

TecnologiaBastidores

Como os jogos fazem gelatina balançar: física de corpos moles

Massa-mola, Verlet, restrições de volume e amortecimento: como um jogo simula coisas moles que balançam, e por que cortar gelatina em 3D dá tanto trabalho.

Equipe Jogali · 8 min de leitura

Uma caixa num jogo é fácil de simular: ela tem uma posição, um giro e uma velocidade. Quando bate no chão, quica ou para. Agora pense numa gelatina. Ela entorta, afina, achata com o próprio peso e volta tremendo. Cada pedacinho dela anda de um jeito. É aí que entra a física de corpos moles, um dos assuntos mais curiosos da programação de jogos.

Bolinhas presas por molas

A ideia mais simples é trocar o objeto inteiro por um monte de pontos com massa, ligados por molas. Cada mola tem um comprimento de descanso. Se alguém estica, ela puxa de volta. Se alguém aperta, ela empurra. Junte centenas dessas molas e o conjunto se comporta como um material elástico. Esse é o modelo massa-mola.

O BeamNG.drive, famoso por carros que amassam de forma realista, usa essa lógica. A documentação oficial do formato JBeam descreve o carro como nós, partículas com massa que se movem livremente, ligados por vigas sem massa que se comportam como molas. Cada viga tem um valor de rigidez e outro de amortecimento. A própria documentação avisa que vigas rígidas demais ou amortecidas demais podem vibrar ou "explodir" a simulação. Guarde essa palavra: explodir. Ela é o pesadelo de quem programa corpo mole.

A ideia de usar a física da elasticidade para animar objetos que se deformam tem história. Em 1987, Demetri Terzopoulos, John Platt, Alan Barr e Kurt Fleischer apresentaram no congresso SIGGRAPH o artigo "Elastically Deformable Models". Quase duas décadas depois, Terzopoulos e Platt receberam um prêmio técnico da Academia de Hollywood por esse trabalho pioneiro na simulação de tecidos em filmes, entregue em fevereiro de 2006, segundo a Universidade da Califórnia em Los Angeles.

O problema das molas duras

O computador não calcula o movimento de forma contínua. Ele avança em passos curtos: calcula as forças, atualiza velocidades, depois posições, e repete. Com molas moles, tudo bem. Com molas duras, a força é enorme, o ponto passa do lugar certo, a mola puxa de volta com mais força ainda, e em poucos quadros os pontos saem voando. A saída clássica é usar passos muito pequenos, o que custa caro.

Verlet: guardar onde o ponto estava

Em 2001, Thomas Jakobsen, então na IO Interactive, publicou "Advanced Character Physics", um texto que marcou a física de jogos. Os algoritmos foram criados para Hitman: Codename 47 e serviram para tecidos, plantas e corpos caindo, os famosos "ragdolls".

O truque central é a integração de Verlet, um método que o físico Loup Verlet usou em 1967 para simular moléculas. Em vez de guardar a velocidade, cada partícula guarda a posição atual e a posição anterior. A próxima posição sai da conta: posição atual, mais a diferença para a anterior, mais a aceleração vezes o passo ao quadrado. A velocidade fica implícita nessa diferença.

Por que isso ajuda? Porque dá para mexer na posição diretamente. Jakobsen troca as molas por restrições: "esses dois pontos devem ficar a tal distância". Depois de mover tudo, o código percorre as restrições e corrige cada par, empurrando ou puxando os pontos. Repetindo algumas vezes, o conjunto chega perto de satisfazer todas ao mesmo tempo. Como a velocidade sai das posições, nada fica fora de sincronia. É simples, barato e estável.

Position Based Dynamics: tudo vira restrição

Em 2006, Matthias Müller, Bruno Heidelberger, Marcus Hennix e John Ratcliff, da empresa AGEIA, apresentaram o artigo "Position Based Dynamics" (PBD). O texto organiza a ideia num método geral, que pula a camada das velocidades e trabalha direto nas posições. Os autores destacam o controle: colisões viram restrições, e um ponto que entrou num objeto é simplesmente projetado para fora. Eles usaram o método num simulador de tecido em tempo real para uma biblioteca de física de jogos.

Simulação por computador de um tecido quadrado azul trançado caído sobre uma esfera, formando dobras na parte de baixo
Tecido simulado caído sobre uma bola. Imagem: PantheraLeo1359531, Wikimedia Commons (CC0)

O ciclo de um passo é curto:

  1. aplicar a gravidade e prever onde cada ponto vai parar;
  2. corrigir as posições previstas para respeitar as restrições;
  3. calcular a velocidade como a diferença entre a posição nova e a antiga, dividida pelo tempo.

Havia um porém: a "dureza" do material dependia de quantas repetições o código fazia e do tamanho do passo. Em 2016, Miles Macklin, Matthias Müller e Nuttapong Chentanez, da NVIDIA, publicaram o XPBD, uma extensão que resolve isso com um número chamado complacência, o inverso da rigidez. Com ele, a gelatina é igualmente mole com poucas ou muitas repetições. O artigo nota que o PBD já tinha ganhado espaço fora dos jogos, em filmes e simulação médica. O Vellum, sistema do software de efeitos visuais Houdini para tecidos, cabelos, balões e corpos moles, se descreve como uma abordagem de Position Based Dynamics estendida.

Volume: a gelatina não encolhe

Só com molas nas arestas, um corpo mole pode murchar como um balão furado. Gelatina é quase toda água, e água praticamente não se comprime. Para isso existe a restrição de volume: o corpo é dividido em tetraedros, pirâmides de quatro pontas, e cada um resiste a mudar de volume. Se você aperta de um lado, o material estufa do outro. É isso que dá a sensação de coisa cheia, e não de saco vazio.

Gelatina vermelha de morango sendo levantada de um copinho plástico por uma colher, curvando-se sem se partir
Gelatina de verdade: verga na colher sem perder volume. Imagem: Famartin, Wikimedia Commons (CC BY-SA 4.0)

Amortecimento: saber a hora de parar

Sem perda de energia, uma gelatina tocada balançaria para sempre. O amortecimento tira um pouco de velocidade a cada passo. Pouco amortecimento parece borracha; muito parece massinha. O ponto certo é aquele em que o balanço dura o bastante para ser gostoso de ver e some sozinho.

Como o GelaTina faz isso de verdade

No GelaTina, o jogo de cortar frutas de gelatina do Jogali!, cada pedaço é preenchido por uma grade de cubinhos, e cada cubo é dividido em seis tetraedros. A física segue o XPBD, como diz o próprio código:

  • Arestas resistem a esticar, com uma complacência pequena: a gelatina é firme o bastante para as faces do corte ficarem retas.
  • Tetraedros resistem a mudar de volume, com complacência zero: o volume fica constante.
  • Subpassos: cada quadro da tela é dividido em 10 passos menores nos aparelhos mais fortes, e em 7 ou 5 nos mais simples.
  • Amortecimento calibrado para a gelatina parar de balançar em um ou dois segundos. Há também um filtro que aproxima a velocidade de cada ponto da média dos vizinhos: ele apaga o tremor fino e deixa o balanço grande.
  • Redes de segurança: nenhuma aresta passa de 1,8 vez o tamanho original nem fica menor que 0,35 vez, e a correção de volume tem limite por passo. Um tetraedro quase achatado gera correções gigantes, e sem esse freio a gelatina "estourava em espinhos", como registra um comentário no código.
  • Descanso: um pedaço parado por alguns décimos de segundo "dorme" e não gasta processamento até alguém mexer nele.

A malha bonita que você vê, com casca, polpa e sementes, não é a grade da física. Cada ponto dela fica preso aos oito cantos do cubinho onde está, com pesos. Quando os cantos se movem, a superfície acompanha de forma suave.

Por que cortar gelatina em 3D é difícil

Balançar é uma coisa. Cortar é outra. Na hora do corte, o objeto muda de topologia: o que era uma peça vira duas ou mais, e cada uma precisa da sua própria física, da sua própria superfície e das cores certas por dentro. Fatiar os tetraedros no meio criaria pedaços finíssimos, justamente os que fazem a simulação explodir.

Pedaço de gelatina vermelha de morango com faces retas e brilhantes sobre um prato branco
Cada face de corte é uma superfície nova, que o jogo precisa criar na hora. Imagem: Texas Lane, Wikimedia Commons (CC BY-SA 4.0)

O GelaTina contorna isso reconstruindo. Cada pedaço é guardado como um contorno visto de cima, com uma altura. O risco do dedo tira desse contorno uma faixa fininha, e cada parte que sobra nasce como uma gelatina nova, de quinas arredondadas, com uma grade interna nova. A superfície é gerada de novo a partir de uma função de distância, e as cores saem da posição original de cada ponto na fruta. Por isso a face cortada mostra polpa e sementes onde elas estariam.

Essa reconstrução é a conta mais pesada do jogo. Para não travar a tela, ela roda em paralelo, em ajudantes do navegador chamados Web Workers. Enquanto isso, o pedaço original continua inteiro e balançando. Quando as malhas ficam prontas, os pedaços novos entram herdando a deformação e a velocidade do instante do corte. Um corte rápido afasta mais as partes; um corte lento quase não as separa.

Experimente no GelaTina

No GelaTina, você corta melancia, morango, laranja e kiwi de gelatina com o dedo, em linha reta, em curva ou em círculo. Dê um toque rápido para ver o balanço e o amortecimento agindo, segure um pedaço para esticá-lo e repare como ele afina sem perder volume. Os pedaços encostados grudam de leve e escorregam no prato que gira. Tudo isso são as restrições deste artigo, rodando dezenas de vezes por segundo no seu aparelho.

Continue lendo