Recomendação do mecanismo de física que pode simular o jogo de sinuca corretamente? [fechadas]

13

Estou fazendo um jogo de sinuca como um jogo. Este jogo requer reflexos corretos (ou muito precisos). Eu tentei Box2D e Bullet Physics , mas ambos têm esse problema.

Ilustração

Se houver uma parede em cima desta imagem, espera-se que a linha vermelha siga uma bola real em um jogo de bilhar. Mas os motores geralmente mostram o curso da linha verde. Especialmente,

  1. Isso acontece depois que uma bola que se move lentamente atinge a parede.
  2. Às vezes, uma bola que se move rapidamente fica mais lenta de repente.

Estou encontrando um mecanismo de física que pode simular o jogo de bilhar com precisão, tanto quanto possível, sem esses problemas. Posso obter algumas recomendações? Agora estou pesquisando a Newton Game Dynamics , mas não tenho certeza de que o mecanismo mostrará o que quero. Estou considerando o mecanismo PhysX como um próximo teste e preciso fazer o meu próprio se nada funcionar. Mas é óbvio que vai demorar muito tempo, então eu gostaria de não fazer isso. Ficarei muito agradecido se você economizar meu tempo. E, claro, a solução com Box2D / Bullet Physics também é bem-vinda.

Estou trabalhando com C / C ++ / Objective + C no iOS.


Anexo minha configuração com o Box2D.

Paredes

  • forma estática da caixa
  • amortecimento linear / angular = 0,1
  • restituição = 1,0
  • fricção = 100
  • densidade = 10
  • bullet = false
  • rotação fixa = false
  • escala inercial = 1,0

Bolas

  • forma de esfera dinâmica
  • amortecimento linear / angular = 0,1
  • restituição = 1,0
  • fricção = 100
  • densidade = 20
  • bullet = true
  • rotação fixa = false
  • escala inercial = 1,0
Eonil
fonte
3
é provável que o mecanismo não esteja errado, mas você não definiu uma propriedade ou fez algo errado de alguma forma.
The Duck comunista
possível duplicata de Existe um algoritmo para um jogo de sinuca?
bummzack
Eu testei com a densidade 1 e o atrito 0,0 ~ 0,1, ele continua aderindo.
Eonil

Respostas:

8

Várias soluções.

  1. Para Box2D, defina b2_velocityThresholdno b2Settings.harquivo. No meu caso, eu configurei 0.0fe funcionou! Massa, fricção, amortecimento NÃO foram problema. Verifique este tópico de discussão para obter mais detalhes. http://www.box2d.org/forum/viewtopic.php?f=3&t=6906&p=30782#p30782

  2. Usando outro mecanismo de física. A Newton Game Dynamics configurou o desempenho correto por padrão. No entanto, é possível usar a dinâmica de Newton no iOS, mas é um pouco mais difícil do que outros. Eu usei vários dias para configurá-lo para iOS.

Também estou perguntando nos fóruns do BulletPhysics. Vou atualizar isso quando tiver uma solução.

- (editar) -

Existem alguns atributos de limite no Bullet, no entanto, não consegui encontrar exatamente a mesma coisa b2_velocityThreshold.

Isso parece semelhante, mas não funcionou bem.

btRigidBody->setContactProcessingThreshold(0.0f)
Eonil
fonte
6

O Box2D fará o que você deseja, mas você deve definir as constantes de restituição (rebote) para os equipamentos de parede e bola. Para um jogo de sinuca, você provavelmente deseja começar com uma restituição perfeita e alto atrito, mas amortecimento linear e angular, e ajustar a partir daí.


fonte
Tentei muitas configurações em poucos dias, mas ainda acontece. Posso obter um bom exemplo ...?
Eonil
3
Seus valores de densidade e atrito parecem muito grandes para o Box2D.
4

Os mecanismos de física têm um limite de rejeição. Não sei como fazê-lo em nenhum desses motores, mas o limite que está sendo definido muito alto fará com que ele ignore os impactos sob uma certa velocidade. Abaixe o limite de rejeição e ele retornará em velocidades mais baixas.

Eu sei que você pediu um mecanismo de física diferente, mas todos os mecanismos de física que conheço usam limites de rejeição para impedir que os objetos tremem quando estão sentados um em cima do outro. Portanto, sugerir um bom mecanismo de física será contraproducente, pois qualquer bom mecanismo de física terá esse efeito.

brandon
fonte
0

Eu tive esse problema e para mim a solução estava fornecendo a restituição perfeita.

Então, para mim, isso é sqrt de 0,5 para todos os objetos. Porque sqrt (r1 * r1 + r2 * r2) == 1 em situação perfeita.

Weston
fonte