Je fais un moteur physique 3D pour lancer des dés. Jusqu'à présent, un dé était de 1x1x1m et la gravité était de 9,82 m / s ^ 2. Bien sûr, cela ne semble pas réaliste car les dés répondront à tout d'une manière qui semble un peu lente.
Pour résoudre ce problème, j'ai essayé de changer toutes les tailles pour faire un dé d'environ 0,02 m le long d'un côté. Cela a fait à mon tour mes masses inverses et matrices d'inertie inverse obtenir des valeurs très grandes qui conduisent à une instabilité numérique.
Quelle est la meilleure voie pour gérer cela? Puis-je maintenir l'échelle pour qu'un dé soit 1x1x1 et juste changer la masse ou la taille des forces agissantes? Ou devrais-je modifier quelque chose d'autre?
Je suppose que le même problème pourrait se produire si vous faisiez un jeu avec de très grands corps physiques comme des vaisseaux spatiaux ou quelque chose, alors j'espère que quelqu'un a rencontré quelque chose de similaire auparavant.
la source
Réponses:
Vous pourriez
la source
Dans le cas où vous rencontrez des problèmes avec de petites valeurs numériques, je vous suggère de simplement réduire tout. Vous pouvez même ne pas utiliser de "vraies" unités de mesure, mais seulement des unités "génériques" qui n'ont de sens qu'à l'intérieur du moteur.
La première option, la réduction, nécessiterait que vous utilisiez des millimètres ou des centimètres comme unité de mesure de base. Les dimensions de votre cube ne souffriraient donc pas d'une perte de précision.
La deuxième solution est fondamentalement la même chose, mais vous n'aurez alors pas besoin de penser aux unités réelles.
Aussi, pourquoi ne modifiez-vous pas simplement la masse du cube?
la source
La bibliothèque Bullet Physics possède une page wiki sur la mise à l'échelle du monde de la physique . Ces informations sont probablement également utiles avec d'autres moteurs de physique.
la source
J'ai pensé que je devrais partager ma solution finale au problème. L'augmentation de la constante de gravité comme suggéré a en effet fait avancer les dés plus rapidement, donnant ainsi l'impression d'une échelle correcte. Cela a cependant accru les problèmes de microbouncing. J'ai ajouté des microcollisions qui atténuaient le problème mais ne le résolvaient pas parfaitement. Notez que cela ne devient un problème que pour les "petits" objets, si vous rencontrez le problème inverse et que vous souhaitez simuler de très gros objets (vaisseaux spatiaux ou quelque chose comme ça), vous n'aurez aucun problème de microbouncing et pourrez faire face à cette solution.
J'ai donc trouvé le niveau de gravité le plus élevé que je pouvais avoir sans obtenir trop de «microbouncing». Ensuite, j'ai utilisé une simple détection de secousses sur le téléphone qui a répondu aux grands changements des lectures de l'accéléromètre et appliqué des impulsions à tous les objets lorsque de telles secousses sont détectées. Ce n'est pas parfait, mais comme cela fera bouger les dés rapidement lorsque le téléphone sera secoué, cela donnera une impression de "minuscules" dés. C'est un peu un hack mais il faudra le faire :) Voici un clip du moteur en action.
la source