Basierend auf an answer to a previous question of mine about angular velocity, habe ich die gegebene Demo modifiziert und den Trennungssatz (Kollisionserkennung) zusammen mit rudimentärer linearer Impulsauflösung implementiert. (here's the JSFiddle). Es gibt jedoch ein kleines Problem mit der Antwort.Kollisionsantwort - Körper verschwindet vorübergehend beim Eindringen in einen anderen Körper
Gelingt es den Körpern sich gegenseitig zu durchdringen (was gelegentlich vorkommt), verschwindet der eindringende vorübergehend und taucht wieder auf, wenn er nicht mehr eindringt. Aber warum?
let aVel = [a.dx, a.dy];
let bVel = [b.dx, b.dy];
const invA = a.static ? 0 : 1/a.mass;
const invB = b.static ? 0 : 1/b.mass;
const relativeVel = Sub(bVel, aVel);
const velAlongNorm = DotProduct(relativeVel, data.unit);
if (velAlongNorm > 0)
return;
const cor = a.cor * b.cor;
let _j = -(1 + cor) * velAlongNorm;
_j /= invA + invB;
const impulse = ScalarMultiply(data.unit, _j);
aVel = Sub(aVel, ScalarMultiply(impulse, invA));
bVel = Add(bVel, ScalarMultiply(impulse, invB));
a.dx = aVel[0];
a.dy = aVel[1];
b.dx = bVel[0];
b.dy = bVel[1];
const percent = 0.2;
const slop = 0.01;
const correction = Math.max(data.overlap - slop, 0)/(invA + invB) * percent;
a.x -= invA * correction;
a.y -= invA * correction;
b.x += invB * correction;
b.y += invB * correction;
anzumerken, dass dx
und dy
auf die x und y-Komponenten beziehen sich der Geschwindigkeiten die Körper jeweils COR
und bezieht sich auf den Restitutionskoeffizienten. (Bounciness) invA
und invB
sind die umgekehrten Massen.
Wie behebe ich das Problem, dass der eindringende Körper verschwindet?