Como replico o efeito de distorção do Geometry Wars?

12

Estou tentando alcançar o efeito de distorção que você vê em jogos como Geometry Wars .

Captura de tela do Geometry Wars, incluindo o efeito de distorção

Alguém pode ajudar a explicar o que está acontecendo aqui? Eu sinto que o eixo z da grade é manipulado de alguma maneira pelo programador, mas existe alguma equação matemática conhecida para realmente obter o efeito correto de distorção?

Edit: Para ser mais específico, quero dizer a distorção da grade. Como tudo parece puxado em direção ao eixo z negativo e depois salta.

Joey Green
fonte
1
Você está se referindo ao segundo plano? Como é Geometry Wars , há muito caos na captura de tela, o que me fez coçar a cabeça por um tempo para tentar dizer o que você estava se referindo.
Grace Note
Sim, o fundo se curvando.
Joey Green

Respostas:

12

Uma implementação de 10 minutos de um sistema simples de primavera (ou assim ele diz em seu blog ;)). O sistema pode lidar com vários warps e outras coisas que distorcem a grade.

Atualizado para adicionar alguns detalhes adicionais:

Mais alguns detalhes. Em uma entrevista que costumava ser hospedada no site Bizarre Creations (esse site desapareceu devido ao fechamento da empresa), houve uma pergunta:

P: Um dos novos recursos gráficos mais impressionantes do jogo é a área de jogo da "grade de gravidade". Como você fez isso parecer tão legal? todo objeto do jogo realmente tem sua própria gravidade? A grade em si é composta de 60.000 pontos, cada um exercendo uma pequena quantidade de força em seu vizinho. A simulação em si fica no limite da estabilidade, o que faz com que ela se mova tanto quando um dos objetos do jogo dá um pequeno empurrão! Apenas alguns tipos de objetos afetam a grade. Como o sistema de grade é bastante caro de calcular, ele realmente roda no segundo núcleo junto com o sistema de áudio (o primeiro núcleo é dedicado à jogabilidade e às partículas, o terceiro é usado para renderizar o áudio).

Roger Perkins
fonte
1

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.

Chris Subagio
fonte
Legal obrigado, vou tentar isso. O algoritmo que você descreve basicamente é um efeito de primavera?
Joey verde
Não, eu não descrevi como isso varia ao longo do tempo, então não uma primavera. Acabei de descrever como obter o formato de distorção que você procura. Animar no estilo GW exigiria adicionar outro fator, modulando i com o tempo. Tente implementar a coisa toda e deve ficar claro para você que você pode escalar i para relaxar ou intensificar seu efeito. Passe uma onda senoidal através desse valor modulador ou faça um salto como uma mola 1D e você efetivamente fará o salto todo. Novamente, uma vez que você tenha um conjunto de variáveis ​​flutuando, a experimentação será sua amiga.
Chris Subagio