Comment dois-je manipuler de petits objets dans un moteur physique?


13

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.


Je ne suis pas un expert ici, mais, sans aucun code, comment pouvons-nous savoir quel est le problème? Je me trompe probablement, cependant, car Box2D a les mêmes problèmes.
jcora

1
(En voyant tous les votes positifs, il doit y avoir un moyen conventionnel de coder ces choses, et les gens semblent savoir quel est votre problème. Je suppose que je me
trompais

1
Oui, je pensais qu'il pourrait y avoir une façon conventionnelle de le gérer. Comme je le vois, ce n'est pas un problème de code mais plutôt un problème de précision numérique. Ce que je recherche n'est pas un extrait de code pour résoudre mon problème, mais plutôt une explication d'une approche du problème.
Mikael Högström

Voulez-vous dire la précision en virgule flottante?
jcora

Dans un sens oui. L'inverse de la matrice d'inertie que j'utilise dans la gestion des collisions obtient de très grandes valeurs. Il n'est pas en fait mal conditionné car les éléments pivot obtiennent de grandes valeurs et il n'y a pas beaucoup d'ajouts en cours mais il doit y avoir un problème de précision numérique car la simulation tourne rapidement hors de contrôle.
Mikael Högström

Réponses:


1

Vous pourriez

  • augmenter la constante de gravité? Les jeux utilisent souvent 2 * 9,81 m / s ^ 2. Je ne me souviens pas où j'ai lu cela, mais les jeux utilisent généralement des unités non sensorielles. Quelles que soient les constantes qui vous conviennent (rendez le jeu amusant). L'utilisation d'une constante réaliste rend la physique lente et flottante.
  • exécutez la simulation à un rythme plus rapide. Si vous utilisez un pas de temps fixe, cela augmentera le taux d'animation.
  • utiliser des flotteurs de plus haute précision?

Le deuxième point ne fera rien d'autre que rendre la simulation plus fluide, ou peut-être même la casser si la simulation est exécutée trop rapidement (je ne suis pas sûr que ce soit un problème réaliste, mais si le monde avance avant qu'une milliseconde ne se soit écoulée, le temps la différence serait toujours 0 et rien ne fonctionnerait). Il ne voudra peut-être pas non plus perdre de la mémoire sur des flotteurs de plus haute précision.
jcora

1
Les jeux utilisent souvent la double gravité? Dit qui?
GameDev-er

Je ne peux pas changer le taux ou la précision mais je vais essayer de changer la gravité.
Mikael Högström

Changer la constante de gravité accélère généralement les dés, donnant l'impression que tout est à une échelle plus petite. Cela rend le comportement plus nerveux, même avec des microcollisions pour gérer l'accélération entre les images. Je suppose que je vais juste devoir le modifier :)
Mikael Högström

4

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?


Étant donné que les seuls générateurs de force dont je dispose sont basés sur la gravité / l'accéléromètre, le changement de masse ne change pas le comportement. Votre suggestion pourrait être utilisée dans le sens inverse (peut-être que c'est ce que vous vouliez dire) en donnant aux petits objets une masse plus grande, en rapprochant leurs masses inverses et en réduisant ainsi l'instabilité numérique. Cela donne les mêmes problèmes que l'augmentation de la constante de gravité.
Mikael Högström


0

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.