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.
fuente
Respuestas:
Tú podrías
fuente
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?
fuente
La biblioteca Bullet Physics tiene una página wiki sobre cómo escalar el mundo de la física . Esta información probablemente también sea útil con otros motores de física.
fuente
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.
fuente