Não sei se existe uma maneira "correta" de fazer isso, mas é provável que seja apenas uma transformação linear esteticamente agradável aplicada com uma queda calculada de distância a um ponto.
Portanto, para qualquer elemento com o qual você esteja trabalhando, você:
- encontre a distância do centro da urdidura (d)
- calcular 1 - d / a distância máxima do efeito que você deseja (i para intensidade)
- prenda isso a [0-1]
- transformar o elemento por lerp (identidade, transformar, i)
Iirc, as guerras de geometria aplicaram isso como uma distorção distorcida em alguns elementos, enquanto outros elementos como partículas foram afetados pela "força", sem serem distorcidos. Você pode aplicar a distorção em um sombreador de vértice, supondo que você tenha vértices suficientes para obter uma amostra suave do efeito. Como alternativa, você pode renderizar tudo o que precisa ser afetado em um buffer fora da tela e, em seguida, renderizar os resultados em um quad bem decorado, no qual você aplica a distorção, antes de adicionar todos os elementos não distorcidos na parte superior.
Quanto à transformação, o dimensionamento fornecerá uma aparência de sucção. Se bem me lembro, também houve algumas distorções, o que seria apenas uma pequena rotação.
Você pode ficar mais sofisticado com seus cálculos do fator de intensidade para obter efeitos de aparência mais maluca. Você pode, por exemplo, calcular o ângulo (a) em que um elemento é relativo ao centro e fatorá-lo. Pegue cos (a) e você pode criar ondas radiais no efeito. O que você quer fazer é configurar o código de andaime necessário e depois ir para a cidade experimentando diferentes combinações de fatores.