Warsztat - Programowanie gier

Lipiec 30, 2010, 17:38:21 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Detekcja Kolizji - 2 układy współrzędnych  (Przeczytany 739 razy)
jojek
Newbie
*

wiadomości: 4


Zobacz profil
« : Styczeń 29, 2010, 02: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 Smiley

Gra polega na tym, że jeździmy sobie czołgiem po planszy, obracamy wieżyczką, strzelamy i siejemy zniszczenie Tongue
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 Smiley

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 ...
Zapisane
JasonVoorhees
Full Member
***

wiadomości: 182


Avatar


Zobacz profil WWW
« Odpowiedz #1 : Styczeń 29, 2010, 02: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().
Zapisane

www.jason.o12.pl - Jason Homepage
jojek
Newbie
*

wiadomości: 4


Zobacz profil
« Odpowiedz #2 : Styczeń 29, 2010, 03: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ć
Zapisane
Nephrite
Newbie
*

wiadomości: 40



Zobacz profil
« Odpowiedz #3 : Styczeń 29, 2010, 11: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.
Zapisane
jojek
Newbie
*

wiadomości: 4


Zobacz profil
« Odpowiedz #4 : Styczeń 29, 2010, 12: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."
Zapisane
Liosan
SuperHero Member
******

wiadomości: 1426



Zobacz profil
« Odpowiedz #5 : Styczeń 29, 2010, 12: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ć ? Smiley Taką "własną", we własnym kodzie, nie opengl-owo... to chyba najprostszy sposób obliczenia tego co potrzebujesz.

Liosan
Zapisane

Cytuj z: toxic
w ich zylach plynie praslowianska krew - oni musza wiedziec jak sie robi software
Demo WG RC1!
jojek
Newbie
*

wiadomości: 4


Zobacz profil
« Odpowiedz #6 : Styczeń 29, 2010, 13:13:43 »

nie jest tragicznie z tą matematyką Smiley

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
Zapisane
Liosan
SuperHero Member
******

wiadomości: 1426



Zobacz profil
« Odpowiedz #7 : Styczeń 29, 2010, 13: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 Smiley

Liosan
Zapisane

Cytuj z: toxic
w ich zylach plynie praslowianska krew - oni musza wiedziec jak sie robi software
Demo WG RC1!
Kuba D.
Hero Member
*****

wiadomości: 978


Zobacz profil
« Odpowiedz #8 : Styczeń 29, 2010, 13: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).
Zapisane
Java
SuperHero Member
******

wiadomości: 1908


Kwaternion zagłady


Zobacz profil
« Odpowiedz #9 : Styczeń 29, 2010, 15:23:07 »

nie jest tragicznie z tą matematyką Smiley

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
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC