Dans mon moteur de physique 2D, je peux détecter les collisions AABB vs AABB et les résoudre en trouvant le vecteur de pénétration le plus court et en l'ajoutant à la position de l'AABB.
Faire cela "pousse" le premier AABB en dehors du second AABB, mais ne gère pas du tout les changements de vitesse / accélération.
Si j'ajoute une accélération de la gravité à ma simulation, la vitesse du premier AABB dynamique continue de croître même lorsqu'il repose sur le deuxième AABB statique. Finalement, la vitesse deviendra trop grande et la collision ne sera pas détectée (l'AABB dynamique tombera à travers la statique).
J'ai essayé de mettre la vitesse à zéro après la résolution, mais cela n'a évidemment pas bien fonctionné et j'ai créé des simulations irréalistes.
J'ai lu en ligne que la résolution des collisions en travaillant manuellement sur la position ou la vitesse n'est pas correcte. J'ai essayé de mettre en œuvre des forces (la masse est "codée en dur" 1 pour l'instant):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Si j'applique le vecteur de pénétration le plus court en tant que force pendant la résolution de la collision, l'AABB dynamique sera "expulsé" du statique, mais sa vitesse ne diminuera jamais dans une simulation sans gravité et il continuera de se déplacer pour toujours.
Existe-t-il un moyen d'appliquer une force "temporaire"? Une force qui s'occupe de pousser le premier AABB hors du second AABB, puis s'arrête lorsque l'AABB ne se heurte plus?
Code source complet disponible ici: https://github.com/SuperV1234/SSVSCollision