Autor Wątek: Collision Response  (Przeczytany 2199 razy)

Offline Kwazar

  • Użytkownik

# Wrzesień 16, 2007, 15:37:58
Witam!

Napisałem test kolizji sferycznych w 3D i wszystko działa jak należy.  Jednak z napisaniem reakcji na te kolizje mam juz problemy  :-\.

A- pozycja sfery przed
B- pozycja sfery po

Tak wykrywam kolizje:
- Sprawdzam czy punkty A i B leża po obu stronach płaszczyzny
- Wyliczam punkt przecięcia płaszyzny i odcinka AB
- Sprawdzam czy punkt przecięcia jest wewnątrz trójkąta
- Jeżeli ściana przeszła pomyślnie wszystkie testy dodaję normalna ściany i odległość punktów A i B do stosu

Response( wczesniej ):
- aktualna pozycja = pozycja przed kolizja
czego wynikiem bylo zatrzymanie sfery i zero ślizgu, czyli nie można było chodzić po trójkącie z grawitacją większą od zera.

Response( teraz ):
- cofam pozycje sfery w kierunku normalnej ściany o dlugosc odcinka AB podzielona przez 2

Ten sposób byl o wiele lepszy od wcześniejszego bo można było chodzić po ścianie i był ślizg ale gdy dochodziło do sytuacji gdy z sferą kolidowały 2 sciany lub więcej, sfera zaczynała skakać  :-\

Zna ktoś może inne pomysły na response? Bo ja juz nie mogę wpaść na coś innego  :'(.
Proszę o pomoc!

Pozdrawiam!

Offline Mr. Spam

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

RageX

  • Gość
# Wrzesień 16, 2007, 16:11:12
Ja, co prawda w 2D, ale zrobilem to tak...

Wykrycie kolizji:
Jesli odleglosc srodkow dwoch okregow jest mniejsza lub rowna od sumy dlugosci ich promieni to zachodzi kolizja.

Reakcja:
Zalozmy ze sfera1 stoi w miejscu, a sfera2 sie porusza i chcemy uniemozliwic jej "przejsce" przez sfere1. Rozwiazanie tego problemu przedstawiam na rysunku (o1 i o2 to wspolrzedne srodkow orkegow, r1 i r2 to ich promienie)

Wiem, ze to w 2D, a Ty chcesz miec to na sferach w 3D. Jednak sama koncepcja jest dokladnie ta sama
« Ostatnia zmiana: Wrzesień 16, 2007, 16:15:11 wysłana przez maxest »

RageX

  • Gość
# Wrzesień 16, 2007, 17:25:00
Przesuwam o odległość do kolizji, odjąć drobny dystans( np. t = t * 0.999f).
Masz punkt styku... i nowy wektor... czyli długość wektora "velocity" odjąć t, zrzutowane na płaszczyznę.
Jeśli ta długość jest dłuższa od jakiegoś minimum, to test powtarzasz z tymi nowymi danymi.

Offline Moriturius

  • Użytkownik

# Wrzesień 16, 2007, 19:10:45
ja u siebie mam tak, ze cofam okrag o tyle o ile nachodzi na sciane nie mam problemow zadnych ze skakaniem

RageX

  • Gość
# Wrzesień 16, 2007, 19:17:23
Moriturius: ale doslownie cofasz ten okrag? Bo wowczas po prostu gdy taki orkag najedzie na sciane i sie z nia zdarzy to sie zatrzyma. Duzo lepiej jest, gdy sie "osuwa" o sciane i wtedy zamiast go tak "bezczelnie" cofac, lepiej jest go przesunac wzdluz wektora normalnego sciany

Offline _MtZ_

  • Użytkownik

# Wrzesień 16, 2007, 19:31:45
Tak się składa, że przykładowy rozdział książki "Java. Tworzenie gier." dotyczy właśnie problemu wykrywania i obsługi kolizji. Tam wszystkie podstawy są ładnie wytłumaczone (A tak swoją drogą to nie wiem, czy to dobrze świadzczy o dystrybutorze tej książki, skoro udostępnia on za free najciekawszy, najtrudniejszy i najbardziej uniwersalny jej rozdział :) )

ftp://ftp.helion.pl/online/javtwg/javtwg-11.pdf

Pozdrawiam,
_MtZ_

RageX

  • Gość
# Wrzesień 16, 2007, 21:10:20
mhihih... ja od heliona już wsyztskie przykłądowe rozdziały "chyba" zgrałem. Ale i tak uważam że to dobrze o nich świadczy.

Offline _MtZ_

  • Użytkownik

# Wrzesień 16, 2007, 22:27:48
Zauważ, że nie chodziło mi konkretnie o Helion. Inne księgarnie też udostępniają ten rozdział za free. Może określenie "dystrybutor" nie było najszczęśliwsze. W każdym razie chodziło mi ten podmiot, który zdecydował, że to rozdział o kolizjach będzie darmowy :)

Offline Kwazar

  • Użytkownik

# Wrzesień 17, 2007, 19:12:38
Jednak chyba response mam ok i wygląda na to, że wykrywanie kolizji szfankuje  :-\

Gdy stykam sie z jedną ścianą jest ok :



Jednak gdy dotykam 2 ścian naraz, nie wykrywa mi kolizji z jedną ścianą:




Aż do pewnego momentu kiedy sfera nie styka mi sie z podłoga i wykryje mi kolizje z ścianą i cofa mi sie w jednej klatce do właściwego momentu i gdy nadal wchodze w ściane wszystko sie powtarza stąd te drgania.

Chyba nawet wiem dlaczego tak się dzieje( jednak nie jestem w stanie rozwiazać tego problemu ).

Napisze jeszcze troche o moim wykrywaniu kolizji:
- Zapisuje na początku funkcji do sterowania kamera jej pozycję do zmiennej PosBefore
- Sprawdzam kolizje na podstawie zmiennej PosBefore i aktualnej pozycji
- jeżeli jest kolizja to wypycham sfere i zmieniam aktualna pozycje kamery

Nie wykrywa mi kolizji tej drugiej ściany ponieważ response podłogi "niszczy" pozycje kamery, niby poruszam sie do przodu, ale kolizja zamienia ten ruch na ruch tylko w osi Y( góre- dół ) przez co nie wykrywa kolizji drugiej ściany.

Wie ktoś może jak rozwiązać ten problem?

RageX

  • Gość
# Wrzesień 17, 2007, 22:28:18
Nie rozumiem co robisz, że ci zmienia jakichś kierunek ruchu na oś y... ale kolizje zawsze prowadzisz z najbliższą (po t) płaszczyzną.

Hmm... czy w ogóle zrozumiałeś co ci wcześniej napisałem?
Mechanizm u mnie(w zasadzie teraz to tylko na papierze, zajmuje się czym innym w tej chwili) wygląda tak...
Sprawdzasz naszą sferę z wszystkimi trójkątami (myślałem nad optymizowaniem testów krawędzi, ale spełzło na niczym więc... mniejsza z tym) przy czym rejestrujesz wszystkie t z testów. Bierzesz te najkrótsze t. I przesuwasz o tyle sfere (* 0.999f). Długość t odejmujesz od wektora veloPos(u mnie tak sie zwie ten wektor przesunięcia co tick). Pozostały wektor rzutujesz na płaszczyznę. Masz nowe veloPos (czyli teraz poruszasz się po płaszczyźnie). Prowadzisz ponowny test. I tak do momentu aż uznasz że testów jest za dużo... np. 4, bądź do momentu, aż długość naszego veloPos będzie mniejsza od np. 0.001f, w takim wypadku nasz veloPos zerujemy.
Przy dobrze rozpisanym teście... nie możliwe jest, żeby cokolwiek się kaszaniło...
Tak na wszelki wypadek... ja ciągle nawijam o swept sferze.

Offline ziomber

  • Użytkownik

  • Zbanowany
# Wrzesień 21, 2007, 22:37:03
Cytuj
rejestrujesz wszystkie t z testów. Bierzesz te najkrótsze t. I przesuwasz o tyle sfere (* 0.999f).

Co to jest t?

Cytuj
Długość t odejmujesz od wektora veloPos(u mnie tak sie zwie ten wektor przesunięcia co tick). Pozostały wektor rzutujesz na płaszczyznę.

Co to jest veloPos niby wektor o ktory chcesz przesunac sfere = wynik kolizji dla jednej sciany czy nie?

I co z tym rzutowaniem chodzi o to zeby sfera sie slizgala czy nie? bo w niektorych przypadkach mozna to pominac

Masz nowe veloPos (czyli teraz poruszasz się po płaszczyźnie)
Prowadzisz ponowny test. I tak do momentu aż uznasz że testów jest za dużo... np. 4,
Cytuj
bądź do momentu, aż długość naszego veloPos będzie mniejsza od np. 0.001f, w takim wypadku nasz veloPos zerujemy.


A niby jak wyznaczasz veloPOS