Jak symuluje się pociski w grach wideo?

86

Ostatnio gram w gry takie jak MW2 i jako programista często zadaję sobie pytanie, w jaki sposób sprawiają, że gra jest tak wciągająca. Na przykład, jak symulować prędkość pocisku.

  1. Kiedy NPC wystrzeliwuje pocisk z pistoletu, czy pocisk naprawdę przemieszcza się z pistoletu do danego celu, czy też całkowicie ignorują tę część i po prostu umieszczają dziurę po kuli na celu?

  2. Jeśli kula naprawdę leci od pistoletu do celu, z jaką prędkością faktycznie leci?

mahen23
źródło
25
Krwawy ekran, taki prawdziwy!
AttackingHobo
6
strzela : BOOOOORRRIIIING
mahen23
1
Nie jestem pewien, czy możesz nazwać pociski Megaman Legend pociskiem, ale w Megaman używają powolnych pocisków do pocisku. W nich wyraźnie widać zakrzywione strzały, jeśli podczas strzelania biegniesz w kółko (efekt coriolisa).
Lie Ryan

Odpowiedzi:

84

Większość gier FPS wykorzystuje raycasting do rzeczywistej rozgrywki; pociski natychmiast podróżują i trafiają w cel po wystrzeleniu.

Ale większość gier wykorzystuje również „fałszywe” znaczniki. Co 3 strzały lub jakiś inny interwał, wraz z kulą zostanie wystrzelony znacznik, znacznik będzie naprawdę szybki, ale nie natychmiastowy. Odbywa się to wyłącznie jako efekt wizualny i nie wpływa bezpośrednio na rozgrywkę, ale pomaga dawać wskazówki strzelającemu, strzelającemu i daje osobom postronnym kierunkowe odniesienie do wystrzałów.

Większość gier wykorzystujących tego rodzaju fizykę pocisków jest nierealistyczna, ponieważ nie ma rykoszetów, fragmentów pocisków, a jeśli występuje jakakolwiek penetracja, jest ona zazwyczaj liniowa.

Niektóre gry, takie jak ARMA II, STALKER (cała seria) wykorzystują bardziej realistyczną fizykę pocisków z czasem podróży, rykoszetami i penetracją z kątami odchylenia. Wierzę, że te systemy używają raycastingu, ale z limitem, który jest określony przez prędkość pocisku. W tych grach prędkość wylotowa może być realistyczna jak w ARMA II lub wygląda tak jak w STALKER.

Wolę mieć realistyczną fizykę pocisków, ponieważ pistolety strzelają pociskami, a nie laserami.

AttackingHobo
źródło
1
Nie grając w żadną z wymienionych gier, jak wpływa to na rozgrywkę? Mam na myśli, że jeśli zastosujesz fizykę pocisków w grach takich jak Call of Duty, czy naprawdę widzisz zauważalną różnicę? Czy kąty penetracji zmieniają grę? Czy gracze zdadzą sobie nawet sprawę, że ich postać nie pokrywa się z dziurą po kuli w stosunku do strzelca? Ciekawe, jakie korzyści ma uzasadnienie narzutu. Z góry dziękuję.
Dutchie432
Dodaje to mechaniki strzelania warstwę nieprzewidywalności i głębi, która sprawia mi przyjemność. Pociski nie są natychmiastowe !!! chuckhawks.com/rifle_ballistics_table.htm Ślimak jadący z prędkością 2644 stóp na sekundę przez 600 stóp zajmuje ponad 2 sekundy, by trafić w cel, nie licząc dodatkowego spowolnienia. Bieżący cel zostałby pominięty, gdybyś celował bezpośrednio w niego. Dalsza odległość pozwoliłaby ślimakowi poruszać się wolniej niż prędkość dźwięku, pozwalając ludziom skoczyć na ziemię lub inną, jeśli usłyszą strzał.
AttackingHobo
W tej odpowiedzi zawarto kilka niedokładnych stwierdzeń i należy je usunąć. Sprawdź moją odpowiedź poniżej.
EddieV223
1
Pociski w ArmA 2 są symulowanymi pociskami; mogą być modyfikowane (zmiana prędkości, zmiana kierunku) w trakcie lotu i zderzają się z obiektami podczas podróży. Niezależnie od tego, czy odbywa się to za pomocą odlewania promieniowego, czy nie, nie mają one znaczenia, działają jak prawdziwe obiekty fizyki.
spowolniłaviar
więc mw2? raycasting czy nie? Ponieważ wyraźnie wykonują świetną robotę, symulując dziury po kulach i niszcząc środowiska przez nią
mahen23
51

W przypadku pocisków na ogół nie przeszkadzają w symulacji pocisku faktycznie przemieszczającego się w powietrzu i po prostu umieszczają dziurę po pocisku w momencie jego wystrzelenia. Inne rzeczy, takie jak rakiety, działają wolniej *, a gra pokazuje, jak podróżują w powietrzu.

Na krótkich dystansach pociski będą się przemieszczać, wraz z upływem czasu między klatkami, i tak dostaną się od strzelającego do celu między 1 klatką lub w jej obrębie.

* To znaczy, wolniej niż rakiety w prawdziwym życiu, aby gracz mógł zobaczyć, jak lecą w powietrzu.

jhocking
źródło
44

Napisałem kod kuli do PlanetSide. Mieliśmy kilka pocisków „hitcan”, ale głównie symulowaliśmy pociski najlepiej, jak mogliśmy, biorąc pod uwagę ograniczenia procesora i ogromną liczbę pocisków w grze w dowolnym momencie.

W przypadku hitcan, wpływ jest określany w tej samej ramce, w której odbierany jest sygnał wejściowy, często za pomocą pojedynczego raycasta. Jest to odpowiednie w przypadku broni, takiej jak lasery lub inne wyjątkowo szybkie pociski. Zrobiliśmy hitcan, po prostu podkręcając początkową prędkość pocisku tak wysoko, że przeszedłby on przez planszę jednym tikiem.

Pociski bez trafienia są zaznaczane albo do czasu klatki graficznej, albo do określonego czasu, z zastosowanymi obliczeniami przyspieszenia (rakiety), grawitacji, tarcia powietrznego, naprowadzania (pociski szukające ciepła) itp. Celem jest wygenerowanie pozycji końcowej pocisku na czas. Po ustaleniu punktu początkowego i końcowego można użyć jednego lub więcej promieni, aby przybliżyć trasę lotu i wykryć wszelkie kolizje, które miałyby miejsce podczas lotu.

Zarówno w przypadku pocisków hitcan, jak i pocisków innych niż hitcan, to, co dzieje się podczas kolizji, zależy od właściwości pocisku i powierzchni, na którą uderzamy. Na przykład możesz uderzyć w twardą powierzchnię, w którym to przypadku możesz sprawdzić liczbę odrzuceń i albo dostosować pozycję i prędkość na odbicie, albo zdetonować pocisk, jeśli osiągniesz maksymalną liczbę odrzuceń. W tym systemie rakieta ma maksymalną liczbę odrzuceń równą 0. Możesz uderzyć w miękką powierzchnię, a następnie sprawdzić swoją siłę penetracji, aby ustalić, czy pocisk powinien przejść przez materiał itp.

Pisanie kodu było zabawne. Ponadto bardzo przydatne jest napisanie dobrej wizualizacji debugowania tego, co się dzieje, aby można było wizualnie sprawdzić ścieżki lotu, zdarzenia itp.

Don Neufeld
źródło
2
Grałem w Planetside, zanim zacząłem programować fajną grę, i to brzmi tak, że kodowanie byłoby fajne.
Anthony
18

To zależy od gry i poziomu dokładności / realizmu.

Synchronizacja modeli strzelania i obrażeń w ustawieniach trybu wieloosobowego jest dość trudna, ponieważ musisz dokładnie określić, gdzie i kiedy została wystrzelona kula, czy trafiła w cel i czy coś innego przeszło przez ścieżkę.

Dlatego podejrzewam, że jeśli to możliwe, projektanci gier upraszczają wszystko, traktując niektóre ujęcia jako natychmiastowe (tak, że trzeba tylko rozważyć lokalizację wszystkich osób w jednym momencie), lub ograniczając zasięg pocisku. Na szczęście często odpowiada to fizyce z prawdziwego życia. Na przykład karabiny snajperskie wystrzeliwują pociski o dużej prędkości.

Wiele gier może symulować wieloetapową ścieżkę z wieloma migawkami wolno poruszających się obiektów (takich jak artyleria, bomby, pociski markerów itp.), Ale jest to bardzo kosztowne, a problemy z synchronizacją są częstsze, co prowadzi do śmiesznych filmów z YouTube'a.

Kolejny problem dotyczy gier, które utrzymują osobne mniejsze „środowiska” (np. Każdy pokój jest symulowany osobno), aby stworzyć iluzję większej przestrzeni. W takich przypadkach rzeczy w granicach „pokoju” mogą być poprawnie symulowane, aby wszyscy w pokoju byli informowani o serii przejść w przestrzeni, które wykonuje kula, ale inni poza tym środowiskiem nie są.


źródło
14

W przypadku pocisków, które poruszają się szybciej niż oko, często stosuje się raycasting - promień wylotowy jest obliczany we właściwym kierunku i testowany na potencjalnych obiektach docelowych w celu ustalenia, co zostało trafione. Może to być skomplikowane z wieloma promieniami i dodatkowymi obliczeniami, jeśli chcesz symulować rzeczy takie jak upuszczanie pocisków i tym podobne. Możesz także przyspieszyć projekty i wykorzystać to, aby dodać dodatkowy realizm do obliczeń (aby pociski nie były natychmiastowe).

Josh
źródło
11

Zależy to od implementacji, ale wiem, że Silnik Źródłowy wcale nie używał kul fizycznych (obiektów pociskowych), po prostu wykonał promień rzucany przez gracza na cel losowym okręgiem „strefy trafienia” (większy lub mniejszy promień zależał od jak szybko wystrzeliła broń i jeśli gracz przytrzymał przycisk strzału), którego środkiem był punkt, na który celował gracz, a następnie po określeniu rzeczywistego rzutu promienia z gracza na losowo określony punkt i w zależności od innych czynników (takich jak „waga” pocisku i prędkość wylotowa (wszystkie liczby wewnętrzne), trafienie obiektu itp.) promień został rzucony przez wiele przedmiotów lub do momentu uderzenia w teren.

Z drugiej strony, Torque 3D Engine DID wykorzystuje rzeczywiste obiekty pocisków, a projektant może wpływać na ich indywidualne modyfikatory prędkości, masy i grawitacji. Wszystko, co zrobił silnik, to aktualizowanie wartości co 32 milisekundy.

EDYTOWAĆ

Oprócz użycia obiektów pociskowych, Torque 3D Engine pozwolił również na użycie rzutów promieniujących jako alternatywy. (Stworzyłem kilka gier, w których „pocisk” jest tak naprawdę efektem cząsteczkowym, który nie ma żadnego wsparcia ze strony obiektów pociskowych, więc wymagany był rzut promieniami.)

Casey
źródło
niesamowita historia, stary. jestem jednak pewien, że silnik Torque 3D wymagał większej mocy obliczeniowej, aby obliczyć całą fizykę.
mahen23
@ mahen23 Byłbyś zaskoczony. Miał mniej obliczeń fizycznych niż silnik źródłowy, częściowo dlatego, że w ogóle nie radził sobie z kolizjami Softbody, a jedynie z prostymi obwiedniami i kolizjami.
Casey
10

Na stronie Team Fortress 2 jest całkiem fajny opis zachowania ich pocisków i broni trafiającej.

http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection

lunixbochs
źródło
2
Ta wiki to dobra lektura.
mgiuca
Chociaż ta sekcja jest krótka, wyjaśnia zarówno hitcan vs. non-hitcan oraz wyjaśnia, czym są hitboksy i jak są używane.
jhocking
pamiętaj, aby przeczytać pod artykuły „Projekcja” i „Hitscan” bezpośrednio pod tytułem tej sekcji
lunixbochs,
5

W rzeczywistości wiele gier wykorzystuje algorytm testu trafień renderujących GPU. Oto podstawowy sposób działania:

1) Poza ekranem utwórz renderowanie bieżącego widoku, w którym cały teren jest czarny, a każda postać ma kolor inny niż czarny 2) Uzyskaj kolor piksela pod celownikiem 3) Jeśli to nie jest czarne, sprawdź kolor - > mapowanie graczy i zastosowanie trafienia w ten cel.

Ta metoda jest stosowana od lat w grach, głównie dlatego, że jest idealna pod względem pikseli. Jeśli zza ściany wystaje pojedynczy piksel kapelusza gracza, możesz go trafić. IE, jeśli możesz to zobaczyć, możesz trafić. Tego rodzaju precyzja jest prawie niemożliwa w przypadku prostych technik odlewania promieniowego. Po drugie, ten rodzaj testu jest niezwykle szybki i można go przeprowadzić na GPU.

Timothy Baldridge
źródło
Wyszukiwanie koloru -> brzmi bolesnie? Gdybyś go rzucił, czy nie byłaby to taka sama wydajność?
spowolniony,
W rzeczywistości jest niezwykle szybki. Większość czasu poświęcanego na renderowanie pochodzi z cieniowania rzeczywistych wielokątów. W przypadku renderowania testu trafień używane są tylko jednokolorowe wielokąty. Ponadto ten test trafienia można wykonać całkowicie w procesorze graficznym i jest on idealny pod względem pikseli. Nic nie odstrasza gracza bardziej niż idealne trafienie w cel, a następnie sprawdzenie, czy trafienie go nie trafiło.
Timothy Baldridge,
Ale jak przekonwertować przestrzeń pikseli na przestrzeń świata na odpowiadający ci obiekt, który trafisz.
spowolniony,
@Daniel: Jak mówi odpowiedź, trafiony cel identyfikowany jest kolorem. Każda postać jest renderowana jako inny (jednolity) kolor, więc możesz po prostu sprawdzić kolor i czarny = chybić, wszystko inne = sprawdzić, kto został renderowany w tym kolorze, ponieważ został trafiony.
Dave Sherohman,
@Dave Sherohman, musiałem to początkowo źle odczytać, po przeczytaniu twojego wyjaśnienia wydawało się to jasne, co miał na myśli ... wiwaty
spowolniłem
4

Niektóre gry bez wątpienia wykorzystują realistyczną fizykę pocisków, biorąc pod uwagę czas podróży pocisku i spadek, ale domyślam się, że większość gier tego nie robi, przynajmniej dla NPC.

W przypadku gry, która natychmiastowo przesuwa pocisk (bez upuszczenia), gra śledzi wyimaginowaną linię (wektor) od punktu lufy do przodu. Następnie oblicza, z czym przecina się ta linia, i rejestruje „trafienie” pocisku w tym momencie. Może to być stały obiekt, taki jak ściana, na której uderzenie wyzwala taki efekt, jak naklejka na pocisk i „kłębek” dymu / gruzu. Może uderzyć w obiekt łamliwy, powodując jego pęknięcie, lub może uderzyć obiekt fizyczny i dać mu „kopniak”. Lub oczywiście może trafić gracza lub innego NPC i spowodować obrażenia zdrowia. Symulacje twardego rdzenia modelują pocisk przebijający się przez ściany i wywołują efekt trafienia po stronie wyjścia, prawdopodobnie zmniejszając obrażenia pocisku po wyjściu.

Tylko dlatego, że NPC nie mają idealnego celu, wiele gier dodaje do wektora pewną randomizację, aby modelować rozrzut pocisków. To jest to, co zobaczysz w prawdziwym życiu, gdzie pociski nie wszystkie trafiają tylko tam, gdzie celujesz, ale we wzór skupiony wokół miejsca celowania.

Aby zwizualizować rozrzut pocisku, wyobraź sobie stożek wychodzący z pistoletu zamiast linii prostej (wektor). Rzeczywisty kierunek pocisku jest losowy, aby znajdował się gdzieś w tym stożku. Jeśli strzelec jest naprawdę blisko celu, rozpiętość jest niewielka, a celność wysoka. Jeśli cel jest daleko, stożek zwiększa rozproszenie, więc strzelec ma mniejsze szanse na trafienie w cel.

Tę ideę stożka strzału można wykorzystać do modelowania dokładności strzelca (umiejętności), dokładności broni i innych warunków. Na przykład NPC niskiego poziomu może otrzymać stożek strzału o niskiej dokładności, podczas gdy wysoko wykwalifikowany NPC miałby wysoką dokładność poziomu. Gracz biegający z pistoletu maszynowego strzelającego z biodra miałby szeroki stożek strzału, który zmniejszyłby się, gdyby przestał biec lub celować. Karabiny snajperskie miałyby z natury ściślejsze szyszki niż pistolet.

Tim Holt
źródło
+1 dobra informacja. Ale wydaje mi się, że wizualnie może być bardziej przyjemne, jeśli sztuczna inteligencja faktycznie źle celuje w gracza, a nie większy stożek. Lub jeśli chcesz powiększyć stożek, ustaw zmienną wielkość w oparciu o odrzut i daj wrogom niższego poziomu szybszy przyrost wielkości, aby po prostu wydawali się niedoświadczeni.
AttackingHobo
1

Mówiąc o kodzie źródłowym Nexuiz od czasu, gdy spojrzałem, tak naprawdę nie wysłali obiektu „pocisku” z punktu A do punktu B. Jeśli dobrze pamiętam, a jest to specyficzne tylko dla niektórych broni - inne bronie nie są ” Gdy broń wystrzeliwuje natychmiast, trafia, kod pokazuje, gdzie celuje broń. Jeśli celujesz w osobę (i jest bronią natychmiastowego trafienia), kiedy klikniesz „strzelaj”, to wykonałeś trafienie.

Warto również zauważyć, w jaki sposób Nexuiz miał opcję obliczania trafień na kliencie lub serwerze po stronie serwera. Jeśli podejrzewasz, że klienci oszukują, możesz przełączyć się na obliczenia trafień po stronie serwera, próbując to złagodzić.

Jeff Welling
źródło
1

Inna strategia to hybryda renderowania wszystkiego i ray tracingu wszystkiego. Nie musisz koniecznie renderować każdej kuli. Na przykład, jeśli twój pistolet strzela 30 pocisków / sekundę, strafe może wygenerować kilkaset cząstek ... możesz zmniejszyć rendering za pomocą „efektu znacznika”, renderować co trzeci strzał, prześledzić pozostałe dwa. Gracz nadal widzi 10 pocisków na sekundę strzelających do wroga.

Dostosuj do swojej konkretnej sytuacji, renderuj więcej, aby zmniejszyć szybkostrzelność broni palnej, a mniej, by zwiększyć.

Stephen
źródło
Powinieneś podać trochę informacji, dlaczego co trzeci strzał miałby znacznik. To nie jest twórca gier. To było wojsko. Kule śledzące, które mają fosfor osadzony w tylnej części ślimaka. Po wystrzeleniu pocisku proch strzelniczy fosforu, tworząc jasny ślad za kulą. Pociski śledzące są droższe niż zwykłe pociski, dlatego są używane tylko w mniej więcej X strzałach, aby zaoszczędzić pieniądze, a jednocześnie mają zamierzony efekt łatwiejszego celowania.
AttackingHobo
Nie chcesz też dzielić tego na renderowanie i aktualizację, jak mówisz. Chcesz, aby cała fizyka pocisku została całkowicie wykonana za pomocą metody aktualizacji. Chcesz, aby każdy strzał X również pojawiał się efekt znacznika, który jest znacznie wolniejszy niż kula, aby pokazać ruch i kierunek.
AttackingHobo
@AttackingHobo Nie myślałem specjalnie o rundach fosforu, ale raczej wizualną wskazówkę, że pociski lecą. Pomysł polegał na zastosowaniu selektywnej kompresji ... usuwającej poziom szczegółowości, którego gracz nigdy nie zarejestrowałby jako „brakujący”, ale to zmniejsza obciążenie systemu. Bit „co 3 pociski” jest arbitralny ... trzeba by eksperymentować, aby zobaczyć, co działa dobrze. W swojej odpowiedzi powiedziałeś „fałszywe znaczniki”, co również ma sens.
Stephen
1

Nie zapominaj, że liczba klatek na sekundę w stosunku do prędkości pocisku może stanowić problem, w niektórych przypadkach, jeśli nie zakodowałeś silnika fizyki wystarczająco dobrze, pocisk może po prostu przejść przez obiekt, nie uderzając go. Istnieje rozwiązanie tej kwestii, którego nie pamiętam zbyt dobrze ...

W każdym razie uważam, że kompensowanie realistycznych pocisków w środowisku gry wieloosobowej może być bardzo problematyczne, jeśli nie niemożliwe, jeśli opóźnienie zacznie być dłuższe niż 30 lub 50 ms.

Pewnego dnia jednak dostawcy usług internetowych mogą bardziej troszczyć się o opóźnienia i dostarczać różne oferty ... ale bez FTTH to wciąż marzenie ...

żart
źródło
1

W takich grach, jak złe towarzystwo, Battlefeild 3 i prześladowca, uważam, że kula jest prawdziwym indywidualnym bytem wystrzelonym jak „rakieta”. Myślę, że śledzenie promieni jest konieczne tylko wtedy, gdy kula natychmiast trafi w cel. Kiedy istota będąca sobą w realistycznych pociskach będzie po prostu tykała, aby sprawdzić, czy kogoś nie trafi.

JAMOY
źródło
0

W rzeczywistości, jeśli spojrzysz na powtórki wideo w Call of Duty, możesz słabo dostrzec pomarańczowo-dwunożną muchę lecącą w powietrzu do zamierzonego celu, a atakujący hobo faktycznie ma na to właściwą odpowiedź.

Jeśli chcesz efektu Richochet, jak stwierdził Hobo, po prostu zagraj w dowolną grę Halo. Jeśli strzelisz do metalowej ściany z bliższej pozycji, zobaczysz pociski bogoczące się w metal. Snajper w nim pozostawia ślad do miejsca, w które uderza.

Ponowna odpowiedź została zakończona, mogę wrócić później, aby naprawić.

Jack bądź zwinny
źródło
-5

Kule i cała fizyka w serii gier prześladowców korzysta z biblioteki open source o nazwie „Open Dynamics Engine”.

http://en.wikipedia.org/wiki/Open_Dynamics_Engine

Pociski spadają z grawitacją, a nawet odbijają się od ścian i robią bardzo dokładne rzeczy, jeśli jesteś wystarczająco inteligentny, możesz nawet wykręcić pocisk, by strzelić komuś, kogo nie widzisz, ale znasz jego pozycję. Kula jest rzeczywistym modelem obiektowym. Jest to najbardziej realistyczny sposób, w jaki to widziałem. Metoda śledzenia promieni nie jest praktyczna, gdy zaczynasz poruszać się w dużych przestrzeniach. Byłoby jednak w porządku strzelanie z pistoletu laserowego.

Inne gry, które go używają, BloodRayne 2, Call of Juarez, World of Goo, X-Moto i OpenSimulator.

Innym dobrym wyborem byłaby biblioteka fizyki „Kula”. http://en.wikipedia.org/wiki/Bullet_%28software%29

Był używany w Grand Theft Auto 4, Red Dead Redemption i nie tylko.

ps arma 2 korzysta z wewnętrznego silnika fizyki, ich następna gra arma 3 będzie korzystać z silnika fizyki physX

EddieV223
źródło
3
Wprowadzanie w błąd gier, które korzystały z ODE, jest mylące dla celów, które nie mają nic wspólnego z kulami.
jhocking
4
Mylące jest również twierdzenie, że prześladowca używa ODE do pocisków, podczas gdy w rzeczywistości gra wykorzystuje własne zastrzeżone testy zderzeniowe, ale używa tylko solvera ODE.
AttackingHobo