Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

c++ - Kolizja, 3 punkty w lini prostej.

semar201 12 Maj 2013 20:55 1452 5
  • #1 12 Maj 2013 20:55
    semar201
    Poziom 8  

    Witam, piszę obecnie grę oraz edytor mapy do niej, postanowiłem zrezygnować z sprawdzania z kolizji z każdym obiektem natomiast kolizja będzie sprawdzana z 'niewidzialnymi ścianami' tworzonymi podczas edycji mapy. Z ścianami równoległymi i prostopadłymi do osi X nie ma problemu ale jak z ukośnymi?
    Na obrazku poniżej przedstawiam przykładowe niewidzialne ściany (czerwone)
    c++ - Kolizja, 3 punkty w lini prostej.
    Myślałem o tym by najpierw sprawdzać czy postać(obiekt który ma być podatny na kolizje) znajduje się w zielonym obszarze (dlaczego, to teraz nie istotne)jeśli tak to czy znajduje się w lini prostej z punktami 1i2 lub 2i3 lub 3i4 (zależy od tego w którym zielonym prostokącie jest) jeśli tak to wystąpiła kolizja jeśli nie to bye.
    No i tu mam problem jak sprawdzić czy punkt o wsp X Y jest w lini prostej z punktami p1 i p2, może ma ktoś gotową funkcję ?

    0 5
  • #2 12 Maj 2013 21:04
    Dżyszla
    Poziom 42  

    Tu nie trzeba gotowych funkcji, tylko matematyki :) Wyznaczasz wzór prostej, przechodzącej przez odcinek oraz drugiej prostej, po której porusza się obiekt. Na tej podstawie łatwo wyznaczyć punkty przecięcia. Jako, że nie wyjdą one idealnie w całkowitych współrzędnych (w większości przypadków), to wystarczy sprawdzić odległość dwóch punktów - jeśli z predykcji kolejnej pozycji wyjdzie, że punkty się oddalają, a w poprzedniej iteracji zbliżały się, to znaczy, że nastąpiła kolizja w danej iteracji.

    PS. Owszem, w ramach optymalizacji możesz zastosować wstępny warunek znajdowania się w prostokącie opisującym odcinek.

    0
  • #3 12 Maj 2013 21:09
    semar201
    Poziom 8  

    Problem właśnie jest z tymi wzorami na proste, jak w programie ma to wyglądać, co do sprawdzania czy obiekt się oddala czy przybliża to ciekawy pomysł.

    0
  • #4 12 Maj 2013 22:49
    Dżyszla
    Poziom 42  

    y = ax + b

    Mając dwie pary x i y tworzysz układ równań i rozwiązujesz metodą wyznacznikową.

    Mając dwie proste poprzez układ równań wyznaczasz punkt ich przecięcia.

    Zapraszam na forum matematyczne :) Implementacja jest banalna, bo w zasadzie sprowadza się do przepisania wzorów z kartki do komputera.

    0
  • #5 12 Maj 2013 23:00
    leoha
    Poziom 16  

    Nie wiem czy to jest w 3D czy 2D, ale jeśli przybliżysz obiekt, którego kolizje testujesz za pomocą kuli (koła jeśli 2D), to możesz łatwo sprawdzić czy kolizja występuje i gdzie skoro ściany są płaszczyznami (prostymi w 2D).
    Plane-Sphere intersection, Line-Circle intersection
    Oczywiście sprawdzasz czy przecięcie mieści się w punktach granicznych płaszczyzny (prostej w 2D).
    Jak chcesz dokładniej to albo musisz to sprawdzać dla każdego punktu (naiwnie), ale użyć sprawdzonych struktur do reprezentowania obiektów, których kolizje chcesz testować np. Octree

    0
  • #6 13 Maj 2013 13:53
    semar201
    Poziom 8  

    leoha napisał:
    Nie wiem czy to jest w 3D czy 2D

    3D ale przy kolizji testowane będą 2 wymiary więc można uznać że jest to 2D, obiekt którego kolizja z ścianami będzie sprawdzana, będzie zbliżony do kwadratu. Dżyszla thx, zaraz zabieram się za lekturę.

    0