W Javie piszę aplikację mobilną dla systemu Android, aby wchodzić w interakcję z dynamicznymi piłkami z klasami, które sam napisałem. Grawitacja jest określana na pochylenie telefonu.Zderzenia koła fizyki uderzające i przesuwające się na granicy
Zauważyłem, gdy mam pęk kulki w kącie, że niektóre z nich zaczną drgać, a czasami ślizgają się, zderzając się z innymi kulkami. Czy to możliwe, ponieważ wykonuję kroki w niewłaściwej kolejności?
Teraz mam jedną pętlę przechodzi każdą piłkę do:
- Sim iteracji
- Sprawdź kolizje z innymi kulkami
- Sprawdź kolizji na scenie granic
powinienem dodaj, że mam tarcie z granicami i kiedy dochodzi do kolizji piłki z piłką, by stracić energię.
Oto fragment kodu, jak kolizja jest obsługiwane:
// 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;
}
}
}
}
}
Czy możemy zobaczyć, co zrobiłeś do tej pory? – Dan
Czy testujesz w teście zderzeniowym, czy oba obiekty przesuwają się w kierunku siebie? Czy obliczacie dokładne czasy kolizji, czy pozwalacie na przesuwanie się obiektów? – LutzL
Zaktualizowany za pomocą kodu. Nie testuję, czy dwa obiekty zbliżają się do siebie. W tej chwili pozwalam, aby kule poruszały się w sobie, a następnie reagowały na kolizję. –