✚ Sviluppo videogiochi

Raycast e proiettili: colpi istantanei contro proiettili fisici

Colpi istantanei con raycast e proiettili simulati a confronto: algoritmo DDA su griglia, collisioni continue, gravità dei proiettili e scelte di design.

Quando un personaggio spara, il gioco deve stabilire che cosa viene colpito. Esistono due grandi approcci: considerare il colpo istantaneo, tracciando una linea dalla canna dell'arma, oppure creare un proiettile che vola nel mondo per un certo tempo. La scelta ha conseguenze tecniche e, soprattutto, sul modo in cui il gioco si gioca.

Il raycast

Un raycast (lancio di un raggio) risponde alla domanda: partendo da questo punto, in questa direzione, qual è il primo oggetto che incontro e a che distanza? Oltre agli spari, è uno strumento usato ovunque:

  • verificare la linea di vista tra un nemico e il giocatore;
  • controllare se il personaggio è a terra lanciando un raggio breve verso il basso;
  • posizionare il mirino o un marcatore sulla superficie puntata;
  • calcolare l'occlusione dei suoni;
  • selezionare oggetti con il mouse in una scena 3D.

Raggio contro forme semplici

Per forme come cerchi, sfere e rettangoli esistono formule dirette. Contro un AABB si usa spesso il metodo delle lastre (slab method): si calcola, per ciascun asse, l'intervallo di parametro t in cui il raggio si trova tra i due piani del rettangolo, e si intersecano gli intervalli.

t_ingresso = max(tx_min, ty_min)
t_uscita   = min(tx_max, ty_max)
colpito = t_ingresso <= t_uscita and t_uscita >= 0

Il valore t_ingresso indica la distanza lungo il raggio del punto d'impatto.

Raggio su una griglia: l'algoritmo DDA

Su una mappa a tasselli non conviene testare il raggio contro ogni blocco. L'algoritmo DDA (digital differential analyzer), nella forma resa celebre dal lavoro di Amanatides e Woo, percorre esattamente le celle attraversate dal raggio, una dopo l'altra:

  1. si calcola quanto bisogna avanzare lungo il raggio per attraversare una cella in orizzontale e una in verticale;
  2. si tiene traccia della distanza al prossimo bordo verticale e al prossimo bordo orizzontale;
  3. a ogni passo si avanza verso il bordo più vicino, passando alla cella adiacente;
  4. ci si ferma alla prima cella solida o alla distanza massima.

È lo stesso principio usato dai motori in pseudo-3D degli anni Novanta per disegnare i muri, ed è estremamente efficiente: il costo dipende dal numero di celle attraversate, non dalle dimensioni della mappa.

Colpi istantanei (hitscan)

Nell'approccio hitscan, premendo il grilletto si lancia un raggio e l'eventuale bersaglio viene colpito nello stesso istante. È adatto ad armi molto veloci come fucili e laser.

Vantaggi:

  • semplicità e costo minimo;
  • risposta immediata, molto gratificante;
  • nessun problema di proiettili che attraversano bersagli sottili.

Svantaggi:

  • nessuna possibilità di schivare dopo lo sparo;
  • meno spettacolo visivo, compensato di solito con scie e lampi;
  • su grandi distanze l'istantaneità può risultare poco credibile.

Proiettili simulati

Il proiettile è invece un'entità con posizione e velocità, aggiornata a ogni passo come qualunque altro oggetto. Può essere influenzato dalla gravità, dal vento o da forze magnetiche, può rimbalzare e può essere visto arrivare.

proiettile.velocita.y += gravita * dt
proiettile.posizione += proiettile.velocita * dt

È la scelta naturale per frecce, granate, palle di fuoco, razzi e per i giochi in cui schivare i proiettili è parte essenziale, come gli sparatutto a scorrimento.

Il problema dei proiettili veloci

Un proiettile che in un passo percorre più della larghezza del bersaglio può superarlo senza mai sovrapporsi: il fenomeno chiamato tunneling. Le soluzioni, in ordine di complessità:

  • limitare la velocità o aumentare la frequenza dell'aggiornamento fisico;
  • raycast lungo il tragitto: a ogni passo si lancia un raggio dalla posizione precedente alla nuova, e se colpisce qualcosa si registra l'impatto in quel punto;
  • collisioni continue offerte dai motori fisici, che calcolano il momento esatto del contatto tra due forme in movimento.

Il raycast tra la posizione vecchia e quella nuova unisce i vantaggi dei due mondi: il proiettile esiste, vola ed è visibile, ma non può attraversare i bersagli.

Una tabella per decidere

Caratteristica Hitscan Proiettile simulato
Costo computazionale Minimo Maggiore, cresce con il numero di proiettili
Possibilità di schivare No Sì
Effetti di gravità e vento No Sì
Precisione richiesta al giocatore Mira istantanea Anticipo del bersaglio
Adatto a Fucili, laser, armi rapide Frecce, granate, razzi, palle di fuoco

Molti giochi usano entrambi: hitscan per le armi rapide e proiettili per quelle lente, scegliendo in base alla sensazione desiderata più che al realismo.

Dettagli che fanno la differenza

  • La scia visiva di un colpo hitscan va disegnata dalla canna dell'arma, mentre il raggio parte spesso dal centro della telecamera: altrimenti il colpo non andrebbe dove mira il giocatore.
  • I proiettili vanno distrutti dopo una durata massima o fuori dai limiti del livello, e gestiti con un pool.
  • Gli strati di collisione evitano che un proiettile colpisca chi l'ha sparato.

In sintesi

  • Il raycast trova il primo oggetto lungo una direzione ed è utile ben oltre gli spari.
  • Il metodo delle lastre testa i rettangoli, l'algoritmo DDA percorre le griglie in modo efficiente.
  • L'hitscan è semplice e immediato; i proiettili simulati permettono gravità e schivate.
  • Il tunneling dei proiettili veloci si evita con raycast lungo il tragitto o collisioni continue.
  • La scelta tra i due approcci dipende soprattutto dalla sensazione di gioco desiderata.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche