Autor Wątek: Kolizja sferyczna kilka testów  (Przeczytany 2867 razy)

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 27, 2007, 20:08:47
Mam sobie filmik: http://youtube.com/watch?v=p13cmjA7hWA

I teraz chce wyeliminować skakanie jak sfera przebije wiecej niz dwie sciany i te sciany sa na tyle blisko siebie i tak umieszczone ze raz testuje sie kolizja dla jednej pozniej przesuwa sfere tam gdzie 'byc powinna' i testuje z drugą scianą, przez ktora znowu sfera przesuwa sie w keirunku tamtej pierwszej i tak w kolko :0 I mi obraz skacze (no w sumie sfera), Ta zielona kreska to normalna kolizji :S
I jak ja mam sie pozbyc tego skakania?? :d

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

RageX

  • Gość
# Maj 29, 2007, 14:08:59
1. Muze mogłeś sobie darować. ^^
2. Popełniasz bład cofając kulę gdy kolizja jest. Znaczy się nie jest to dobrze widziane. Nie chce mi się tego teraz argumentować. :P
W każdym razie robisz test na macierzy z pozycją + velo. Robisz collTest. I albo zostawiasz starą z samą pozycją lub nową z pozycją + velo. To tyle nie zagłebiając się w temat.

3. Pytanie właściwe... to czego szukasz zwie się collision response. :) I na google tego trochę jest...
Sam na dychu mam to...
"Improved Collision detection and Response"
Kasper Fauerby
kasper@peroxide.dk
http://www.peroxide.dk
25th July 2003

nie wiem skąd.
O elipsoidach(czyli o sferach właściwie). Naprawdę fajnie napisane.

Autor sprowadza to do tego o czym mówisz. Sprawdzamy naszą kolizje na kolejnych velo, aż do momentu, gdy kolizji nie ma.
Ja ten sam problem mam tyle że dotyczy tylko kątów ostrych. Ślizgam się po ścianie aż dochodzi do sytuacji że velo "kładąc" się na ścianę, wchodzi na następną. Tamta ściana odbija na tą starą... w tym wypadku będe musiał sprawdzić czy odbija na tą samą i przystopować velo. Jeszcze tego u siebie nie testowałem, więc nie moge ci powiedzieć czy zadziała w 100%. Podobny problem miałem gdy velo był razem z grawitacją...

Podsumowując nie pomogłem ci, heh.

EDIT: W tym temacie autor ma podobny problem... ale pomoc jakoś nie taka.
http://forum.warsztat.gd/index.php/topic,3588.0.html
Znaczy się - załóźmy, że masz dziurę w którą spada twój bohater...
wektor 0,-1,0. i dziura \/ (heh, ascii rulez). no to ślizgając się, dojedziesz do punktu w którym wjeżdzasz z jednej płaszczyzny na drugą. Ten punkt to będzie dla sfery odległość od wszystkich płaszczyzn równa promieniowi. Może nie zbyt "ładnie" napisane... Więc trzeba będzie zliczyć wszystkie płaszczyzny od których się odbija nasza rekursywa i ustalić pozycje. Mam nadzieję, że nic nie pochrzaniłem.
« Ostatnia zmiana: Maj 29, 2007, 14:40:24 wysłana przez RageX »

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 29, 2007, 20:49:28
no cos takiego: odbijam sie od pierwszego pozniej od drugiego :S

a teraz wielkie lol, noby znajduje face'y ktore sa skierowane w przeciwne strony :U

function GET_BIGGEST_dimension_FROM_VECTOR(v : t3dpoint) : t3dpoint;
begin
result := triplesingletot3dpoint(0,0,1);
if (abs(v.x) > abs(v.y)) and (abs(v.x) > abs(v.z)) then result := triplesingletot3dpoint(1,0,0);
if (abs(v.y) > abs(v.x)) and (abs(v.y) > abs(v.z)) then result := triplesingletot3dpoint(0,1,0);
end;

function z(float :single) : boolean;
begin
if float >= 0 then result := true else result := false;
end;

function Porownaj_normalne(player_pos : t3dpoint; Ipoint1, Ipoint2 : t3dpoint) : boolean;
var
p1,p2 : boolean; //3 Dismension
v1,v2 :  t3dpoint;
s1,s2:t3dpoint;
begin result := false;
v1 := normalize(vectorab(Ipoint1,player_pos));
v2 := normalize(vectorab(Ipoint2,player_pos));

s1 := GET_BIGGEST_dimension_FROM_VECTOR(v1);
s2 := GET_BIGGEST_dimension_FROM_VECTOR(v2);

p1 := false; p2 := false;

if s1.x = 1 then if s2.x = 0 then exit;
if s1.y = 1 then if s2.y = 0 then exit;
if s1.z = 1 then if s2.z = 0 then exit;

if s1.x = 1 then p1 := z(s1.x); p2 := z(s2.x);
if s1.y = 1 then p1 := z(s1.y); p2 := z(s2.y);
if s1.z = 1 then p1 := z(s1.z); p2 := z(s2.z);

if p1 = p2 then exit;


result := true;



end;

Cytuj
Recursively call the entire collision detection routine with the new position
and the new velocity vector.
The last step might come as a surprise but yes, collision detection is a
recursive function and for each recursion we check all triangles all over again!
We continue to recurse until either:
We do not hit anything, so we just update the position.

Co to znaczy, ze jak? ze niby mam sprawdzic jak mam wiecej niz jedna kolizje ze sciana to: odbijam sie najpierw od najblizszej, pozniej odbijam od drugiej(tylko ze zmieniona juz pozycja z wyniku z pierwszej kolizji), przeciez moze mnie przebic tam gdzie nie chce. Wywoluje wtedy n razy kolizje i sprawdzam...

Ja to tak rozumiem:  sprawdzamy z czym kolidujemy teraz tak samo jak wyzej tylko nie zmieniamy pozycji kuli) cos obliczamy i mamy wynik =S
« Ostatnia zmiana: Maj 29, 2007, 21:15:17 wysłana przez ziomber »

RageX

  • Gość
# Maj 29, 2007, 21:41:59
No... wszystko robisz na samym velocity w jednym stopie, szukasz tego ostatniego velocity które będziesz mógł nałożyć na pozycje, bez ryzyka że coś, w coś wejdzie.
Z tego co próbowałem z tym zrobić... ta rekursywa daje ci informacje jakie płaszczyzny są w zasięgu velocity...(ale trzeba uważać aby tej samej płaszczyzny kilka razy nie łapać, no i zmniejszać odpowiednio velocity na każdym odbiciu). A odpowiednią pozycję trzeba już osobno liczyć z równania płaszczyzn. Coś jak ta kulka w dołku z Ballance.
Ja mam AABB i meshe, wymiękłem narazie na tym...  jednak najpierw dopracuje algorytm na sferach, a potem rozwine.

Sorry za nie techniczny język. Raczej się nie poprawie.^^

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 29, 2007, 23:20:19
nie kumam ;0

RageX

  • Gość
# Maj 30, 2007, 00:31:04
heh. Szkoda że nie wiem czego. Wiem że zamotałem, ale coś chyba skumałeś z tego.
Masz sferę dosuniętą do ściany(radius równy dystansowi do płaszczyzny)? Porusza się po płaszczyźnie?
Znaczy się, czy wektor velo jest rzutowany na płaszczyznę? Czyli masz już slide-a?
Jeśli do tej pory wszystko jasne i się rozumiemy to...

Mając czysty wektor velo na starcie i mając "kulkę" dosuniętą do płaszczyzny

jeśli test na pozycji z velo zwróci prawdę
   rzutujesz velo wektor na tą płaszczyznę pierwszą(slide).
   jeśli test na starej pozycji + rzutowane velo zwróci prawdę
      rzutujesz rzutowane velo na płaszczyznę drugą(slide)
      jeśli test zwróci prawdę i velo wpadnie na płaszczyznę pierwszą
         to liczymy dozwolone velo z równania dwóch płaszczyzn.
EDIT: żle... zaraz poprawię...
To taki najprostszy przykład dla dwóch ścian i kolizji dla punktu.
« Ostatnia zmiana: Maj 30, 2007, 00:55:57 wysłana przez RageX »

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 30, 2007, 01:35:07
czekaj ja mam funkcje:

sprawdz kolizje {
pętla for przez wszystkei sciany - sprawdz czy sfera przebija sciane jak tak to dodaj ją do stosu


teraz szuka najblizszej sciany i z nia robi kolizje tzn zwraca punkt, do którego mamy się przesunąć


}


a sprawdzam czy sfera mi przebija sciane (mniejsza o to) jak jest kolija to zwraca mi punkt od ktorego mam sie odbic

RageX

  • Gość
# Maj 30, 2007, 02:17:46
No właśnie te same zasady mają się do sfer co do punktu, liczysz dystans od kolizji z promieniem... itd.
heh, a co do moich rozważań... kontynuacja.
Dobrze jednak było.
Tu rysunki dla dwóch przypadków.

K¡TY OSTRE
http://img256.imageshack.us/my.php?image=liczenievelocityktyostrrb7.jpg
trzeba sprawdzić czy nowy wektor będzie ślizgał się na starą ścianę... czyli tak jak napisałem.

K¡TY
http://img177.imageshack.us/my.php?image=wyznaczanievelocityqf1.jpg
Sprawdzając za każdą iteracją czy kolejny nowy wektor jest prostopadły do tego oryginalnego(pierwszego), unikniemy zawijaka(wektora który się cofa).

Jeszcze kilku rzeczy w tym nie kumam... ale jest późno...

EDIT: Mam... wiem co jest źle. Dziś dam rysunek. W każdym razie trzeba rzutować oryginalne velo na  tą trzecią płaszczyzne po której slide'ujemy, a nie te nowe rzutowanie... na rysunku pokażę gdzie podczepić i jak.

Potem sam to u siebie napisze i algorytm dam.
Powinno pójść z górki... mhihi.
« Ostatnia zmiana: Maj 30, 2007, 09:19:59 wysłana przez RageX »

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 30, 2007, 13:52:35
twoje rysunki to tylko ty rozumeiszn nikt inny.....

RageX

  • Gość
# Maj 30, 2007, 14:35:44
sorry... no to ostatniego rysunku, chyba nie będzie.
Sobie pomogłem, szkoda że nie tobie.
Tak to jest z rysowaniem abstrakcji, gdzie mam kilka iteracji... i w każdej kilka zmiennych + późne godziny.
Czyli pomysł rysunków do bani (z rysunku i tak nic nie wyniknie?), czy opisać ten ostatni po prostu lepiej, niż tamte?

Z resztą gdy rozszyfrowałem jak POPRAWNA ODPOWIEDŹ NA KOLIZJE ma wyglądać,
to i nie tylko rysunek jest potrzebny, ale cały duży tekst... czym dalej tym więcej problemów do rozwikłania...
BTW. pewnie na necie ktoś już o tym całym szukaniu velocity pisał...

Mogę co najwyżej odpowiedzieć na konkretne pytanie, inaczej tylko znowu zamieszam.


« Ostatnia zmiana: Maj 30, 2007, 14:56:10 wysłana przez RageX »

Offline ziomber

  • Użytkownik

  • Zbanowany
# Maj 30, 2007, 15:54:00
no ale trzeba to jakos wymyslec :]

Offline Spider100

  • Moderator
    • Strona domowa

# Czerwiec 02, 2007, 11:53:09
Witam!

Algorytm jest prosty:

1. Szukamy najbliższego punktu kolizji (w ruchu) kuli z poligonem, czyli
Przeszukujemy całą listę i jak już dostaniemy to pierwsze miejsce zetknięcia to o odpowiednią długość wektora prędkości przesuwamy naszą kulę, aby obiekty się zetknęły.
Dlaczego? Bo na drodze kuli nic innego nie stoi:)
2. Skracamy stary wektor prędkości o ten kawałek, co przesunęliśmy już kulę.
3. Teraz znajdujemy się przy pewnej ścianie rzutujemy na nią pozostały wektor prędkości prostopadle i otrzymujemy do tej ściany równoległą prędkość to jest nasz ślizg po ścianie.
4. Wracamy do punktu 1 i tak długo powtarzamy działanie, aż ostateczny wektor prędkości bezie miał bardzo małą długość.

Dla kątów ostrych pomiędzy ścianami sprawa się komplikuje, ale można to obejść odpowiednio rzutując wektor prędkości, gdy widzimy, że kąty się nieodpowiednie.

RageX jeśli mógłbym coś zaproponować to pisz po naszemu bo skróty w stylu "velo" nikomu nie pomagają:) Rysunki są dobre ale tylko jak wiadomo o co chodzi :D

Pozdrawiam!
Spider^*^

Offline ziomber

  • Użytkownik

  • Zbanowany
# Czerwiec 02, 2007, 12:19:14
Cytuj
1. Szukamy najbliższego punktu kolizji (w ruchu) kuli z poligonem, czyli
Przeszukujemy całą listę i jak już dostaniemy to pierwsze miejsce zetknięcia to o odpowiednią długość wektora prędkości przesuwamy naszą kulę, aby obiekty się zetknęły.
Dlaczego? Bo na drodze kuli nic innego nie stoi:)

Ja mam tak: funkcja sphere_intersect_polyogn sprawdza mi czy dobijam sfera do jakiegos polygona, jak tak to zwraca punkt kolizji
mam tez funkcje collision, która leci przez wszystkie polygony na scenie i sprawdza wlasnie za pomoca sphere_interset_polygon czy nastepuje kolizja, pozniej wybiera ta najblizsza, do tego momentu mam chyba spelniony warunek co napisales ale co dalej, ja nie mam testu z punktu A do B, wektor prędkości to jest chyba wektor AB? bo jak nie to u mnie na razie nie ma wektora prędkości dla testowanych kul
Cytuj
to o odpowiednią długość wektora prędkości przesuwamy naszą kulę, aby obiekty się zetknęły
NIe czaje, czyli odsuwam od tej najbliższej kolizji sferę tak, żeby stykała się z tą powierzchnią, ale jej nie dotykała? ;] bo nie kapuje ja mam troche inny test :S

eeee reszta nizej sie nie liczy jak punkt pierwszy jest meksykiem.
2. Skracamy stary wektor prędkości o ten kawałek, co przesunęliśmy już kulę.
3. Teraz znajdujemy się przy pewnej ścianie rzutujemy na nią pozostały wektor prędkości prostopadle i otrzymujemy do tej ściany równoległą prędkość to jest nasz ślizg po ścianie.
4. Wracamy do punktu 1 i tak długo powtarzamy działanie, aż ostateczny wektor prędkości bezie miał bardzo małą długość.

Offline Spider100

  • Moderator
    • Strona domowa

# Czerwiec 02, 2007, 12:49:14
ziomber mówimy o dwóch zupełnie rożnych metodach teraz o_O

http://forum.warsztat.gd/index.php/topic,2890.msg38593.html#msg38593

Wypychanie kuli z poligonu nie daje dziwnych skoków (ja mam tą metodę silniku fizycznym i działa) widocznie coś skopałeś :D

Cytuj
Ja mam tak: funkcja sphere_intersect_polyogn sprawdza mi czy dobijam sfera do jakiegos polygona, jak tak to zwraca punkt kolizji
Pytanie tylko jaki punkt, na kuli czy na poligonie :P

Offline ziomber

  • Użytkownik

  • Zbanowany
# Czerwiec 02, 2007, 15:55:57
No patrz odbija mi sferę od najbliższego punktu na ścianie (najbliższy pubkt sie wylicza, ze wszystkich testowanych ścian, do których sfera dobija), ta funkcja sphere_intersect_polygon dobrze dziala i zwraca wartości, w collision sortuje wszystkie wyniki i wybieram najbliższy, ale co z tego jak mi to wariuje. NIe dość, że chociaż problem nie jest trudny (jedn z rzypadków), że nie obsługuje mi kolizji do więcej niż jednej ściany to sam juz nie wiem :0


Tutaj jest filmik http://www.youtube.com/watch?v=G60LqZXM4Jc [ja pier*** nie dosc ze teraz udalo mi sie to zuloadowac o jakość jest z dupy]  na końcu jest to najlepiej pokazane jak mi skacze, albo jak przechodze przez ściany :S Dodatkowo nie ma takiego czegoś jak obliczanie wektora równloegłęgo do ściany, żeby po niej sunąć (ślizgać się) po prostu sama sie sfera slizga :S
W 53 sekundzie filmu jest to dokladnie opisane ci mi sie dzieje. Robiłem też coś takiego, że wywoływałem test kolizji gdzieś tak 4 razy tak samo jak opisałem wcześniej, ale to nie pomagało mi i tak, sfera skakała jak dobiła do wieej niz jednej sciany (tzn jak podchodziłem do kąta;d) i co jeszcze nie zawse mi poprawnie jak wczeniej sprawdzalo kolizje sam nei wiem co mam robic w 53 sekundzie filmu jest to ładnie pokazane co się dzieje i ogolnie te przechodzenie przez sciany... :U Przynajmniej działa poprawnie dla jednej ściany :0 Kolizja też mi wariuje jak mam np. jedna podloge na scenie i jest ona zrobiona z 2 trójkątów to wtedy na bokach (tam gdzie sie stykaja te dwa trójkąty) też mi zaczyna skakać sfera i nie mam pojecia czemuuuu, muzyka w filmiku jest bo ten silnik to jeden wielki spectrum analyzer (na początku miało to być samo spectrum analyzer do winampa w formie dll, ale winamp nie pozwalał na ładowanie plików i juz gierka sie tworzy ;d), Swoją drogą co zrobić, żeby sfera nie wchodziła mi na murki co są na filmiku (bo na schody to sie ciesze ze mi wchodzi), ale niekiedy jest murek nie do pokonania bez skoku a to mi idzie do góry i omija hehehe
« Ostatnia zmiana: Czerwiec 02, 2007, 15:58:05 wysłana przez ziomber »