Autor Wątek: Detekcja Kolizji - 2 układy współrzędnych  (Przeczytany 2034 razy)

Offline jojek

  • Użytkownik

# Styczeń 29, 2010, 01:14:18
Witam Was, OpenGl jest dla mnie nowością, zgłębiam jego tajniki od tygodnia, muszę napisać grę w OPENGL na zaliczenie przedmiotu na studiach :)

Gra polega na tym, że jeździmy sobie czołgiem po planszy, obracamy wieżyczką, strzelamy i siejemy zniszczenie :P
Utknąłem jednak w pewnym punkcie, ale od początku:

Dokonuję pewnych translacji i rotacji względem poczatku ukladu wsp (1), po tych translacjach rysuję czołg, robię glLoadIdentity(), tym samym ustawiając nowy poczatek ukladu wsp (2), rysuję wieżyczkę, wiezyczka obracam, podnosze lufe i strzelam, pocisk sobie leci ... i mam problem :)

Chcę zrobić detekcję kolizji obliczajac odleglosc pomiędzy poczatkiem ukladu wsp (1) a pociskiem, problem w tym ze pocisk leci od ukladu wsp nr (2)

Czy jest jakiś sposób, aby wyliczyć współrzędne pocisku względem układu nr (1) ?

Serdecznie prosze o pomoc ! w poniedziałek muszę oddać projekt ...

Offline Mr. Spam

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

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Styczeń 29, 2010, 01:31:57
Przecież wiesz gdzie jest układ nr 1 i układ nr 2, więc jaki problem obliczyć różnicę tych współrzędnych?

BTW. zamiast LoadIdentity używaj glPushMatrix(), glPopMatrix().

Offline jojek

  • Użytkownik

# Styczeń 29, 2010, 02:16:22
Problem tym ze drugi układ obracam po Y (obrót wiezyczki) i po Z (lufa - wtedy oś X reprezentuje lufę czołgu) odyby tych obrotów nie było, to fakt, zadanie proste, wstarczy odjac wektory.
Zobrazuję:


na czarno uklad (1) pierwotny
na zielono układ (2) obrócony glRotate() w osi Y i Z
cienkie czerwone linie to przesunięcia o jakiś wektor
na oliwkowo odległość którą wyliczam prostym wzorem
na pomaranczowo odległość którą chcę wyliczyć

Offline Nephrite

  • Użytkownik

# Styczeń 29, 2010, 10:48:58
Od (0,0,0) czarnego układu do (0,0,0) zielonego układu masz jeden wektor. Od (0,0,0) zielonego układu do pocisku masz drugi wektor a pomarańczowy wektor jest jak w mordę strzelił suma dwóch powyższych.

Offline jojek

  • Użytkownik

# Styczeń 29, 2010, 11:28:25
Było by to prawdą gdybym nie obracał zielonego układu wzdłuż 2 osi, po tych obrotach NIE jest to " jak w mordę strzelił suma dwóch powyższych."

Offline Liosan

  • Redaktor

# Styczeń 29, 2010, 11:54:26
No pewnie, że nie jest.

...Od (0,0,0) zielonego układu do pocisku masz drugi wektor...
... tylko że w innym układzie odniesienia niż pierwszy.

@jojek: Jak tam Twój poziom matematyki? Macierz obrotu dasz radę zapisać ? :) Taką "własną", we własnym kodzie, nie opengl-owo... to chyba najprostszy sposób obliczenia tego co potrzebujesz.

Liosan

Offline jojek

  • Użytkownik

# Styczeń 29, 2010, 12:13:43
nie jest tragicznie z tą matematyką :)

Swoją drogą właśnie dowiedziałem się jakie jest potencjalne rozwiązanie mojego problemu: notacja Denavita Hartenberga, pojęcie zaczerpnięte z robotyki. Całość to operacje na macierzach :|

Biorę się do myślenia i pisania, jeśli zadziała, dam znać, gdyby ktoś miał problem podobny

Offline Liosan

  • Redaktor

# Styczeń 29, 2010, 12:26:34
e... to brzmi jak przerost formy nad treścią. Potrzebujesz dwóch rzeczy:

- Znaleźć macierz M przekształcenia pomiędzy układem zielonym a czarnym (nie od czarnego do zielonego); będzie to złożenie macierzy obrotu i przesunięcia (w odpowiedniej kolejności)
- Wymnożyć wektor żółty Ż przez M

Obliczenie macierzy obrotu znając kąty jest proste, macierzy przesunięcia znając odległość - również. Mnożenie macierzy przez macierz i wektor - również do znalezienia w necie :)

Liosan

Offline Kuba D.

  • Użytkownik

# Styczeń 29, 2010, 12:51:34
Najprościej jest przenieść układ współrzędnych(2) pocisku do układu współrzędnych (1). I będziesz miał współrzędne pocisku w układzie współrzędnych (1) co pozwoli na proste obliczenie kolizji pocisku z dowolnym obiektem w układzie wsp (1).

Offline Avaj

  • Użytkownik

# Styczeń 29, 2010, 14:23:07
nie jest tragicznie z tą matematyką :)

Swoją drogą właśnie dowiedziałem się jakie jest potencjalne rozwiązanie mojego problemu: notacja Denavita Hartenberga, pojęcie zaczerpnięte z robotyki. Całość to operacje na macierzach :|

Biorę się do myślenia i pisania, jeśli zadziała, dam znać, gdyby ktoś miał problem podobny
Poczytałem trochę o tej notacji i w sumie to są podobne klimaty. Chcąc nie chcąc, OpenGL pod maską składa macierze, przynajmniej dwie.

Toporne rozwiązanie, ale działające byłoby takie - policzyć macierz odwrotną układu (2), wymnożyć współrzędne obiektu przez tą macierz, a potem wymnożyć ją przez macierz układy (1), wtedy obydwa powinny być w tym samym układzie współrzędnych