¿Cómo debo manejar objetos pequeños en un motor de física?

13

Estoy haciendo un motor de física en 3D para lanzar dados. Hasta ahora, un dado ha sido 1x1x1m y la gravedad ha sido 9.82 m / s ^ 2. Esto, por supuesto, no parece realista, ya que los dados responderán a todo de una manera que parece un poco lenta.

Para solucionar esto, intenté cambiar todos los tamaños para hacer que un dado mida aproximadamente 0.02m a lo largo de un lado. Esto a su vez hizo que mis masas inversas y las matrices de inercia inversa obtengan valores muy grandes que conducen a una inestabilidad numérica.

¿Cuál es la mejor ruta para manejar esto? ¿Puedo mantener la escala para que un dado sea 1x1x1 y simplemente cambiar la masa o el tamaño de las fuerzas actuantes? ¿O debería modificar algo más?

Supongo que el mismo problema podría surgir si hicieras un juego con cuerpos físicos muy grandes como naves espaciales o algo así que espero que alguien se haya encontrado con algo similar antes.

Mikael Högström
fuente
No soy un experto aquí, pero, sin ningún código, ¿cómo podemos saber cuál es el problema? Sin embargo, probablemente estoy equivocado, ya que Box2D tiene los mismos problemas.
jcora
1
(Ver todos los upvotes, debe haber una forma convencional de codificación de estas cosas, y la gente parece saber cuál es usted problema que supongo que estaba equivocado..)
jcora
1
Sí, pensé que podría haber una forma convencional de manejarlo. A mi modo de ver, este no es un problema de código, sino más bien un problema con precisión numérica. Lo que busco no es un fragmento de código para resolver mi problema, sino más bien una explicación de un enfoque del problema.
Mikael Högström
¿Te refieres a la precisión de coma flotante?
jcora
En cierto sentido si. El inverso de la matriz de inercia que uso en el manejo de colisiones obtiene valores muy grandes. En realidad, no está mal condicionado ya que los elementos pivote obtienen valores grandes y no hay mucha adición, pero de alguna manera debe haber un problema con la precisión numérica ya que la simulación gira rápidamente fuera de control.
Mikael Högström

Respuestas:

1

Tú podrías

  • aumentar la constante de gravedad? Los juegos a menudo usan 2 * 9.81 m / s ^ 2. No recuerdo dónde leí esto, pero los juegos generalmente usan unidades no sensoriales. Las constantes se sienten bien (haz que el juego sea divertido). El uso de una constante realista hace que la física parezca lenta y flotante.
  • ejecuta la simulación a un ritmo más rápido. Si está utilizando un paso de tiempo fijo, esto aumentará la velocidad de la animación.
  • utilizar flotadores de mayor precisión?
torbjoernwh
fuente
El segundo punto no hará nada más que suavizar la simulación, o tal vez incluso romperla si la simulación se ejecuta demasiado rápido (no estoy seguro de si este es un problema realista, pero si el mundo avanza antes de que haya pasado un milisegundo, el tiempo la diferencia siempre sería 0, y nada funcionaría). Es posible que tampoco quiera desperdiciar memoria en flotadores de mayor precisión.
jcora
1
Los juegos a menudo usan doble gravedad? ¿Dice quién?
GameDev-er
No puedo cambiar la velocidad o la precisión, pero intentaré cambiar la gravedad.
Mikael Högström
El cambio constante de la gravedad hace que los dados generalmente se muevan más rápido, dando la impresión de que todo está en una escala más pequeña. Esto hace que el comportamiento sea más nervioso, incluso con microcolisiones para manejar la aceleración entre cuadros. Supongo que tendré que modificarlo :)
Mikael Högström
4

En caso de que tenga problemas con valores numéricos pequeños, le sugiero que simplemente reduzca todo. Incluso podría no utilizar unidades de medida "reales", sino solo algunas unidades "genéricas" que solo tienen sentido dentro del motor.

La primera opción, reducir la escala, requeriría que use milímetros o centímetros como unidad de medida base. Las dimensiones de su cubo no sufrirían pérdida de precisión, entonces.

La segunda solución es básicamente la misma cosa, pero entonces no necesitaría pensar en las unidades reales.

Además, ¿por qué no cambias la masa del cubo?

jcora
fuente
Como los únicos generadores de fuerza que tengo son los cambios de masa basados ​​en la gravedad / acelerómetro, no cambian el comportamiento. Sin embargo, su sugerencia podría usarse al revés (tal vez a eso se refería) dando a los objetos pequeños una masa más grande, haciendo que sus masas inversas se acerquen a una y, por lo tanto, reduciendo la inestabilidad numérica. Sin embargo, esto da los mismos problemas que solo aumentar la constante de gravedad.
Mikael Högström
0

Pensé que debería compartir mi solución final al problema. El aumento de la constante de gravedad como se sugirió hizo que los dados se movieran más rápido, dando la impresión de la escala correcta. Esto, sin embargo, aumentó los problemas de microbote. Agregué microcolisiones que mitigaron el problema aunque no lo resolvieron perfectamente. Tenga en cuenta que esto se convierte en un problema solo para los objetos "pequeños", si tiene el problema inverso y desea simular objetos muy grandes (naves espaciales o algo así), no tendrá ningún problema de micro rebote y podrá lidiar con Esa solución.

Así que encontré el mayor nivel de gravedad que pude tener sin obtener demasiados "micro rebotes". Luego usé una simple detección de sacudidas en el teléfono que respondía a grandes cambios de las lecturas del acelerómetro e aplicaba impulsos a todos los objetos cuando se detectan tales sacudidas. No es perfecto, pero como hará que los dados se muevan rápidamente cuando se sacude el teléfono, dará la impresión de dados "pequeños". Es un truco, pero tendrá que funcionar :) Aquí hay un clip del motor en acción.

Mikael Högström
fuente