Come vengono simulati i proiettili nei videogiochi?


86

Di recente ho giocato a giochi come MW2 e, come programmatore, tendo a chiedermi come possono rendere il gioco così coinvolgente. Ad esempio, come simulare la velocità del proiettile.

  1. Quando un NPC spara un proiettile dalla sua arma, il proiettile viaggia davvero dalla sua arma al bersaglio dato o ignorano completamente questa parte e mettono semplicemente un foro di proiettile sul bersaglio?

  2. Se il proiettile sta davvero viaggiando dalla pistola al bersaglio, a quale velocità sta effettivamente viaggiando?


25
Schermo insanguinato, così reale!
Attaccando

6
scatti : BOOOOORRRIIIING
mahen23

1
Non sono sicuro se puoi chiamare i proiettili di Megaman Legend un proiettile, ma a Megaman usano proiettili lenti per proiettili. In questi, puoi vedere chiaramente i colpi che si curvano se corri in cerchio mentre scatti (un effetto coriolis).
Lie Ryan,

Risposte:


84

La maggior parte dei giochi FPS utilizza il raycasting per il gameplay effettivo; i proiettili viaggiano istantaneamente e colpiscono il bersaglio quando sparano.

Ma la maggior parte dei giochi utilizza anche traccianti "falsi". Ogni 3 colpi, o qualche altro intervallo, un tracciante verrà sparato insieme al proiettile, il tracciante sarà davvero veloce, ma non istantaneo. Questo viene fatto solo come effetto visivo e non influisce direttamente sul gioco, ma aiuta a dare spunti al tiratore, al tiratore e fornisce agli spettatori un riferimento direzionale agli spari.

La maggior parte dei giochi che usano questo tipo di fisica dei proiettili sono irrealistici, in quanto non ci sono rimbalzi, frammenti di proiettili e se c'è penetrazione è di solito lineare.

Alcuni giochi, come ARMA II, STALKER (intera serie) utilizzano una fisica dei proiettili più realistica con tempo di viaggio, rimbalzi e penetrazione con angoli di deflessione. Credo che questi sistemi stiano usando il raycasting, ma con un limite determinato dalla velocità del proiettile. Con questi giochi la velocità della museruola può essere realistica come in ARMA II, o apparire come in STALKER.

Preferisco di gran lunga avere una fisica proiettile realistica, poiché le pistole sparano proiettili, non laser.


1
Non avendo mai giocato a nessuno dei giochi citati, in che modo influisce sul gameplay? Voglio dire, se impieghi la fisica dei proiettili in un gioco come Call of Duty, vedi davvero una notevole differenza? Gli angoli di penetrazione stanno cambiando il gioco? I giocatori realizzerebbero persino che il loro personaggio non si allinea con il foro di proiettile rispetto al tiratore? Solo curioso di sapere quali vantaggi ci sono per giustificare il sovraccarico. Grazie in anticipo.
Dutchie432,

Aggiunge uno strato di imprevedibilità e profondità alla meccanica di tiro che trovo piacevole. I proiettili non sono istantanei !!! chuckhawks.com/rifle_ballistics_table.htm Una lumaca che va 2644 piedi al secondo per 600 piedi impiega oltre 2 secondi per colpire il bersaglio senza tenere conto di ulteriori rallentamenti. Un bersaglio in corsa sarebbe mancato se mirassi direttamente a esso. Un'ulteriore distanza consentirebbe alla lumaca di andare più lentamente della velocità del suono, permettendo alle persone di saltare a terra o altro se sentissero lo sparo.
Attaccando

Ci sono diverse dichiarazioni inesatte fatte in questa risposta e dovrebbero essere eliminate. Controlla la mia risposta qui sotto.
EddieV223,

1
I proiettili in ArmA 2 sono proiettili simulati; possono essere modificati (velocità modificata, cambio di direzione) durante il volo e scontrarsi con oggetti mentre viaggiano. Che ciò avvenga o meno mediante ray casting è irrilevante, agiscono come veri e propri oggetti fisici.
Deceleratedcaviar

così mw2? raycasting o no? Perché chiaramente fanno un ottimo lavoro nel simulare i fori di proiettile e gli ambienti che ne vengono distrutti
mahen23

51

Per i proiettili di solito non si preoccupano di simulare il proiettile che viaggia effettivamente in aria e semplicemente mettono un foro di proiettile sul bersaglio nell'istante in cui viene sparato. Altre cose come i razzi sono più lente * e il gioco in realtà mostra loro di viaggiare nell'aria.

A breve distanza i proiettili viaggeranno, insieme al lasso di tempo tra i fotogrammi, andrebbero comunque dal tiratore al bersaglio tra o entro 1 fotogramma.

* Cioè, più lento dei razzi nella vita reale, in modo che il giocatore possa vederli volare in aria.


44

Ho scritto il codice bullet per PlanetSide. Avevamo alcuni proiettili "hitcan", ma per lo più simulavamo i proiettili nel miglior modo possibile, tenendo conto dei vincoli della CPU e dell'enorme numero di proiettili in gioco in qualsiasi momento.

Nel caso di hitscan, l'impatto è determinato nello stesso frame dell'input ricevuto, spesso usando un singolo raycast. Questo è appropriato per armi come laser o altri proiettili estremamente veloci. Abbiamo fatto hitcan semplicemente accendendo la velocità iniziale sul proiettile così in alto da attraversare il tabellone in un solo tick.

I proiettili non hitcan sono spuntati, sia sul tempo del frame grafico che su un timestep fisso, con calcoli per accelerazione (pensa ai razzi), gravità, attrito dell'aria, guida (pensa ai proiettili in cerca di calore) ecc. L'obiettivo è generare la posizione terminale del proiettile per il timestep. Una volta stabiliti i punti di inizio e fine, è possibile lanciare uno o più raggi per approssimare la traiettoria di volo e rilevare eventuali collisioni che si sarebbero verificate durante il volo.

In entrambi i proiettili hitcan e non hitcan, ciò che accade in caso di collisione dipende dalle proprietà del tuo proiettile e dalla superficie che impatti. Ad esempio, potresti colpire una superficie dura, nel qual caso potresti controllare il conteggio del rimbalzo e regolare la posizione e la velocità per un riflesso, oppure far esplodere il proiettile se hai raggiunto il conteggio del rimbalzo massimo. In questo sistema, un razzo ha solo un conteggio di rimbalzo massimo di 0. Potresti colpire una superficie morbida e quindi controllare il tuo potere penetrante per determinare se il proiettile dovrebbe continuare attraverso il materiale, ecc.

È stato divertente scrivere codice. Inoltre, è super utile scrivere una buona visualizzazione di debug di ciò che sta succedendo in modo da poter ispezionare visivamente percorsi di volo, eventi, ecc.


2
Ho giocato a Planetside prima di iniziare a programmare un bel gioco, e sembra che sarebbe divertente codificarlo.
Anthony,

18

Dipende dal gioco e dal livello di precisione / realismo.

La sincronizzazione dei modelli di tiro e di danno nelle impostazioni multiplayer è piuttosto difficile poiché è necessario determinare con precisione dove e quando è stato sparato esattamente un proiettile, se ha colpito un bersaglio e se qualcos'altro è passato attraverso il percorso.

Pertanto, sospetto che, quando possibile, i progettisti di giochi semplificano le cose trattando alcuni colpi come istantanei (in modo che sia necessario considerare la posizione di tutti in un solo momento nel tempo) o limitando la portata del proiettile. Fortunatamente, questo corrisponde spesso alla fisica della vita reale. Ad esempio, i fucili di precisione sparano colpi ad alta velocità.

Molti giochi possono simulare un percorso multi-snapshot multistep di un oggetto in movimento lento (come artiglieria, bombe, proiettili, ecc.) Ma questo è molto costoso e i problemi di sincronizzazione sono più comuni, portando a divertenti video di YouTube.

Un'altra preoccupazione riguarda i giochi che mantengono separati "ambienti" più piccoli (ad esempio, ogni stanza viene simulata separatamente) per creare l'illusione di uno spazio più ampio. In questi casi, le cose all'interno dei confini di una "stanza" possono essere simulate correttamente in modo tale che tutti nella stanza siano aggiornati sulle serie di transizioni nello spazio effettuate dal proiettile, ma altre al di fuori di quell'ambiente non lo sono.


14

Per i proiettili che viaggiano più velocemente di quanto l'occhio possa vedere, viene spesso impiegato il raycasting: un raggio dal muso viene calcolato nella direzione appropriata e viene testato contro potenziali oggetti bersaglio per determinare cosa è stato colpito. Questo può essere complicato con più raggi e alcuni calcoli extra se si desidera simulare cose come il proiettile e simili. Puoi anche dare una velocità ai progetti e usarli per aggiungere un po 'di realismo aggiuntivo al calcolo (quindi i proiettili non sono istantanei).


11

Dipende dall'implementazione, ma so che il motore di origine non ha usato affatto proiettili fisici (oggetti proiettili), ha appena fatto un cast ray dal giocatore al bersaglio con un cerchio casuale di "hit zone" (raggi maggiori o minori dipendevano da la velocità con cui l'arma ha sparato e se il giocatore teneva premuto il pulsante di fuoco) quale fosse il suo punto nel punto in cui stava puntando il giocatore, quindi dopo aver determinato il raggio effettivo lanciato dal giocatore verso il punto determinato casualmente e in base ad altri fattori (come bullet "peso" e velocità della museruola (tutti i numeri interni), oggetto colpito, ecc.) il raggio di lancio è stato lanciato attraverso più oggetti o fino a quando non ha colpito il terreno.

D'altro canto, il motore Torque 3D DID utilizza oggetti proiettili reali e il progettista potrebbe influenzare i propri modificatori di velocità, massa e gravità. Tutto ciò che il motore ha fatto è stato aggiornare i valori ogni 32 millisecondi.

MODIFICARE

Oltre all'utilizzo di oggetti proiettili, il Torque 3D Engine consentiva anche l'uso di ray cast in alternativa. (Ho realizzato diversi giochi in cui il "proiettile" è in realtà un effetto particellare che non ha alcun supporto che gli oggetti proiettili hanno fatto, quindi è stato richiesto un cast ray.)


storia fantastica fratello. tuttavia, sono sicuro che il motore Torque 3D richiedesse più potenza di elaborazione, per calcolare tutta questa fisica.
mahen23

@ mahen23 Saresti sorpreso. Aveva meno calcoli di fisica rispetto a Source Engine, in parte perché non gestiva affatto le collisioni di Softbody, ma solo semplici scatole di delimitazione e di collisione.
Casey,

10

C'è un bel riassunto nella wiki di Team Fortress 2 sul comportamento del loro proiettile e dei colpi delle armi.

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


2
Quella wiki è una buona lettura.
mgiuca,

Mentre quella sezione è breve, spiega sia hitcan che non hitcan e spiega cosa sono gli hitbox e come vengono utilizzati.
jhocking

ricordati di leggere gli articoli secondari "Proiezione" e "Hitscan" proprio sotto il titolo di quella sezione
lunixbochs,

6

In realtà molti giochi usano un algoritmo di hit test di rendering gpu. Ecco come funziona di base:

1) Off-screen crea un rendering della vista corrente in cui tutto il terreno è nero e ogni personaggio è un colore non nero 2) Ottieni il colore del pixel sotto il mirino 3) Se è una ricerca non nera il colore- > mappatura del giocatore e applica un colpo a quel bersaglio.

Questo metodo è stato usato per anni nei giochi principalmente perché è pixel perfetto. Se un singolo pixel del cappello del giocatore sporge da dietro un muro, puoi colpirlo. Ad esempio, se riesci a vederlo, puoi colpirlo. Questo tipo di precisione è quasi impossibile con semplici tecniche di ray casting. In secondo luogo, questo tipo di test è estremamente veloce e può essere eseguito sulla GPU.


La ricerca del colore-> giocatore sembra dolorosa? Se Ray lo lanciasse, non sarebbe la stessa efficienza?
deceleratedcaviar

In realtà, è estremamente veloce. La maggior parte del tempo impiegato nel rendering proviene dall'ombreggiatura dei poligoni reali. Nel caso del rendering dell'hit test, vengono utilizzati solo poligoni di colore solido. Inoltre, questo hit-test può essere eseguito completamente nella GPU ed è perfetto per i pixel. Niente spunta un giocatore più che fare un colpo perfetto su un bersaglio, e poi il hit-test gli dice che è stato un fallimento.
Timothy Baldridge,

Ma come si fa a convertire lo spazio pixel in spazio mondo nell'oggetto corrispondente che si colpisce.
Deceleratedcaviar

@Daniel: come dice la risposta, il bersaglio che viene colpito viene identificato dal colore. Ogni personaggio è reso come un colore (solido) diverso, quindi puoi semplicemente controllare il colore e il nero = miss, qualsiasi altra cosa = cerca chi è stato reso in quel colore, perché sono stati colpiti.
Dave Sherohman,

@Dave Sherohman, in origine dovevo averlo letto male, dopo aver letto la tua spiegazione mi è sembrato così chiaro cosa intendesse ... evviva
deceleratedcaviar

4

Alcuni giochi usano senza dubbio una fisica realistica dei proiettili, tenendo conto del tempo di viaggio dei proiettili e della loro caduta, ma suppongo che la maggior parte dei giochi non lo faccia, almeno per gli NPC.

Per un gioco che dirige il viaggio proiettile (nessuna caduta) che è istantaneo, il gioco traccia una linea immaginaria (vettore) dal punto della canna in avanti. Quindi calcola con cosa si interseca quella linea e registra un "colpo" di proiettile in quel punto. Potrebbe essere un oggetto solido come un muro in cui un impatto innesca un effetto come una decalcomania di colpo di proiettile e un "soffio" di fumo / detriti. Potrebbe avere un impatto su un oggetto fragile provocandone la rottura oppure potrebbe avere un impatto su un oggetto fisico e dargli un "calcio". O ovviamente potrebbe colpire il giocatore o un altro NPC e causare un danno alla salute. Le simulazioni del nucleo duro modelleranno il proiettile che penetra attraverso i muri e scateneranno un effetto colpo sul lato di uscita, probabilmente diminuendo il danno del proiettile all'uscita.

Proprio così gli NPC non hanno un obiettivo perfetto, molti giochi aggiungono una sorta di randomizzazione al vettore per modellare la diffusione dei proiettili. Questo è ciò che vedresti nella vita reale, in cui i proiettili non colpiscono tutti proprio dove punti, ma in uno schema centrato attorno al punto di mira.

Per visualizzare la diffusione del proiettile, immagina un cono che fuoriesce dalla pistola anziché una linea retta (vettore). La direzione effettiva del proiettile viene randomizzata in modo da trovarsi da qualche parte all'interno di questo cono. Se il tiratore è molto vicino al bersaglio, la diffusione è ridotta e la precisione elevata. Se il bersaglio è lontano, il cono aggiunge una maggiore diffusione, quindi è meno probabile che il tiratore colpisca il bersaglio.

Questa idea del cono di tiro può essere utilizzata per modellare la precisione del tiratore (abilità), la precisione dell'arma e altre condizioni. Ad esempio un NPC di basso livello potrebbe ricevere un cono di sparo di bassa precisione, mentre un NPC altamente qualificato avrebbe una precisione di alto livello. Un giocatore che corre con un fucile mitragliatore che spara dall'anca avrebbe un cono di tiro largo, che si ridurrebbe se smettesse di correre o mirare. I fucili di precisione avrebbero coni più stretti per natura che dire una pistola.


+1 buona informazione. Ma penso che potrebbe essere visivamente più piacevole se l'IA, in realtà, non è in grado di mirare al giocatore, piuttosto che un cono più grande. Oppure, se vuoi allargare il cono, rendilo di dimensioni variabili in base al rinculo e dai ai nemici di livello inferiore un tasso di aumento delle dimensioni più veloce, quindi sembrano semplicemente inesperti.
Attaccando

1

Parlando del codice sorgente di Nexuiz dal momento in cui ho dato un'occhiata, in realtà non hanno inviato un oggetto "proiettile" dal punto A al punto B. Se ricordo bene, e questo è specifico solo per alcune armi - altre armi non sono " t armi istantanee quando vengono sparate, il codice guarda dove punta la tua pistola. Se è mirato a una persona (ed è un'arma a colpo istantaneo) quando si fa clic su "fuoco", si ottiene un colpo.

Notevole è anche il modo in cui Nexuiz aveva l'opzione sul lato server di calcolare gli hit sul client o sul server. Se sospetti che i client stiano truffando, puoi passare ai calcoli degli hit sul lato server nel tentativo di contribuire a mitigarlo.


1

Un'altra strategia è un ibrido di rendere tutto e ray tracing tutto. Non devi necessariamente rendere ogni proiettile. Ad esempio, se la tua arma spara 30 colpi / secondo, una deformazione può generare qualche centinaio di particelle ... puoi ridurre il rendering usando un "effetto tracciante", eseguire il rendering ogni 3 colpi, il raggio traccia gli altri due. Il giocatore vede ancora sparare 10 colpi / secondo al nemico.

Modifica per la tua situazione specifica, rendi di più per un tasso più basso di armi da fuoco, meno per un più alto.


1
Dovresti includere alcune informazioni sul motivo per cui ogni terzo scatto dovrebbe avere il tracciante. Non è uno sviluppo per sviluppatori di giochi. Era l'esercito. Proiettili da tracer con fosforo incorporato nella parte posteriore della lumaca. Quando viene sparato il proiettile, la polvere da sparo accende il fosforo creando una scia luminosa dietro il proiettile. I proiettili Tracer sono più costosi dei proiettili normali, quindi vengono utilizzati solo quasi X colpi per risparmiare denaro, pur avendo l'effetto previsto di poter mirare più facilmente.
Attaccando

Inoltre, non vuoi dividerlo nel rendering e nell'aggiornamento come dici tu. Desideri che tutta la fisica dei proiettili sia completamente eseguita con il metodo di aggiornamento. Volete che ogni colpo X o giù di lì generi anche un effetto tracciante che è molto più lento del proiettile per mostrare movimento e direzione.
Attaccando

@AttackingHobo Non pensavo specificamente ai colpi di fosforo, ma piuttosto a un segnale visivo che i proiettili volano. L'idea era di usare la compressione selettiva ... rimuovendo un livello di dettaglio che il giocatore non avrebbe mai registrato come "mancante", ma che alleggeriva il sistema. Il bit "ogni terzo proiettile" è arbitrario ... dovresti sperimentare per vedere cosa ha funzionato bene. Nella tua risposta hai detto "falsi traccianti", il che ha anche molto senso.
Stephen,

1

Non dimenticare che il framerate rispetto alla velocità del proiettile può essere un problema, in alcuni casi se non hai codificato abbastanza bene il tuo motore fisico, il proiettile può semplicemente passare attraverso l'oggetto senza colpirlo. C'è una soluzione per quella materia, che non ricordo molto bene ...

Ad ogni modo, penso che possa essere molto problematico compensare proiettili realistici in un ambiente multiplayer, se non impossibile se la latenza inizia a essere più lunga di 30 o 50ms.

Un giorno, tuttavia, l'ISP potrebbe interessarsi un po 'di più alla latenza e offrire diverse offerte ... ma senza FTTH, è ancora un sogno ...


1

In giochi come cattiva compagnia, battlefeild 3 e stalker, credo che il proiettile sia una vera entità individuale sparata come un "razzo". Penso che il ray tracing sia necessario solo se il proiettile colpirà istantaneamente il bersaglio. Quando l'entità si trova in proiettili realistici ticchetterà per vedere se colpisce qualcuno.


0

Alla fine, se guardi i replay dei video in Call of Duty, puoi vedere debolmente un bipede arancione che vola nell'aria verso il bersaglio desiderato, e attaccarehobo in realtà ha la risposta giusta per la maggior parte.

Se vuoi un effetto richochet come ha affermato Hobo, vai a giocare a uno qualsiasi dei giochi di Halo. Se spari a una parete di metallo da una posizione più vicina puoi vedere i proiettili che si rincorrono sul metallo. Il cecchino dentro lascia una scia dove colpisce.

Risposta ritardata terminata, potrei tornare più tardi per risolvere.


-5

I proiettili e tutta la fisica della serie di giochi stalker utilizzano una libreria open source chiamata "Open Dynamics Engine".

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

I proiettili cadono di gravità e persino rimbalzano sui muri e roba molto accuratamente se sei abbastanza intelligente da poter persino curvare un proiettile da qualcosa per sparare a qualcuno che non riesci a vedere ma conosci la loro posizione. Il proiettile è un vero modello a oggetti. Questo è il modo più realistico in cui l'ho visto fare, il metodo di ray ray non è pratico quando inizi a muoverti in grandi spazi. Sarebbe ok per sparare con una pistola laser.

Altri giochi che lo usano BloodRayne 2, Call of Juarez, World of Goo, X-Moto e OpenSimulator.

Un'altra buona scelta sarebbe la biblioteca di fisica "Bullet". http://en.wikipedia.org/wiki/Bullet_%28software%29

È stato utilizzato in Grand Theft Auto 4, Red Dead Redemption e altro ancora.

ps arma 2 utilizza un motore fisico interno, il loro prossimo gioco arma 3 utilizzerà il motore fisico PhysX


3
È fuorviante elencare i giochi che utilizzavano ODE per scopi che non hanno nulla a che fare con i proiettili.
jhocking

4
È anche fuorviante affermare che lo stalker utilizza ODE per i proiettili, quando in realtà il gioco utilizza i propri test di collisione proprietari, ma utilizza solo il risolutore ODE.
Attaccando
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.