Autor Wątek: [java, opengl] jak odkryć na jaki obiekt patrzy gracz?  (Przeczytany 4097 razy)

Offline DarkPeter

  • Użytkownik

# Sierpień 19, 2011, 13:54:18
Witam,
mam pewien problem. Polecono mi to forum, mam nadzieję że tutaj odpowiedź na moje pytanie wreszcie znajde :) Aha, mam nadzieję, że to dobry dział. Jeżeli nie, proszę o przeniesienie gdyż na tym forum bywam bardzo rzadko.
Tworzę grę FPS (widok pierwszoosobowy. Coś jak strzelanka). Zrobiłem już program tworzący mapę i takie tam pierdy. Przydałoby się teraz dołożyć możliwość strzelania Tylko tu pojawia się problem. Jak zgadnąć w co na chwilę obecną celuje gracz? Jak znaleźć ten obiekt co ma niby być trafiony? jast na to jakiś sprawdzony sposób?
Z góry dzięki za odpowiedzi!

Offline Mr. Spam

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

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 19, 2011, 13:59:24
Typowe bronie w FPS-ach działają zwykle na jeden z dwóch sposobów:

- projectile - w momencie strzału tworzony jest nowy obiekt "pocisk" z jakąś (skończoną, dużą lub małą) prędkością, który jest następnie symulowany przez fizykę w kolejnych klatkach, dopóki w coś nie trafi (kolizje są dla niego zwyczajnie liczone co klatkę)
- hitscan - obiektu się nie tworzy; w momencie strzału natychmiast sprawdzasz kolizję promienia (z broni w kierunku strzału) z planszą oraz obiektami.

W takim Quake 3 machine gun, shotgun i rail (i chyba gauntlet) są zrobione jako Hitscan, pozostałe jako projectile.

W FPS-ach wojennych bywa różnie - hitscan jest najprostszy, ale bardzo realistyczne shootery tworzą obiekt dla każdego wystrzelonego naboju i polegają na silniku fizycznym do wyznaczania kolizji (bo to jest ciut nietrywialne przy obiektach lecących z prędkością rzędu prędkości dźwięku) :).

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Sierpień 19, 2011, 14:02:50
Sprawdzony sposob to chyba wykrywanie kolizji. Jak jest jakis maly pocisk, to mozesz sprawdzac czy jego srodek znajduje sie wewnatrz bounding boxa otaczajacego obiekt, do ktorego strzelasz. Nie musisz z gory wiedziec, czy obiekt zostanie trafiony. W koncu kula bedzie leciala przez kilka klatek :) kolizje sprawdzasz przesuwajac pocisk o mniejsze odstepy niz to widac na klatkach. Np. na jedna klatke przesuwasz kulke 10 razy sprawdzajac kolizje, bo kula za szybko leci i moze nie znalezc sie wewnatrz bounding box'a.

Offline DarkPeter

  • Użytkownik

# Sierpień 19, 2011, 14:23:51
A czy w ten sam sposób tworzy się "wskazywanie obiektu" typu sześcian (dla przykładu "stawianie klocków w minecrafcie?"). Dokładnie stworzyłem sobie też bombę o kształcie sześcianu. Chciałbym żeby można było ją zdetonować klikając na nią. Tutaj chodzi mi o jak najszybszy i naprostszy sposób, żeby nie spowalniać gry jakimiś zbędnymi obliczeniami.
PS: Nie spodziewałem się tu tak szybkiej odpowiedzi xD


Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 20, 2011, 16:14:17
A czy w ten sam sposób tworzy się "wskazywanie obiektu" typu sześcian (dla przykładu "stawianie klocków w minecrafcie?").

Nie. :)

Zagadnienie "wybieranie obiektu w grze na podstawie klikniętego myszką piksela na ekranie" to bardzo standardowa rzecz, która nazywa się "picking" - oto Twoje hasło do googla na dziś.

Strzelanie w FPS-ach dałoby się teoretycznie zrobić tą techniką... ale ostatnia gra, w której widziałem to zrealizowane w taki sposób, to http://i.imgur.com/dMRfS.jpg :P

Znam 3 współczesne metody pickingu:
- obliczeniowy,
- graficzny po kolorze,
- graficzny przez occlusion query

Był o tym nie dalej jak tydzień temu wątek na forum... Trzeba to dopisać do FAQ. :)

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 20, 2011, 16:36:55

Offline DarkPeter

  • Użytkownik

# Sierpień 22, 2011, 14:35:03
Zrobiłem sobie krótką przerwę i wracam do kodu :P
No więc czytam te wszystkie instrukcje, lecz nadal nic mi to nie dało.
Co do metod pickingu najbardziej odpowiada mi matoda obliczeniowa. Niestety nie wiem jak to zrobić :/ Moglibyście rozjaśnić mi na czym polegała by taka metoda obliczeniowa?

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 22, 2011, 14:39:10
Google: ray sphere collison, ray trimesh collision
(albo intersection zamiast collision)

Offline James

  • Użytkownik

# Sierpień 22, 2011, 14:56:04
Jak musiałem na szybko napisać picking to zrobiłem to po kolorze, pewnie nie było optymalne, ale jak potrzebujesz czegoś na szybko to chyba jest najprostsze :)

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 22, 2011, 15:01:09
Najprostsze jest chyba po occlusion query.

Offline DarkPeter

  • Użytkownik

# Sierpień 22, 2011, 15:11:06
Najprostsze jest chyba po occlusion query.
A na czym to polega?

Offline Timati

  • Użytkownik

# Sierpień 22, 2011, 15:11:45
Ja polecam line of sight. Prowadzisz linie od środka ekranu czy skąś o n-długosci od gracza. Linia wyszukuje kolizje a po nich masz obiekty. Prosta i dobra metoda.
http://www.alpix.com/3d/worldwin/WWJ/LineOfSight.java.txt
« Ostatnia zmiana: Sierpień 22, 2011, 15:14:11 wysłana przez Timati »

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 22, 2011, 15:13:37
@DarkPeter

Po narysowaniu sceny:
- Robisz tak jak przy colour pickingu scissor na 1 piksel na ekranie,
- Włączasz occlusion query, ustawiasz z-test na equal,
- Rysujesz po kolei obiekty i po każdym sprawdzasz, czy query się zwiększył. Jeśli się zwiększył, to ten. :)

Offline DarkPeter

  • Użytkownik

# Sierpień 22, 2011, 15:14:27
Chodzi mi bardziej o jak najprostsze zrobienie czegoś takiego.
Wydaje mi się że po kolorze jest najprostsze. Po prostu odczytujesz kolor i tyle :P (po wcześniejszym przypisaniu obiektom kolorów)

@UP: przepraszam że tak męczę, ale nie jestem zbyt zaawansowany jeszcze w opengl'u. Nie kumam pewnych pojęć:
ustawiasz z-test na equal
tak jak przy colour pickingu scissor na 1 piksel na ekranie,
« Ostatnia zmiana: Sierpień 22, 2011, 15:16:32 wysłana przez DarkPeter »