2016-06-06 8 views
0

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?

Antwort

0

Ah, ich habe es herausgefunden. Ich habe nur vergessen, die Körper mit dem Mindestübersetzungsvektor (MTV) zu übersetzen.

Er wird berechnet, indem die Kollisionsnormale mit der Überlappung multipliziert wird. (AKA Penetration, Tiefe, etc.)