Como construo um mecanismo de física 2D? [fechadas]


20

Os jogos mais avançados que eu fiz são um jogo de bilhar de 8 bolas feito com o mecanismo de física Box2dFlashAS3 e um jogo de plataforma com níveis.

Quando fiz jogos de plataforma, sempre quis saber como criar um mecanismo, para poder reutilizá-lo. Quando vejo jogos com declives, declives curvos, gravidade perfeita e física da vida real, sempre desejei saber como codificar o mecanismo.

Sugira técnicas e artigos para qualquer base de conhecimento relevante necessária.


Respostas:


16

Embora eu recomende não usar seu próprio mecanismo de física para outra coisa senão a experiência de fazê-lo (basta perceber que você provavelmente deve jogá-lo fora quando terminar - é realmente difícil obter todas as questões de edgecases e limite numérico / estabilidade resolvidos , e seu tempo pode ser muito melhor utilizado contribuindo para um mecanismo existente), eis alguns recursos:

Lições do Pool Hall: Detecção de colisão rápida e precisa entre círculos ou esferas discute colisão de círculo / círculo e esfera / esfera.

Os Tutoriais N são maravilhosos para uma compreensão básica da detecção e resposta baseadas no Teorema do Eixo Separador.


9

Erin Catto tem todas as palestras da GDC sobre a implementação do Box2D on-line. Box2D também tem código simples de ler, na minha experiência.


os pdfs são materiais realmente difíceis. Mas, quando eu li os arquivos cpp eh, como você disse, eles são "compreensíveis". Obrigado.
Vishnu

+1. O Box2D também é muito cuidadoso com a estabilidade, uma das coisas que é muito difícil quando você está rodando sozinho.
leander

5

Veja como você pode fazer isso:

Movimento aproximado

Todo objeto de física precisa destes vetores:

  • Posição : Onde está o objeto.
  • Velocidade : como sua posição está mudando.
  • Aceleração : como a velocidade está mudando.

Então, intuitivamente, você precisa fazer esse tipo de coisa a cada quadro para cada objeto de física a:

a.speed    += a.acceleration
a.position += a.speed

Armadilhas : Isso é conhecido como o método de integração de Euler . Essa aproximação é melhor para pequenas velocidades e acelerações e com pequenos intervalos de tempo. Em um jogo, isso normalmente é verdade. Mas se um objeto se move muito rápido em direção a uma parede fina ou diretamente em direção a outro objeto em movimento, pode pular a colisão com esse objeto quando sua posição é incrementada por uma quantidade grande o suficiente para atravessá-lo completamente. Se você tiver objetos em movimento rápido, poderá precisar da Detecção Contínua de Colisão para se livrar disso.

Colisão

A colisão pode ser aproximada com este tipo de sequência:

  1. Detecção : Detecta -se que dois corpos se cruzam.
  2. Resolução : a posição de cada corpo é alterada para que não mais se cruzem.
  3. Física : A velocidade de cada corpo é alterada para explicar o momento, a fricção e a restituição (bounciness).

Isso é conhecido como Detecção de colisão discreta, como acontece em momentos distintos no tempo. Cada passo merece atenção:

Etapa 1: Detecção de colisão (as coisas estão colidindo?)

Por dois círculos : verifique se os centros estão mais do que a soma dos raios separados.

Para dois retângulos : Verifique se alguma de suas coordenadas de canto está dentro do outro retângulo.

Para qualquer coisa que envolva polígonos mais complexos , você precisará do Teorema do Eixo Separador , que é um tópico para outra pergunta.

Armadilhas : Existem muitos outros tipos de colisão que você pode querer considerar. Alguns são realmente complexos: polígonos convexos podem se cruzar várias vezes !

Etapa 2: Resolução de colisão (separando-os.)

Um método simples para resolver uma colisão é a conversão por penetração mínima , usando valores obtidos na detecção de colisão. Isso envolve essencialmente afastar os objetos com a menor distância possível de movimento.

Como exemplo, considere a colisão círculo-círculo onde um dos círculos está fixo no lugar. O vetor de deslocamento mínimo tem a mesma direção da diferença entre seus vetores de ponto médio. Seu comprimento é a diferença entre a soma de seus raios e a distância entre os centros.

Essa ideia generaliza facilmente para outras formas.

Armadilhas : Se os dois objetos em colisão forem móveis, talvez seja necessário movê-los por uma fração da distância total para obter uma aproximação crível do movimento deles. Eles obviamente terão que se mover em direções diferentes.

Etapa 3: Física da colisão (Outras alterações.)

A coisa mais óbvia que costuma acontecer é que um ou dois objetos mudam de direção, ou seja, giram seu vetor de velocidade. Isso é muito fácil de implementar.

Armadilhas : os objetos podem ser elásticos , mas podem não ser , nesse caso a energia total no sistema é reduzida. Pode ser necessário arrastar devido à resistência do ar. O atrito (particularmente o atrito estático ) é notoriamente complexo de implementar .

Algumas conclusões

A simulação da realidade é exponencialmente mais difícil, se você quiser simular. Você está entrando em um campo minado de incontáveis ​​casos extremos, fórmulas surpreendentemente difíceis e pilhas cada vez maiores de documentos de pesquisa.

Se suas necessidades são simples ou você está ansioso para aprender, tente.

Se suas necessidades são complexas ou você não gosta de matemática, procure um mecanismo de física para detalhar os detalhes. Box2D e Bullet são bastante populares nos jogos.




Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.