In Java schreibe ich eine mobile App für Android, um mit einigen dynamischen Bällen mit einigen Klassen zu interagieren, die ich selbst geschrieben habe. Die Schwerkraft hängt von der Neigung des Telefons ab.Physikkreiskollisionen knallen und gleiten gegen Grenzen
Ich bemerkte, wenn ich ein Bündel von Bällen in einer Ecke gebündelt habe, dass einige von ihnen anfangen zu jittern, oder manchmal rutschen, während sie mit anderen Bällen kollidieren. Könnte das sein, weil ich Schritte in der falschen Reihenfolge ausführe?
Im Moment habe ich eine einzige Schleife durch jeden Ball gehen:
- Sim eine Iteration
- prüfen Kollisionen mit anderen Kugeln
- prüfen Kollisionen gegen Szene Grenzen
ich sollte fügen Sie hinzu, dass ich Reibung mit den Grenzen habe und wenn eine Ball-zu-Ball-Kollision auftritt, nur um Energie zu verlieren.
Hier ist ein Teil des Codes, wie Kollision behandelt wird:
// Sim an iteration
for (Ball ball : balls) {
ball.gravity.set(gravity.x, gravity.y);
if (ball.active) {
ball.sim();
// Collide against other balls
for (Ball otherBall : balls) {
if (ball != otherBall) {
double dist = ball.pos.distance(otherBall.pos);
boolean isColliding = dist < ball.radius + otherBall.radius;
if (isColliding) {
// Offset so they aren't touching anymore
MVector dif = otherBall.pos.copy();
dif.sub(ball.pos);
dif.normalize();
double difValue = dist - (ball.radius + otherBall.radius);
dif.mult(difValue);
ball.pos.add(dif);
// Change this velocity
double mag = ball.vel.mag();
MVector newVel = ball.pos.copy();
newVel.sub(otherBall.pos);
newVel.normalize();
newVel.mult(mag * 0.9);
ball.vel = newVel;
// Change other velocity
double otherMag = otherBall.vel.mag();
MVector newOtherVel = otherBall.pos.copy();
newOtherVel.sub(ball.pos);
newOtherVel.normalize();
newOtherVel.mult(otherMag * 0.9);
otherBall.vel = newOtherVel;
}
}
}
}
}
Können wir sehen, was Sie bisher getan haben? – Dan
Testen Sie in Ihrem Kollisionstest, ob sich die beiden Objekte aufeinander zu bewegen? Berechnen Sie exakte Kollisionszeiten oder lassen Sie die Objekte ineinander gleiten? – LutzL
Mit einem Code aktualisiert. Ich teste nicht, ob sich zwei Objekte aufeinander zu bewegen. Momentan erlaube ich den Kugeln, sich ineinander zu bewegen und dann mit der Kollision umzugehen. –