7
votes

Les balles 2D ne collant pas correctement

J'essaie simplement de coder un joli de physique de bonne santé.

La collision de la balle a l'air sympa, mais si les balles entrèrent trop lentement, elles "collerent" dans l'autre. Je n'ai aucune idée de la raison pour laquelle ils le font. P>

Voici ma fonction de collision: p> xxx pré>

Mais c'est ce qui se passe lorsqu'il se heurte à une vitesse basse: Entrez la description de l'image ici p>

Avez-vous une idée? P>

Modifier: P>

La mise à jour de Alnitak fort> Travaux très sympa ... Mais un problème est toujours là ... Si j'ajoute la gravité comme ceci: P>

public void physic() {
    motionY += GRAVITY;                  // <= this part (GRAVITY is set to 0.3D)
    checkForCollision(screen.balls);
    keyMove();
    bounceWalls();

    posX += motionX;
    posY += motionY;
}


0 commentaires

3 Réponses :


1
votes
Force-->acceleration-->velocity-->displacement

5 commentaires

Le 2 sera automatiquement promu à un double dans cette expression.


D'accord, je vais lire des articles sur Runge Kutta ou comment vous l'appeleriez ... parce que je lis que Euler n'est pas si bon .. me recommanderais-tu des tutoriels? Parce que les articles Wikipedia ne m'aident pas beaucoup: p


FWIW, même si vous utilisez des techniques telles que celles-ci, vous devez toujours rendre compte du fait que des simulations informatiques se traduisent par des modifications de position discrètes qui peuvent toujours "manquer" le véritable point de collision, causant exactement le problème essaie de résoudre. Les balles "virtuelles" ne traversent pas tous les points entre A et B quand ils sont déplacés de A à B.


@TENNOX: ALGORITHM VERLET n'est pas aussi difficile que RUNING KUTTA et non erroné comme Intégration Euler . Je l'ai utilisé comme une dynamique moléculaire, car elle utilise directement la vitesse (passe directement de la force au déplacement mais nécessite une histoire de déplacement pour 2 itérations)


Voici de beaux exemples: codeflow.org/entries/2010/aug/28/... forums.evilmana.com/game-programmation-theary/...



8
votes

Il s'agit d'un problème courant qui se produit car parfois le delta-V de la balle rebondissante est insuffisant pour le retirer de la zone de collision.

La routine de collision inverse la direction, le ramène à l'intérieur de l'autre balle, ad-infinitum. p>

Vous devez ajouter un décalage suffisant (dans la direction de la force de collision) à la position de la balle afin de vous assurer que les positions nouvellement calculées ne sont plus en collision. P>

Vous pouvez également vérifier si les balles serait em> entrer une fois que vous avez ajouté le nouveau Motion Motion code>: p>

public boolean intersects(Ball b) {
    double dx = b.posX - (posX + motionX);  // no need for Math.abs()
    double dy = b.posY - (posY - motionY);
    double d = dx * dx + dy * dy;           // no need for Math.sqrt()
    return d < (radius + b.radius) * (radius + b.radius);
}


5 commentaires

Oui, avait à peu près exactement le même probelm, seulement avec des carrés, et c'est comme ça que je l'ai résolu.


Il devrait donner à l'exclusion force une direction :) j'ai résolu de cette façon ^^


Qui serait la meilleure façon de faire ça? Je comprends mon problème ... mais je ne sais pas vraiment comment résoudre .. déplacer les balles les unes des autres avant d'appeler la méthode de collision ()?


Edit: ajoutera cela au post principal


@TENNOX C'est le même problème - votre chèque de collision avec les murs ne lui permet pas de rebondir à l'extérieur de la zone où la collision est true .



0
votes

0 commentaires