User Tools

Site Tools


game:physics

Fizyka

Pętla główna

Pętla główna ma być wykonywana tak, że fizyka jest uaktualniana co stałą wartość dt. Umożliwia to jakieś sensowne debugowanie wszystkiego.

Symulacja

Do symulowania wykorzystam (przynajmniej na razie) najprostszą metodę - funkcja oblicza wartości pozycji i prędkości z wartości poprzedniego stanu. Źródła nazywają to metodą Eulera i twierdzą że jest słaba1), czy do tego projektu wystarczy się okaże.

Ok, jednak zrobię kilka funkcji całkujących - bo tym one są i potestuje jaka się nadaje.

Nie wiem jak rozwiązać problem tarcia, można to zrobić impulsami przy kolizji, ale czy to będzie dobrze działać? Myślałem o ustawianiu siły po kolizji i anulowaniu jej jeżeli jednostka przestała kolidować po jakimś czasie, jednak problem pojawia się w momencie kilku jednoczesnych kolizji. Na chwilę obecną najrozsądniejsze wydaje mi się rozwiązanie impulsowe + kolizja z podłożem nigdy nie zostaje rozwiązana tak że w następnym kroku nie zostanie ona ponownie wykryta.

linki:

Wykrywanie kolizji

Dobre źródło wiedzy na temat algorytmów dla grafiki 2D (i nie tylko): http://www.faqs.org/faqs/graphics/algorithms-faq/

Założeniem jest że wszystkie figury między jakimi będą sprawdzane kolizje to figury wypukłe (warunek SAT). Sprawdzanie czy wielokąt jest wypukły: http://stackoverflow.com/questions/471962/how-do-determine-if-a-polygon-is-complex-convex-nonconvex

Problemy

Gość ma ten sam problem z rozwiązywaniem kolizji kilku obiektów “w złej kolejności” http://gamedev.stackexchange.com/questions/63419/collision-detection-with-multiple-polygons-simultaneously

SAT

Separating Axis Theorem Jeden obraz jest wart więcej niż tysiąc słów. Zasada działania algorytmu sat jest następująca: dla każdego boku badanych wielokątów, tworzę prostą prostopadłą i rzutuje na nią wielokąty, jeżeli istnieje choć jedna prosta na której zrzutowane wielokąty nie zachodzą na siebie, oznacza to że nie ma kolizji.

Jak widać na rysunku obok, jeden z wielokątów ma dwie pary boków równoległych do siebie, to oznacza że jest jedna prosta prostopadłą do każdej z tych par i zamiast testować 4 rzutowania (dla tego wielokąta) można rzutować tylko dwa razy.

Polygon

Porównywanie floatów

Ważną rzeczą jest porównywanie floatów, np. do sprawdzenia czy dwa wektory są równoległe.

Myślę żę dwa wektory można uznać za równoległe kiedy linie rysowane w wg. kierunków wektorów nie widać że się “rozchodzą” na ekranie monitora. Sprawdzanie równoległości niech się odbywa jako porónywanie kątów wektorów (atan2), trzeba tylko wyszukać maksymalny epsilon dla którego linie będą równoległe na moim monitorze. :-)

Walidacja polygonu

Założeniem algorytmu SAT jest to że badane wielokąty są wypukłe, dlatego należy sprawdzić czy podawany wielokąt rzeciwiście taki jest.

Suma kątów w wielokącie wypukłym wynosi dokładnie (v - 2) * π, gdzie v to liczba wierzchołków wielokąta. Można z tego skorzystać przy sprawdzaniu wypukłości.

Sprawdzanie czy odcinki się przecinają

http://www.cs.cmu.edu/~quake/robust.html - stronka tłumacząca jak dokładnie sprawdzić stronę po której leży punkt. Stąd padł pomysł (na sprawdzanie niedokładne).

Punkt po "lewej" stronie odcinka Na rysunku obok punkt C znajduje się po “lewej” stronie odcinka. Przepis na sprawdzenie tego faktu: tworzymy wektory AB i AC. Znak iloczynu wektorowego (czy wynikowy wektor prostopadły do płaszczyzny jest skierowany w górę czy w dół) zależy od tego który wektor “jest pierwszy”, tzn ma mniejszy kąt - gdyby go przedstawić we współrzędnych polarnych.

Na rysunku wektor AB ma mniejszy kąt niż AC, więc zgodnie z regułą śruby prawoskrętnej - jeżeli będziemy go zbliżać do wektora AC to “śruba” będzie się wkręcać od monitora w kierunku czytelnika (znak dodani). W przeciwnym wypadku otrzymamy znak ujemny, a zero kiedy kąt pomiędzy wektorami wynosi 0 (czyli punkty są współliniowe).

AB = [Bx - Ax, By - Ay, 0]
AC = [Cx - Ax, Cy - Ay, 0]
 
          | i          j          k |
AB x AC = | (Bx - Ax)  (By - Ay)  0 | = k(Bx - Ax)(Cy - Ay) - k(By - Ay)(Cx - Ax)
          | (Cx - Ax)  (Cy - Ay)  0 |          

Iloczyn wektorowy:

Umiejąc określić stronę punktu względem odcinka, sprawdzenie czy dwa odcinki się przecinają jest już proste. Odcinki przecinają się wtedy, gdy względem jednego odcinka punkty drugiego leżą po różnych stronach i vice versa.

Alternatywne podejście do sprawdzania przecięcia odcinków: http://www.bryceboe.com/2006/10/23/line-segment-intersection-algorithm/.

game/physics.txt · Last modified: 2016/07/13 15:47 (external edit)