Une balle frappe le coin, où va-t-elle dévier?

46

J'ai besoin de réviser ma trigonométrie et j'espère que vous pourrez aider ici avec un modèle mathématique simple. Voici mon modèle jusqu'à présent dans l'image ci-jointe. Je suis conscient que l'animation d'image présente d'autres problèmes lorsque la balle se déplace très rapidement, mais pour l'instant, je dois juste calculer ballDx et ballDy. Il est également possible que ballDx = 0 (mouvement vertical uniquement), mais lorsque la balle dévie, ballDx peut obtenir une valeur différente.

Collision 2D entre la balle et le bord d'angle d'un objet solide inamovible

Lumis
la source
22
Est-ce ce qu'ils appellent un "cas d'angle"?
Andrew Grimm
2
En définitive, dans les faits, nous pourrons bientôt utiliser la théorie de la relativité pour la résoudre - le problème est de prendre de la masse (ive).
Lumis

Réponses:

45

Remarque: Tout ce qui suit suppose que la surface de la balle est sans frottement (elle ne commencera donc pas à tourner ou à rebondir différemment car elle l’est).

Au moment de la collision, le ballon touchera le coin. Lorsque des objets solides entrent en collision, une force agit le long de la dite surface normale, c'est-à-dire perpendiculairement à la surface au point de collision.

Comme c'est une balle, la surface est perpendiculaire au centre de la balle. Ok, donc nous connaissons la direction de la force, qu’en est-il de sa magnitude? En supposant une collision élastique (et que le rectangle ne puisse pas bouger), la balle doit rebondir à la même vitesse que celle avec laquelle elle est impactée.

Soit (nDx, nDy) la vitesse après la collision, (oDx, oDy) la vitesse avant la collision et (x, y) la position de la balle au point de la collision. Supposons en outre que le coin avec lequel la balle entre en collision est à (0,0).

Exprimant nos idées sous forme de formules, nous avons:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Ce qui équivaut à:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

En substituant les deux premières équations de la dernière, on obtient:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Développer en utilisant le thorem binomial

(a+b)^2 = a^2 + 2ab + b^2 

rendements:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Cette équation quadratique pour ca deux solutions, dont l'une est 0. Évidemment, ce n'est pas la solution qui nous intéresse, car généralement la direction de la balle changera à la suite de la collision. Pour obtenir l'autre solution, nous divisons les deux côtés par c et obtenons:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

C'est:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Pour résumer, nous avons:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Edit : En code:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Quelques considérations d’implémentation: Bien que vous puissiez approximer (x, y) la position de la balle après l’étape de simulation, cette approximation modifiera l’angle de déviation et sera donc très visible. Par conséquent, vos étapes de simulation doivent être très fines la balle ne bouge pas de plus de 1/20 de son diamètre par pas). Pour une solution plus précise, vous pouvez calculer l'heure à laquelle la collision se produit et scinder cette étape de simulation à ce moment, c'est-à-dire effectuer une étape partielle jusqu'au point de la collision et une autre étape partielle pour le reste de l'étape.

Edit 2: Calculer le point d'impact

Soit r le rayon, (x0, y0) la position et (dx, dy) la vitesse de la balle au début de l’étape de simulation. Par souci de simplicité, supposons en outre que le coin en question se situe à (0,0).

Nous savons:

(x,y) = (x0, y0) + (dx, dy) * t

Nous voulons

length(x,y) = r

C'est

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

C'est une équation quadratique en t. Si c'est discriminant

D = b^2 - 4 * a * c

est négatif, il n’a pas de solution, c’est-à-dire que la balle ne frappe jamais le coin sur son parcours actuel. Sinon, ses deux solutions sont données par

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Nous sommes intéressés par l'heure à laquelle la collision a commencé, c'est-à-dire l'heure la plus ancienne t1.

Votre méthode deviendrait:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;
meriton - en grève
la source
1
this merite +1
dynamique
1
N'hésitez pas à voter, puis :-)
meriton - en grève le
3
Vous dites très tôt cela, At the moment of collision, the ball will be touching the cornermais je ne vois pas de justification à cette approximation (et ce doit être une approximation, car ce n'est pas vrai - la balle se touche à deux endroits, ni l'un ni l'autre n'est le coin).
Peter Taylor
1
@ Peter Taylor: Vous avez remarqué que le PO a tiré la balle en dehors du rectangle, et la formule de détection de collision donnée dans la question suppose cela aussi? Vous devez sortir des sentiers battus ici :-)
Meriton - en grève le
1
J'adore cette réponse, mais elle pourrait utiliser certains balises $ \ LaTeX $ du calcul.
Martin Wickman
13

Voici une façon visuelle de regarder un problème.

Le problème d'origine est le cercle et le rectangle (gris dans l'image ci-dessous). Cela équivaut à un rectangle arrondi (en noir).

C'est donc un problème en plusieurs parties. Vous testez votre collision de points contre 4 lignes (extrudées du bord de la boîte par le rayon du cercle d'origine) et 4 cercles (aux coins du rectangle avec le même rayon que le cercle d'origine).

Avec la vitesse approximative dans votre image d'origine, le point atteindra le cercle de coin inférieur droit. Tout ce que vous avez à faire est de déterminer le point sur le cercle de coin que vous souhaitez atteindre, d’en calculer l’angle et d’en faire une réflexion.

entrez la description de l'image ici

Je laisserai la dérivation de cela comme un exercice au lecteur.

Tetrad
la source
2

Je travaille sur un jeu et je suis aussi coincé ici. Mais je suppose que ça se passe comme ça:

entrez la description de l'image ici

Un autre point de vue Mon problème est que je ne sais pas comment calculer rapidement le nouveau dx, dy (pour moi, l’utilisation des mathématiques traditionnelles nécessite trop de calculs).

Risa
la source
Mon point de vue est différent de celui du 2e lien, car je ne pense pas que le nouveau vecteur de vitesse dépende du centre du bloc comme celui-là. Mon frère m'a dit que le ballon allait revenir à l'ancienne direction (dx = -dx && dy = - dy) mais je ne le pense pas.
Risa
Si la balle frappe le coin et que la distance ballX par rapport à cornerX est inférieure à 1/4 de la balleW, elle rebondira, sinon elle déviera vers la droite. C’est un modèle simple que j’utilise actuellement, qui n’est pas réglé pour trouver l’angle exact.
Lumis
0

La cinématique consiste à choisir le bon, comme c'est le plus pratique pour les calculs, le référentiel.

Ici, nous allons d'abord définir la transformation T qui résout nos axes en composantes parallèles ( x ' ) et perpendiculaires ( y' ) à une ligne entre le centre de la balle et le coin. La transformation inverse T * restaurera notre système de coordonnées d'origine.

Dans ce nouveau cadre de référence, par réflexion (et par la symétrie temporelle et spatiale de la physique), nous avons la transformation de vitesse du contact M (une impulsion de point ) comme celle qui inverse la composante x ' et laisse inchangée la composante y' . En termes de matrice , il s'agit de la matrice diagonale avec -1 et 1 sur la diagonale.

Alors la vitesse après la collision est simplement: V ' = T * . M . T . Vo .

Le moment de l' impact t est alors simplement la solution de ( T . Do ) + ( X . T . Vo ) ( t ) = rX est l'opérateur de projection de l' axe X et r est le rayon de la balle. Réarrangé, on obtient
t = ( r - ( T . Do )) / (( X . T . Vo ) ( t ))

Cela présente l’avantage d’enterrer toutes les mathématiques complexes dans des bibliothèques graphiques standard rigoureusement écrites, testées et déboguées. Cette solution est également identique pour les situations 2D et 3D - il suffit de changer de bibliothèque graphique. Enfin, il est important de penser aux cadres de référence appropriés avant de s’attaquer à un problème de physique. Il y a toujours la tentation des NIH, mais en réalité, ce n'est qu'une recette pour des bugs lorsque des solutions plus succinctes sont disponibles.

Pieter Geerkens
la source