Mi chiedevo come si fanno le collisioni in alcuni semplici giochi di corse automobilistiche in 3D (specialmente in giochi come Outrun 2 / Motoracer).
Nei giochi di corse automobilistiche classiche con un ambiente complesso (mondo aperto), immagino che ciò avvenga con una scatola base (per l'auto) per far collidere la collisione (per pista, edifici e altre cose). Il tutto verrebbe ottimizzato usando alcune scatole di delimitazione (questo è il modo in cui la collisione è fatta in molti giochi).
In un gioco come Outrun 2 / Motoracer, il gameplay è così semplice che gli sviluppatori potrebbero non averne bisogno e tutto avrebbe potuto essere semplificato molto. Per coloro che non lo suonano mai, ecco cosa è così specifico:
- L'auto / bici è sempre incollata sulla strada.
- La strada ha sempre le stesse dimensioni e ha una forma molto semplice.
- L'unica possibilità è quella di seguire quella strada, non è possibile lasciare la strada o entrare in collisione con qualcos'altro (eccetto altre macchine / biciclette, ma a noi non importa).
- Quando ti scontri con la strada, viene eseguita una collisione arcade di base (l'auto viene semplicemente allontanata da essa)
Ecco come penso che la collisione (potrebbe) sia stata fatta:
L'intera traccia potrebbe essere considerata gigante una curva più bezier 3d. Da quella curva, i poligoni stradali potrebbero essere generati (usando i vettori anteriore, sinistro e su generati dalla curva). Altri elementi (come case, alberi, ...) potrebbero anche essere posizionati e allineati usando questo metodo.
Quindi, per gestire le collisioni (e disegnare la macchina):
1) Trova la posizione più vicina sulla curva 3d dalla posizione 3d attuale dell'auto. In altre parole, trasforma la posizione della macchina 3d in una posizione della curva più bezier. Ogni posizione 3d sulla strada potrebbe essere considerata come uno spostamento lungo la curva 3d ( t
) + spostamento laterale ( d
). Controlla l'immagine qui sotto se non è chiara (questo è un esempio 2d ma questo si applica facilmente a 3d).
quando l'auto t = 0 è all'inizio della sezione di pista, quando l'auto t = 1 è alla fine. quando d = -1 o 1 auto si trova al confine del binario, quando d = 0 auto è in mezzo alla strada
2) allineare la macchina alla strada utilizzando t
e d
(molto semplice: per ogni t
e d
valori posso ottenere una posizione 3D + up / anteriori / vettori sinistra). l'auto è ora incollata sulla strada
3) controllare lo spostamento laterale d
della vettura. se il valore è troppo grande (d > 1)
o l' (d < -1)
auto bassa è fuori pista. basta agganciarlo per mettere l'auto nel posto giusto.
Questo rende anche l'abbattimento 3D molto semplice, basta tracciare la traccia dalla t
posizione attuale dell'auto a t + some_big_enough_value_to_avoid_visible_clipping
.
O forse mi sbaglio completamente: sarebbe stato molto più veloce e più semplice controllare la collisione della macchina (un riquadro di delimitazione) e un insieme molto semplificato di poligoni che rappresentano la pista (senza edifici e simili). Il mondo 3d (e il risultante modello di colisione) sarebbero stati semplicemente generati prima, usando alcuni strumenti di terze parti (niente più curva 3d durante l'esecuzione del gioco, solo un mucchio di poligoni).