Avec l'aide de la Pile de Dépassement de la communauté, j'ai écrit un assez basique mais plaisir physique du simulateur.
Vous cliquez et faites glisser la souris pour lancer une balle. Il va rebondir autour et finissent par s'arrêter sur le "plancher".
Ma prochaine grande fonctionnalité, je veux ajouter dans l'est de la balle pour balle de collision. Le mouvement de la balle est divisée en x et y vecteur vitesse. J'ai de la gravité (faible réduction de la y vecteur à chaque étape), j'ai frottement (petite réduction de deux vecteurs de chaque collision avec un mur). Les boules honnêtement déplacer dans un réalisme surprenant.
Je suppose que ma question est en deux parties:
-
Quelle est la meilleure méthode pour détecter la balle pour balle de collision?
Dois-je juste avoir un O(n^2) boucle qui itère sur chaque ballon et vérifie chaque autre balle pour voir si c'est le rayon de chevauchements? -
Que les équations dois-je utiliser pour manipuler le ballon pour ballon de collisions? La physique 101
Comment fait-il effet les deux boules de vitesse x/y les vecteurs? Quel est le sens les deux balles à la tête? Comment puis-je l'appliquer à chaque balle?
La manipulation de la détection de collision des "murs" et le vecteur résultant des modifications ont été facile, mais je vois plus de complications avec balle-boule de collisions. Avec des murs j'ai simplement eu à prendre le négatif de l'x ou y du vecteur et il serait aller dans la bonne direction. Avec les boules, je ne pense pas que c'est de cette façon.
Quelques précisions: pour des raisons de simplicité, je suis ok avec un parfaitement élastique de collision pour l'instant, tous mes couilles ont la même masse, mais je suis susceptible de changer dans le futur.
Dans le cas où quelqu'un est intéressé dans le fait de jouer avec le simulateur j'ai fait jusqu'à présent, j'ai téléchargé la source ici (EDIT: Vérifiez la mise à la source ci-dessous).
Edit: Ressources que j'ai trouvé utile
2d Boule de physique avec des vecteurs: 2-Dimensions des Collisions Sans la Trigonométrie.pdf
2d Boule de détection de collision exemple: Ajout de la Détection de Collision
Succès!
J'ai la boule de détection de collision et de travail sur la réponse aux grands!
Code:
La Détection De Collision:
for (int i = 0; i < ballCount; i++)
{
for (int j = i + 1; j < ballCount; j++)
{
if (balls[i].colliding(balls[j]))
{
balls[i].resolveCollision(balls[j]);
}
}
}
Cela permettra de vérifier les collisions entre chaque ballon, mais ignorer redondant vérifie (si vous en avez pour vérifier si la bille 1 en collision avec la balle 2, alors vous n'avez pas besoin de vérifier si la bille 2 en collision avec le ballon 1. Aussi, il ignore la vérification des collisions avec lui-même).
Alors, dans ma boule de classe, j'ai mes collision() et resolveCollision() méthodes:
public boolean colliding(Ball ball)
{
float xd = position.getX() - ball.position.getX();
float yd = position.getY() - ball.position.getY();
float sumRadius = getRadius() + ball.getRadius();
float sqrRadius = sumRadius * sumRadius;
float distSqr = (xd * xd) + (yd * yd);
if (distSqr <= sqrRadius)
{
return true;
}
return false;
}
public void resolveCollision(Ball ball)
{
// get the mtd
Vector2d delta = (position.subtract(ball.position));
float d = delta.getLength();
// minimum translation distance to push balls apart after intersecting
Vector2d mtd = delta.multiply(((getRadius() + ball.getRadius())-d)/d);
// resolve intersection --
// inverse mass quantities
float im1 = 1 / getMass();
float im2 = 1 / ball.getMass();
// push-pull them apart based off their mass
position = position.add(mtd.multiply(im1 / (im1 + im2)));
ball.position = ball.position.subtract(mtd.multiply(im2 / (im1 + im2)));
// impact speed
Vector2d v = (this.velocity.subtract(ball.velocity));
float vn = v.dot(mtd.normalize());
// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;
// collision impulse
float i = (-(1.0f + Constants.restitution) * vn) / (im1 + im2);
Vector2d impulse = mtd.multiply(i);
// change in momentum
this.velocity = this.velocity.add(impulse.multiply(im1));
ball.velocity = ball.velocity.subtract(impulse.multiply(im2));
}
Code Source: source Complet pour balle pour balle collider.
Binaire: binaire Compilé dans le cas où vous voulez juste essayer de rebondir des boules autour.
Si quelqu'un a des suggestions pour améliorer cette base de la physique du simulateur laissez-moi savoir! Une chose que j'ai encore à ajouter est le moment angulaire sorte que les balles roulent de façon plus réaliste. Toutes les autres suggestions? Laisser un commentaire!