Piłka uderza w róg, gdzie się odbije?

46

Muszę odświeżyć moją trygonometrię i mam nadzieję, że pomożesz tutaj z prostym modelem matematycznym. Oto mój model do tej pory na załączonym obrazku. Wiem, że animacja klatki ma inne problemy, gdy piłka porusza się bardzo szybko, ale na razie muszę tylko obliczyć ballDx i ballDy. Możliwe jest również, że ballDx = 0 (tylko ruch pionowy), ale gdy piłka się odbije, ballDx może otrzymać inną wartość.

Zderzenie 2D między kulą a krawędzią narożną bryły nieruchomego obiektu

Lumis
źródło
22
Czy to, co nazywają „skrzynką narożną”?
Andrew Grimm,
2
Zdecydowanie, w miarę upływu czasu, wkrótce możemy zastosować teorię względności, aby ją rozwiązać - problemem staje się masa (ive).
Lumis,

Odpowiedzi:

45

Uwaga: Wszystkie poniższe założenia zakładają, że powierzchnia piłki jest wolna od tarcia (więc nie zacznie się obracać ani odbijać inaczej, ponieważ jest).

W momencie zderzenia piłka dotknie rogu. Kiedy zderzą się obiekty stałe, siła będzie działać wzdłuż tak zwanej powierzchni normalnej, tj. Prostopadłej do powierzchni w punkcie zderzenia.

Ponieważ jest to piłka, prostopadła do powierzchni jest skierowana do środka piłki. Ok, więc znamy kierunek siły, a co z jej wielkością? Zakładając, że zderzenie sprężyste (i prostokąt nie może się poruszać), piłka musi odbić się z taką samą prędkością, z jaką uderzyła.

Niech (nDx, nDy) będzie prędkością po zderzeniu, (oDx, oDy) prędkością przed zderzeniem oraz (x, y) pozycją kuli w punkcie zderzenia. Załóżmy dalej, że róg, z którym zderza się piłka, wynosi (0,0).

Wyrażając nasze spostrzeżenia jako formuły, mamy:

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

Co odpowiada:

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

Podstawiając dwa pierwsze równania w ostatnim, otrzymujemy:

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

Rozwijanie za pomocą twierdzenia dwumianowego

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

daje:

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

To równanie kwadratowe cma dwa rozwiązania, z których jedno wynosi 0. Oczywiście nie jest to rozwiązanie, które nas interesuje, ponieważ ogólnie kierunek piłki zmieni się w wyniku zderzenia. Aby uzyskać inne rozwiązanie, dzielimy obie strony przez c i otrzymujemy:

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

To jest:

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

Podsumowując, mamy:

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

Edycja : W kodzie:

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

Kilka uwag dotyczących implementacji: Chociaż można przybliżać (x, y) pozycją kuli po etapie symulacji, to przybliżenie zmieni kąt odchylenia, a zatem będzie bardzo zauważalne, więc kroki symulacji muszą być bardzo dokładne (być może takie, aby piłka nie porusza się więcej niż o 1/20 swojej średnicy na krok). Aby uzyskać dokładniejsze rozwiązanie, możesz obliczyć czas wystąpienia kolizji i podzielić ten krok symulacji w tym czasie, tj. Wykonać krok częściowy do momentu zderzenia i kolejny etap częściowy dla pozostałej części kroku.

Edycja 2: Obliczanie punktu uderzenia

Niech r będzie promieniem, (x0, y0) pozycją i (dx, dy) prędkością kuli na początku etapu symulacji. Dla uproszczenia załóżmy, że dany narożnik znajduje się w (0,0).

Wiemy:

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

Chcemy

length(x,y) = r

To jest

(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

To równanie kwadratowe wt. Jeśli jest dyskryminujący

D = b^2 - 4 * a * c

jest negatywny, nie ma rozwiązań, tzn. piłka nigdy nie uderzy w róg na swoim obecnym kursie. W przeciwnym razie jego dwa rozwiązania są podane przez

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

Interesuje nas czas rozpoczęcia kolizji, czyli wcześniejszy t1.

Twoja metoda stałaby się:

    // 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 - podczas strajku
źródło
1
to zasługuje na +1
dynamiczny
1
Zachęcamy do głosowania, a następnie :-)
meriton - podczas strajku
3
Mówicie to bardzo wcześnie, At the moment of collision, the ball will be touching the cornerale nie widzę uzasadnienia tego przybliżenia (i musi to być przybliżenie, ponieważ to nieprawda - piłka dotyka dwóch miejsc, z których żadne nie jest narożnikiem).
Peter Taylor
1
@Peter Taylor: Zauważyłeś, że OP wyciągnął piłkę poza prostokąt, a formuła wykrywania kolizji podana w pytaniu również to zakłada? Musisz myśleć nieszablonowo tutaj :-)
meriton - podczas strajku
1
Podoba mi się ta odpowiedź, ale przydałaby się matematyka $ \ LaTeX $.
Martin Wickman,
13

Oto wizualny sposób patrzenia na problem.

Oryginalny zestaw problemów to koło kontra prostokąt (szary na obrazku poniżej). Jest to równoważne punktowi z zaokrąglonym prostokątem (pokazanym na czarno).

To jest problem wieloczęściowy. Testujesz zderzenie punktowe z 4 liniami (wyciągniętymi z krawędzi pudełka przez promień oryginalnego koła) i 4 kółkami (w rogach prostokąta o tym samym promieniu oryginalnego koła).

Z przybliżoną prędkością na oryginalnym obrazie punkt uderzy w prawy dolny róg koła. Wszystko, co musisz zrobić, to ustalić punkt na okręgu narożnym, który byś uderzył, obliczyć kąt tego i odbić się od niego.

wprowadź opis zdjęcia tutaj

Wyprowadzę to jako ćwiczenie dla czytelnika.

Tetrad
źródło
2

Pracuję nad grą i również utknąłem tutaj. Ale myślę, że dzieje się w ten sposób:

wprowadź opis zdjęcia tutaj

Jest inny pogląd. Moim problemem jest to, że nie wiem, jak szybko obliczyć nowy dx, dy (dla mnie używanie tradycyjnej matematyki wymaga zbyt wielu obliczeń).

Risa
źródło
Mój punkt widzenia jest inny niż w drugim łączu, ponieważ nie sądzę, aby nowy wektor prędkości zależał od takiego środka bloku. Mój brat powiedział mi, że piłka odbije się od starego kierunku (dx = -dx && dy = - dy), ale nie sądzę.
Risa,
Jeśli piłka uderzy w narożnik, a odległość X od narożnika X jest mniejsza niż 1/4 piłki, odbije się, w przeciwnym razie odbije się w prawo. Jest to prosty model, którego obecnie używam, który nie jest dostrojony, aby znaleźć dokładny kąt.
Lumis,
0

Kinematyka polega na wybraniu właściwej, jak najbardziej dogodnej do obliczeń, ramy odniesienia.

Tutaj najpierw zdefiniujemy transformację T, która rozkłada nasze osie na komponenty równoległe ( x ' ) i prostopadłe ( y' ) do linii między środkiem piłki a narożnikiem. Odwrotna transformacja T * przywróci nasz pierwotny układ współrzędnych.

W tym nowym układzie odniesienia przez odbicie (oraz symetrię czasową i przestrzenną fizyki) mamy transformację prędkości styku M ( impulsu punktowego ), która odwraca składową x ' i pozostawia niezmienioną składową y' . Pod względem macierzy jest to macierz diagonalna z -1 i 1 na przekątnej.

Zatem prędkość po zderzeniu wynosi po prostu: V ' = T * . M . T . Vo .

Czas oddziaływania t jest wówczas tylko rozwiązanie ( T . Do ) + ( X , T . Vo ) ( t ) = r , gdzie X jest operatorem projekcji osi X, a r oznacza promień kuli. Uporządkowane, otrzymujemy
t = ( R - ( t . Do )) / (( X , T . Vo ) ( t ))

Ma to tę wyraźną zaletę, że zakopuje całą złożoną matematykę w rygorystycznie napisanych, przetestowanych i debugowanych standardowych bibliotekach graficznych. To rozwiązanie jest również identyczne w sytuacjach 2D i 3D - wystarczy przełączyć bibliotekę graficzną. Na koniec podkreśla, że przed zmierzeniem się z jakimkolwiek problemem fizyki należy najpierw pomyśleć o odpowiednich ramach odniesienia . Zawsze istnieje pokusa NIH, ale tak naprawdę to tylko przepis na błędy, gdy dostępne są bardziej zwięzłe rozwiązania.

Pieter Geerkens
źródło