Nel mio motore di fisica 2D, posso rilevare le collisioni AABB vs AABB e risolverle trovando il vettore di penetrazione più breve e aggiungendolo alla posizione dell'AABB.
Fare questo "spinge" il primo AABB al di fuori del secondo AABB, ma non si occupa affatto dei cambiamenti di velocità / accelerazione.
Se aggiungo l'accelerazione di gravità alla mia simulazione, la velocità del primo AABB dinamico continua a crescere anche quando è appoggiata sul secondo AABB statico. Alla fine, la velocità diventerà troppo grande e la collisione non verrà rilevata (l'AABB dinamico cadrà attraverso quello statico).
Ho provato a impostare la velocità a zero dopo la risoluzione, ma ovviamente non ha funzionato bene e ho creato simulazioni non realistiche.
Ho letto online che la risoluzione delle collisioni lavorando manualmente sulla posizione o sulla velocità non è corretta. Ho provato a implementare le forze (la massa è un "hardcoded" 1 per ora):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Se applico il vettore di penetrazione più breve come forza durante la risoluzione della collisione, l'AABB dinamico verrà "espulso" da quello statico, ma la sua velocità non diminuirà mai in una simulazione senza gravità e continuerà a muoversi per sempre.
C'è un modo per applicare una forza "temporanea"? Una forza che si occupa di spingere il primo AABB fuori dal secondo AABB, poi si ferma quando l'AABB non si scontra più?
Tutto il codice sorgente disponibile qui: https://github.com/SuperV1234/SSVSCollision