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.
fonte
Respostas:
Você poderia
fonte
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?
fonte
A biblioteca Bullet Physics possui uma página wiki sobre a escala do mundo da física . Esta informação é provavelmente útil também com outros mecanismos de física.
fonte
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.
fonte