Como devo lidar com objetos minúsculos em um mecanismo de física?

13

Estou criando um mecanismo de física 3D para jogar dados. Até agora, um dado era 1x1x1m e a gravidade, 9,82 m / s ^ 2. É claro que isso não parece realista, pois os dados respondem a tudo de uma maneira que parece um pouco lenta.

Para consertar isso, tentei alterar todos os tamanhos para fazer um dado ter cerca de 0,02 m ao longo de um lado. Isso, por sua vez, fez com que minhas massas inversas e matrizes de inércia inversa obtenham valores muito grandes, o que leva à instabilidade numérica.

Qual é a melhor rota para lidar com isso? Posso manter a escala elevada para que um dado seja 1x1x1 e apenas mude a massa ou o tamanho das forças de atuação? Ou devo ajustar outra coisa?

Acho que o mesmo problema poderia surgir se você fizesse um jogo com corpos físicos muito grandes, como naves espaciais ou algo assim, então espero que alguém tenha encontrado algo semelhante antes.

Mikael Högström
fonte
Não sou especialista aqui, mas, sem nenhum código, como podemos saber qual é o problema? Provavelmente estou errado, pois o Box2D tem os mesmos problemas.
jcora
1
(Ver todos os upvotes, deve haver uma maneira convencional de codificação estas coisas, e as pessoas parecem saber o que é você problema que eu acho que eu estava errado..)
jcora
1
Sim, eu pensei que poderia haver uma maneira convencional de lidar com isso. A meu ver, isso não é um problema de código, mas um problema com precisão numérica. O que estou procurando não é um trecho de código para resolver meu problema, mas uma explicação de uma abordagem para o problema.
Mikael Högström
Você quer dizer precisão de ponto flutuante?
jcora
Em certo sentido, sim. O inverso da matriz de inércia que eu uso no tratamento de colisões obtém valores muito grandes. Na verdade, ele não está mal condicionado, pois os elementos pivô obtêm grandes valores e não há muitos acréscimos, mas de alguma forma deve haver um problema com precisão numérica, pois a simulação rapidamente sai de controle.
Mikael Högström

Respostas:

1

Você poderia

  • aumentar a gravidade constante? Os jogos costumam usar 2 * 9,81 m / s ^ 2. Não me lembro onde li isso, mas os jogos geralmente usam unidades não-sensoriais. Quaisquer constantes que pareçam corretas (torne o jogo divertido). O uso de uma constante realista faz com que a física pareça lenta e flutuante.
  • execute a simulação a uma taxa mais rápida. Se você estiver usando um timestap fixo, isso aumentará a taxa de animação.
  • usar carros alegóricos de maior precisão?
torbjoernwh
fonte
O segundo ponto não fará nada além de tornar a simulação mais suave, ou talvez até quebrá-la se a simulação for executada muito rápido (não tenho certeza se esse é um problema realista, mas se o mundo passar antes de um milissegundo passar, o tempo será a diferença seria sempre 0 e nada funcionaria). Ele também pode não querer desperdiçar memória em carros alegóricos de maior precisão.
jcora
1
Jogos costumam usar dupla gravidade? Quem disse?
GameDev-er 19/07/12
Não posso alterar a taxa ou a precisão, mas tentarei alterar a gravidade.
Mikael Högström
Mudar a gravidade constante faz com que os dados geralmente se movam mais rapidamente, dando a impressão de que tudo está em uma escala menor. Isso torna o comportamento mais nervoso, mesmo com microcolisões para lidar com a aceleração entre quadros. Eu acho que eu vou ter que ajustá-lo :)
Mikael Högström
4

Caso você esteja tendo problemas com pequenos valores numéricos, sugiro que você simplesmente reduza tudo. Você pode até não usar unidades de medição "reais", mas apenas algumas unidades "genéricas" que só fazem sentido dentro do mecanismo.

A primeira opção, reduzir a escala, exigiria o uso de milímetros ou centímetros como unidade de medida básica. As dimensões do seu cubo não sofreriam perda de precisão, então.

A segunda solução é basicamente a mesma coisa, mas você não precisaria pensar nas unidades reais.

Além disso, por que você não muda a massa do cubo?

jcora
fonte
Como os únicos geradores de força que tenho são as mudanças de massa baseadas em gravidade / acelerômetro, isso não altera o comportamento. Sua sugestão pode ser usada de maneira inversa (talvez seja isso que você quis dizer), dando aos objetos pequenos uma massa maior, tornando suas massas inversas mais próximas de uma e reduzindo a instabilidade numérica. Isso dá os mesmos problemas que apenas aumentar a constante de gravidade.
Mikael Högström
0

Eu pensei que deveria compartilhar minha solução final para o problema. Aumentar a constante de gravidade, conforme sugerido, de fato fez os dados se moverem mais rapidamente, dando a impressão de escala correta. Isso, no entanto, aumentou os problemas do microbouncing. Acrescentei microcolisões que mitigaram o problema, embora não o resolvessem perfeitamente. Observe que isso se torna um problema apenas para objetos "pequenos", se você estiver tendo o problema inverso e quiser simular objetos muito grandes (naves espaciais ou algo parecido), então você não terá nenhum problema de microbouncing e poderá enfrentar essa solução.

Então eu encontrei o nível mais alto de gravidade que eu poderia ter sem ter muito "microbouncing". Em seguida, usei uma simples detecção de vibração no telefone, que respondeu a grandes mudanças nas leituras do acelerômetro e aplicou impulsos a todos os objetos quando essas vibrações são detectadas. Não é perfeito, mas como ele fará com que os dados se movam rapidamente quando o telefone for sacudido, dará uma impressão de dados "minúsculos". É um pouco complicado, mas será necessário :) Aqui está um clipe do mecanismo em ação.

Mikael Högström
fonte