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.
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?
Jeśli kula naprawdę leci od pistoletu do celu, z jaką prędkością faktycznie leci?
projectile-physics
mahen23
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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
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).
źródło
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.)
źródło
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
źródło
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.
źródło
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.
źródło
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ć.
źródło
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ć.
źródło
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 ...
źródło
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.
źródło
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ć.
źródło
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
źródło