Una palla colpisce l'angolo, dove devia?


46

Ho bisogno di ripulire la mia trigonometria e spero che tu possa aiutare qui con un semplice modello matematico. Ecco il mio modello finora nell'immagine allegata. Sono consapevole che l'animazione del frame ha altri problemi quando la palla si muove molto velocemente, ma per ora ho solo bisogno di calcolare ballDx e ballDy. È anche possibile che ballDx = 0 (solo movimento verticale), ma quando la palla devia ballDx può ottenere un valore diverso.

Collisione 2D tra la sfera e il bordo dell'angolo di un oggetto solido immobile


22
È quello che chiamano un "caso d'angolo"?
Andrew Grimm,

2
Sicuramente, come vanno le cose, presto potremo impiegare la teoria della relatività per risolverlo - il problema sta diventando massa (ive).
Lumis,

Risposte:


45

Nota: tutto quanto segue presuppone che la superficie della palla sia priva di attrito (quindi non inizierà a girare o rimbalzare diversamente perché lo è).

Al momento della collisione, la palla toccherà l'angolo. Quando gli oggetti solidi si scontrano, una forza agirà lungo la cosiddetta superficie normale, cioè perpendicolare alla superficie nel punto di collisione.

Dal momento che è una palla, perpendicolare alla superficie è verso il centro della palla. Ok, quindi conosciamo la direzione della forza, per quanto riguarda la sua grandezza? Supponendo una collisione elastica (e che il rettangolo non può muoversi), la palla deve rimbalzare alla stessa velocità con cui ha avuto un impatto.

Sia (nDx, nDy) la velocità dopo la collisione, (oDx, oDy) la velocità prima della collisione e (x, y) la posizione della palla nel punto di collisione. Supponiamo inoltre che l'angolo con cui la palla si scontra sia a (0,0).

Esprimendo le nostre intuizioni come formule, abbiamo:

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

Che equivale a:

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

Sostituendo le prime due equazioni nell'ultima, otteniamo:

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

Espandersi usando il thorem binomiale

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

rendimenti:

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

Questa equazione quadratica per cha due soluzioni, una delle quali è 0. Ovviamente, questa non è la soluzione a cui siamo interessati, poiché generalmente la direzione della palla cambierà a seguito della collisione. Per ottenere l'altra soluzione, dividiamo entrambi i lati per c e otteniamo:

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

Questo è:

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

Riassumendo, abbiamo:

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

Modifica : nel codice:

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

Alcune considerazioni sull'implementazione: Sebbene sia possibile approssimare (x, y) con la posizione della palla dopo la fase di simulazione, questa approssimazione cambierà l'angolo di deflessione e quindi sarà molto evidente, quindi i tuoi passaggi di simulazione devono essere molto fini (forse tali che la palla non si muove di oltre 1/20 del suo diametro per passo). Per una soluzione più accurata, è possibile calcolare il tempo in cui si verifica la collisione e suddividere quella fase di simulazione in quel momento, ovvero eseguire una fase parziale fino al punto di collisione e un'altra fase parziale per il resto della fase.

Modifica 2: calcolo del punto di impatto

Sia r il raggio, (x0, y0) la posizione e (dx, dy) la velocità della palla all'inizio della fase di simulazione. Per semplicità, supponiamo inoltre che l'angolo in questione si trovi in ​​(0,0).

Sappiamo:

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

Vogliamo

length(x,y) = r

Questo è

(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

Questa è un'equazione quadratica in t. Se è discriminante

D = b^2 - 4 * a * c

è negativo, non ha soluzioni, ovvero la palla non colpirà mai l'angolo nel suo percorso attuale. Altrimenti, le sue due soluzioni sono date da

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

Siamo interessati al momento in cui è iniziata la collisione, che è la prima volta t1.

Il tuo metodo diventerebbe:

    // 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
questo merita +1
dinamico

1
Sentiti libero di votare, poi :-)
meriton - in sciopero

3
Lo dici molto presto, At the moment of collision, the ball will be touching the cornerma non vedo una giustificazione di questa approssimazione (e deve essere un'approssimazione perché non è vera - la palla si tocca in due punti, nessuno dei quali è l'angolo).
Peter Taylor,

1
@Peter Taylor: Hai notato che l'OP ha disegnato la palla fuori dal rettangolo, e anche la formula di rilevamento delle collisioni fornita nella domanda presuppone questo? Devi pensare fuori dagli schemi qui :-)
Meriton - in sciopero l'

1
Adoro questa risposta, ma potrebbe usare un po 'di markup $ \ LaTeX $ della matematica.
Martin Wickman,

13

Ecco un modo visivo di vedere un problema.

Il set di problemi originale è cerchio contro rettangolo (grigio nell'immagine seguente). Ciò equivale al punto rispetto al rettangolo arrotondato (mostrato in nero).

Quindi questo è un problema in più parti. Stai testando la collisione del punto rispetto a 4 linee (estruse dal bordo del riquadro dal raggio del cerchio originale) e 4 cerchi (agli angoli del rettangolo con lo stesso raggio del cerchio originale).

Con la velocità approssimativa nell'immagine originale, il punto colpirà il cerchio nell'angolo in basso a destra. Tutto quello che devi fare è capire il punto sul cerchio d'angolo che vorresti colpire, calcolare l'angolo di quello e riflettere da esso.

inserisci qui la descrizione dell'immagine

Lascerò la derivazione di questo come esercizio al lettore.


2

Sto lavorando a un gioco e anche bloccato qui. Ma immagino che vada così:

inserisci qui la descrizione dell'immagine

C'è un'altra visione Il mio problema è che non so come calcolare rapidamente il nuovo dx, dy (per me usare la matematica tradizionale richiede troppi calcoli).


Il mio punto di vista è diverso da quello nel secondo collegamento, perché non credo che il nuovo vettore di velocità dipenda dal centro del blocco in questo modo. Mio fratello mi ha detto che la palla tornerà alla vecchia direzione (dx = -dx && dy = - dy) ma non credo.
Risa,

Se la palla colpisce l'angolo e la distanza della pallaX dall'angolo X è inferiore a 1/4 della pallaW, allora rimbalzerà indietro, altrimenti si fletterà in avanti a destra. Questo è un modello semplice che sto usando al momento, che non è ottimizzato per trovare l'angolazione esatta.
Lumis,

0

La cinematica si basa sulla scelta del corretto, come nella forma più conveniente per i calcoli, quadro di riferimento.

Qui definiremo innanzitutto la trasformazione T che risolve i nostri assi in componenti paralleli ( x ' ) e perpendicolari ( y' ) a una linea tra il centro della palla e l'angolo. La trasformazione inversa T * ripristinerà il nostro sistema di coordinate originale.

In questo nuovo quadro di riferimento, per riflessione (e la simmetria temporale e spaziale della fisica), abbiamo la trasformazione della velocità del contatto M (un impulso puntuale ) come quella che inverte la componente x ' e lascia invariata la componente y' . In termini di matrice questa è la matrice diagonale con -1 e 1 sulla diagonale.

Quindi la velocità dopo la collisione è semplicemente: V ' = T * . M . T . Vo .

Momento dell'impatto t è quindi solo la soluzione per ( T . Do ) + ( X . T . Vo ) ( t ) = r dove X è l'operatore di proiezione asse X ed r è il raggio della sfera. Riarrangiato, otteniamo
t = ( r - ( T . Do )) / (( X . T . Vo ) ( t ))

Ciò ha il netto vantaggio di seppellire tutta la matematica complessa in librerie grafiche standard rigorosamente scritte, testate e sottoposte a debug. Questa soluzione è identica anche per situazioni 2D e 3D: basta cambiare libreria grafica. Infine, sottolinea che si dovrebbe prima pensare a quadri di riferimento appropriati prima di affrontare qualsiasi problema di fisica. C'è sempre la tentazione di NIH, ma in verità è solo una ricetta per i bug quando sono disponibili soluzioni più concise.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.