Comment les moteurs évitent-ils le «verrouillage de phase» (plusieurs objets au même endroit) dans un moteur physique?


8

Permettez-moi d'expliquer d'abord le verrouillage de phase: lorsque deux objets de masse non nulle occupent le même espace mais ont une énergie nulle (pas de vitesse).

Est-ce qu'ils heurtent pour toujours avec des vecteurs de résolution à vitesse nulle ou restent-ils simplement enfermés ensemble jusqu'à ce qu'une force extérieure interagisse?

Dans mon moteur brassé à la maison, j'ai réalisé que si je chargeais un personnage dans un arbre et le déplaçais, il signalerait une collision et retournerait à son emplacement d'origine. Je suppose que je pourrais résoudre ce problème en implémentant des impulsions en cas de collision au lieu de simplement revenir au dernier endroit où j'étais (mon implémentation est un peu nul).

Mais alors que je rend mon moteur plus robuste, je suis simplement curieux de savoir comment la plupart des autres moteurs physiques gèrent ce cas. Les objets qui commencent au même endroit sans vitesse de déplacement se tirent-ils les uns des autres dans une direction aléatoire? Ou sont-ils assis là jusqu'à ce qu'il se passe quelque chose? Quelle option est généralement la meilleure approche?


3
Je ne peux pas parler d'une implémentation réelle (d'où un commentaire au lieu d'une réponse), mais d'après mon expérience, les moteurs physiques poussent généralement lentement les deux objets l'un vers l'autre. Par exemple, si deux boîtes apparaissaient en se chevauchant, elles s'écarteraient lentement l'une de l'autre jusqu'à ce qu'elles soient complètement séparées. La manière exacte dont cela serait mis en œuvre doit être examinée.
kevintodisco

Ouais, je me rends compte que c'est une question assez étrange, car elle ne demande pas tant sur la façon de la mettre en œuvre, mais plus sur la façon dont elle est normalement gérée. Merci pour votre contribution!
C0M37

Réponses:


4

Je suppose que ce genre de chose finit par être une non-réponse ...

Je pense que cela dépend parfois de la mise en œuvre et de l'approche de base utilisée pour la détection et la résolution des collisions (ce qui équivaut à 80% d'un moteur de physique du corps rigide, je suppose). C'est drôle parce que je viens de toucher ce problème l'autre jour dans mon propre moteur de physique et j'ai jeté un objet dans l'espace NaN.

J'ai fait apparaître un objet exactement au même endroit qu'un autre objet et les deux avaient la même forme. Dans ce cas particulier, le générateur de contacts a fait de très mauvaises valeurs. Je l'ai corrigé en choisissant des valeurs arbitraires pour le contact (pousser un objet plus petit / plus léger vers le haut, essentiellement). C'était un joli cas coupé et sec, cependant.

Si une chaise devait apparaître à l'intérieur d'une table, cela dépendrait des contacts générés, qu'ils se séparent ou se coincent. Dans mon cas, je n'utilise pas de système basé sur des contraintes (du moins pas encore), donc l'objet est tout aussi susceptible de se désagréger que d'osciller et de s'endormir. Dans un système de pénétration + impulsion comme celui que j'utilise, il est assez facile de voir tout ce qui est laid et comment cela en résultera. Je ne sais pas comment un système basé sur des contraintes résout ce problème ou s'il le détecte même ... la contrainte me semble inaccessible sans intervention et je n'ai aucune idée s'il existe un moyen standard pour ces types de moteurs.

D'autres auront sûrement des choses plus intelligentes à dire, mais c'était trop long pour un commentaire.


J'apprécie votre réponse. J'avais envie de poser cette question comme une sorte de radeau de sauvetage que les autres pourraient trouver s'ils se retrouvaient dans la même situation.
C0M37

Lol @PSpeed ​​ici aussi ^^
SHiRKiT

0

Ceci est géré de deux manières:

  1. Corriger le chevauchement entre les objets pouvant être collés
  2. générer une force "normale" qui écartera les objets en cas de collision.

Cela ne fonctionne cependant que si vous différenciez la vitesse / le temps. Cela ne fonctionnera pas dans un jeu basé sur des tuiles et entraînera des artefacts visibles, tels qu'un objet traversant un objet ou étant visiblement poussé hors de l'autre objet.

Dans le cas des jeux basés sur des tuiles, vous pouvez adopter une approche prédictive, en vérifiant où sera l'objet s'il se déplace. Si le mouvement provoquait un verrouillage de phase, interdisez le mouvement.

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.