Ein Ball trifft die Ecke, wo wird er abgelenkt?


46

Ich muss meine Trigonometrie auffrischen und hoffe, dass Sie hier mit einem einfachen mathematischen Modell helfen können. Hier ist mein Modell soweit im Bild beigefügt. Mir ist bewusst, dass die Frame-Animation andere Probleme hat, wenn sich der Ball sehr schnell bewegt, aber im Moment muss ich nur ballDx und ballDy berechnen. Es ist auch möglich, dass ballDx = 0 ist (nur vertikale Bewegung), aber wenn der Ball ablenkt, kann ballDx einen anderen Wert erhalten.

2D-Kollision zwischen der Kugel und der Eckkante eines festen, unbeweglichen Objekts


22
Nennen sie das einen "Eckfall"?
Andrew Grimm

2
Auf jeden Fall können wir bald die Relativitätstheorie anwenden, um sie zu lösen - das Problem wird massenhaft (ive).
Lumis

Antworten:


45

Hinweis: In allen folgenden Fällen wird davon ausgegangen, dass die Oberfläche des Balls reibungsfrei ist (sodass er sich nicht anders dreht oder abprallt).

Im Moment der Kollision berührt der Ball die Ecke. Wenn feste Objekte kollidieren, wirkt eine Kraft entlang der sogenannten Oberflächennormalen, dh senkrecht zur Oberfläche am Kollisionspunkt.

Da es sich um eine Kugel handelt, ist sie senkrecht zur Oberfläche zur Ballmitte gerichtet. Ok, wir kennen also die Richtung der Kraft, wie ist es mit ihrer Größe? Unter der Annahme einer elastischen Kollision (und dass sich das Rechteck nicht bewegen kann) muss der Ball mit der gleichen Geschwindigkeit zurückprallen, mit der er getroffen wurde.

Sei (nDx, nDy) die Geschwindigkeit nach der Kollision, (oDx, oDy) die Geschwindigkeit vor der Kollision und (x, y) die Position des Balls am Kollisionspunkt. Nehmen wir weiter an, dass die Ecke, mit der der Ball kollidiert, bei (0,0) liegt.

Indem wir unsere Erkenntnisse als Formeln ausdrücken, haben wir:

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

Welches ist gleichbedeutend mit:

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

Wenn wir die ersten beiden Gleichungen in die letzte einsetzen, erhalten wir:

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

Expandieren mit dem Binomial-Thorem

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

ergibt:

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

Diese quadratische Gleichung für chat zwei Lösungen, von denen eine 0 ist. Offensichtlich ist dies nicht die Lösung, an der wir interessiert sind, da sich die Richtung des Balls im Allgemeinen infolge der Kollision ändert. Um die andere Lösung zu erhalten, teilen wir beide Seiten durch c und erhalten:

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

Das ist:

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

Zusammenfassend haben wir:

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

Bearbeiten : Im 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;
}

Einige Überlegungen zur Implementierung: Während Sie nach dem Simulationsschritt die Position des Balls (x, y) approximieren können, ändert diese Approximierung den Ablenkungswinkel und ist daher sehr auffällig. Daher müssen Ihre Simulationsschritte sehr fein sein (möglicherweise so, dass Der Ball bewegt sich nicht mehr als 1/20 seines Durchmessers pro Schritt. Für eine genauere Lösung können Sie den Zeitpunkt der Kollision berechnen und diesen Simulationsschritt zu diesem Zeitpunkt aufteilen, dh einen Teilschritt bis zum Kollisionspunkt und einen weiteren Teilschritt für den Rest des Schritts.

Bearbeiten 2: Berechnen des Aufprallpunkts

Sei r der Radius, (x0, y0) die Position und (dx, dy) die Geschwindigkeit des Balls zu Beginn des Simulationsschritts. Nehmen wir der Einfachheit halber an, dass sich die betreffende Ecke bei (0,0) befindet.

Wir wissen:

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

Wir wollen

length(x,y) = r

Das ist

(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

Das ist eine quadratische Gleichung in t. Wenn es diskriminierend ist

D = b^2 - 4 * a * c

ist negativ, es gibt keine Lösungen, dh der Ball wird auf seinem gegenwärtigen Kurs niemals die Ecke treffen. Ansonsten sind seine beiden Lösungen gegeben durch

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

Wir interessieren uns für die Zeit, zu der die Kollision begann, also für die frühere Zeit t1.

Ihre Methode würde werden:

    // 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;

1
dies verdient +1
dynamisch

1
Dann zögern Sie nicht, Ihre Meinung zu verbessern :-)
meriton - im Streik am

3
Sie sagen das sehr früh, At the moment of collision, the ball will be touching the corneraber ich sehe keine Rechtfertigung für diese Annäherung (und es muss eine Annäherung sein, weil es nicht wahr ist - der Ball berührt sich an zwei Stellen, von denen keine die Ecke ist).
Peter Taylor

1
@Peter Taylor: Sie haben bemerkt, dass das OP den Ball außerhalb des Rechtecks gezeichnet hat , und die in der Frage angegebene Kollisionserkennungsformel geht auch davon aus? Du musst hier über den Tellerrand hinaus denken :-)
Meriton - im Streik

1
Ich liebe diese Antwort, aber sie könnte einiges von $ \ LaTeX $ in der Mathematik gebrauchen.
Martin Wickman

13

Hier ist eine visuelle Sichtweise auf ein Problem.

Die ursprüngliche Problemmenge ist Kreis gegen Rechteck (grau im Bild unten). Dies entspricht Punkt vs. gerundetem Rechteck (schwarz dargestellt).

Das ist also ein mehrteiliges Problem. Sie testen Ihre Punktkollision im Vergleich zu 4 Linien (die aus dem Rand der Box mit dem Radius des ursprünglichen Kreises herausgepresst wurden) und 4 Kreisen (an den Ecken des Rechtecks ​​mit dem gleichen Radius des ursprünglichen Kreises).

Mit der groben Geschwindigkeit in Ihrem Originalbild trifft der Punkt auf den unteren rechten Eckkreis. Alles, was Sie tun müssen, ist, den Punkt auf dem Eckkreis, den Sie treffen würden, herauszufinden, den Winkel davon zu berechnen und davon abzuspiegeln.

Bildbeschreibung hier eingeben

Ich überlasse die Ableitung als Übung dem Leser.


2

Ich arbeite an einem Spiel und stecke auch hier fest. Aber ich denke, es geht so:

Bildbeschreibung hier eingeben

Es gibt noch eine andere Sichtweise Mein Problem ist, dass ich nicht weiß, wie ich den neuen dx, dy schnell berechnen kann (für mich erfordert die Verwendung der traditionellen Mathematik zu viele Berechnungen).


Mein Standpunkt ist anders als der im 2. Link, weil ich nicht denke, dass der neue Geschwindigkeitsvektor so von der Mitte des Blocks abhängt. Mein Bruder sagte mir, dass der Ball zurück in die alte Richtung springen wird (dx = -dx && dy = - dy), aber ich denke nicht.
Risa

Wenn der Ball die Ecke trifft und der Abstand von ballX zu cornerX kleiner als 1/4 von ballW ist, springt er zurück, andernfalls wird er nach rechts nach vorne abgelenkt. Dies ist ein einfaches Modell, das ich im Moment benutze und das nicht fein abgestimmt ist, um den genauen Winkel zu finden.
Lumis

0

Bei der Kinematik dreht sich alles um die Auswahl des richtigen, für Berechnungen am bequemsten geeigneten Bezugsrahmens.

Hier definieren wir zuerst die Transformation T , die unsere Achsen in Komponenten auflöst, die parallel ( x ' ) und senkrecht ( y' ) zu einer Linie zwischen der Mitte der Kugel und der Ecke sind. Die inverse Transformation T * stellt unser ursprüngliches Koordinatensystem wieder her.

In diesem neuen Referenzrahmen, die durch Reflexion (und die Zeit und Raum Symmetrie der Physik), haben wir die Geschwindigkeit Transformation von Kontakt M (a Punkt Impulse ) , wie das , was die umkehrt x ' Komponente und berührt keine Y' - Komponente. In Matrixbegriffen ist dies die Diagonalmatrix mit -1 und 1 auf der Diagonale.

Dann ist die Geschwindigkeit nach der Kollision einfach: V ' = T * . M . T . Vo .

Der Zeitpunkt des Aufpralls t ist dann nur die Lösung für ( T . Do ) + ( X . T . Vo ) ( t ) = r wobei X die X-Achsen - Projektionsoperator ist und r ist der Radius der Kugel. Neu angeordnet, so erhält man
t = ( r - ( T . Do )) / (( X . T . Vo ) ( t ))

Dies hat den entscheidenden Vorteil, dass die gesamte komplexe Mathematik in streng geschriebenen, getesteten und getesteten Standard-Grafikbibliotheken verborgen bleibt. Diese Lösung ist auch für 2D- und 3D-Situationen identisch - wechseln Sie einfach die Grafikbibliothek. Abschließend wird hervorgehoben, dass man zuerst über geeignete Bezugsrahmen nachdenken sollte, bevor ein physikalisches Problem angegangen wird. Es gibt immer die NIH-Versuchung, aber in Wahrheit ist dies nur ein Rezept für Fehler, wenn prägnantere Lösungen verfügbar sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.