Bonjour je cherche a implementer un petit algorithme de reponse de collision suite a une collision par des rectangles, dans le cadre d'une simulation 2d.
Dans ma simulation j'ai deux rectangles , un representant le sol ( mass infini, velocty = 0) et un autre rectangle qui tombe sur le sol avec une rotation.

L'algorithme principale ressemble a cela :

Code:
while(simulating) {
DeltaTime = CurrentTime - LastTime
while(LastTime < CurrentTime) {
calculate all forces and torques
compute linear and angular accelerations
integrate accelerations and velocities over DeltaTime
if(objects are interpenetrating) {
subdivide DeltaTime
} else {
if(objects are colliding) {
resolve collisions impulsion
}
LastTime = LastTime + DeltaTime
DeltaTime = CurrentTime - LastTime
update positions and velocities
}
}
(algo trouve sur le net)

Il fonctionne bien avec des objets qui ne rotationnent pas.

Cependant je rencontre deux problemes ,

-le premier pour faire rester un rectangle sur un autre rectangle de masse infini ( = le sol par exemple). Dans mon cas le rectangle rentre petit a petit dans le sol.

Pour cela j'ai implementer une condition comme ceci :

Code:
if (check == myCollision.COLLISION)
                    {
                        myCollision.applyImpulse(copy, this.myGame.r2);
                        //apply reaction normal...
                        if (myCollision.vImpulse.Length() < (copy.vForces.Length()))
                        {
                            Vector3 a;
                            Vector3 dv;
                            Vector3 reactionStrength = (copy.vForces - myCollision.vImpulse);
                            a = reactionStrength / copy.fMass;
                            dv = a * deltaBase;
                            copy.vVelocity -= dv;
                        }
}
Ca me semble assez degueulasse .. quelle autre methode je peux implementer ?

Un autre probleme est lorsque mon rectangle rotationne et qu'il collisionne le sol, je pars en boucle infini a un certain moment.

Cela est du a mon algorithme de detection de collision qui fonctionne comme ceci :
Code:
if (r1.getCollision(ref r2, ref collidePoint, ref nx, ref ny, ref depth))
            {
                if ((depth <= 1f && ((Vector3.Dot(vRelativeVelocity, vCollisionNormal) < 0)))) // ici ca merde
                {
                    return COLLISION;
                }
                else if (depth > 1f)
                {
                    return PENETRATING;
                }
}
((Vector3.Dot(vRelativeVelocit y, vCollisionNormal) < 0))
Cette condition qui sert a verifier que les deux objets vont l'un vers l'autre lors de la collision et qu'ils ne sont pas en train de s'eloigner.
mais elle fait partir mon programme en boucle infini, exemple :

si mon rectangle a une velocite {0,-0.2f,0} si la collisionNormal est {0,-1,0} alors le rectangle s'eloigne du sol.

Cependant si lorsqu'il s'eloigne il rotationne sur lui meme alors un coin du rectangle peut rentrer dans le sol, et ainsi partir en boucle infini avec une depth > 1 et une velocite {0,-0.2f,0} .

Comment corriger ce probleme ?


Merci si vous avez pris le temps de me lire, j'espere avoir etait assez explicite .