Rilevamento della collisione della sfera rispetto a 45 gradi


8

Ho un semplice gioco in cui il giocatore muove una palla. La palla rimbalza sulle pareti. In questo momento ho implementato i muri quadrati (■): uso semplici collisioni con delimitatore per verificare se il giocatore si sposterà in un muro durante l'aggiornamento della sua velocità x o y e, in tal caso, moltiplicherò quella velocità con -1 per farli rimbalzare .

Tuttavia, voglio anche implementare pezzi triangolari (◢◣◤◥). Per rimbalzare credo che si possa semplicemente usare:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Tuttavia, ciò di cui ho problemi è il rilevamento delle collisioni: quando il giocatore colpisce la diagonale?


2
Consiglio vivamente il tutorial N ( parte 1 , parte 2 ) su questo argomento.
Chris Burt-Brown,

Grazie mille. Quel tutorial in realtà mi ha aiutato a capire finalmente come risolverlo.
Qqwy

In realtà è molto difficile per me contrassegnare una delle risposte come "la" soluzione poiché tutti mi hanno aiutato a capire il problema, ma nessuno di loro l'ha risolto del tutto. Cosa dovrei fare?
Qqwy,

Risposte:


8

Innanzitutto per calcolare il rilevamento delle collisioni tra una sfera (cerchio in 2D) e una linea è necessario calcolare il vettore perpendicolare tra il centro della palla in movimento e la linea, per calcolare questa distanza è necessario effettuare le seguenti operazioni:

inserisci qui la descrizione dell'immagine

Quindi, per calcolare d nella figura sopra, dobbiamo fare alcuni passaggi.

  1. Supponiamo che la tua linea stia usando l'equazione parametrica P (t) = S + t V nota che V è la direzione della linea che puoi ottenere sottraendo (P2 - P1).
  2. Da Pitagora:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Quindi espandi l'equazione per ottenere quanto segue, sembra un po 'complicato ma in realtà non lo è.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) punto V ) ^ 2 / V ^ 2)

Dove Q è il centro del cerchio e S è un punto qualsiasi della linea. Una volta che la distanza è inferiore al raggio del cerchio / sfera, è necessario innescare la risposta alla collisione che è spiegata nel punto successivo.

È errato capovolgere sempre il componente x o y per far rimbalzare la palla, quello che devi fare è riflettere il vettore di velocità, per farlo devi calcolare il vettore normale della superficie e usare quello normale per calcolare il riflesso vettore usando la seguente equazione

R = 2 * ( V punto N ) * N - V

dove R è il vettore di riflessione, N è la normale della superficie e V è il vettore di velocità.

In caso di 45 gradi la normale della tua superficie sarà N = (1,1,0) con segno variabile a seconda della direzione in cui le facce normali (posizione o negativo).


Usi una grande equazione. Tuttavia, è molto difficile seguire qualcuno che è nuovo ai vettori. Sarebbe utile se suddividi la tua equazione in passaggi più piccoli.
Qqwy

A proposito, N è un vettore bidimensionale o tridimensionale? Da dove viene il terzo valore (0)?
Qqwy,

Ho usato i vettori 3D perché supponevo che tu stia utilizzando un'API 3D (e potrei sbagliarmi) nel caso fosse vero che devi impostare il 3o componente su 0, ma comunque le equazioni dovrebbero funzionare sia in 2D che in 3D (e probabilmente più in alto dimensioni ma non importa). riguardo alle equazioni posso spiegare di più ma ho bisogno di un po 'di tempo per modificare la risposta.
concept3d

1
Ho modificato la risposta, spero che abbia più senso ora. Tra l'altro, spero che stackexchange possa fornire un modo conveniente per scrivere formule matematiche perché è soggetto a dolore ed errori in questo momento.
concept3d

6

Vuoi misurare la distanza tra il centro della palla e il muro, quindi:

inserisci qui la descrizione dell'immagine

risolvere il sistema che vedi nell'immagine ti darà le coordinate del punto d.

Quindi, se la distanza tra i punti d e c è minore o uguale al raggio della palla r, si verifica una collisione tra la palla e il muro


5

Le palle sono in realtà oggetti piuttosto semplici per il rilevamento delle collisioni. Si scontrano con il terreno quando la distanza tra il centro della palla e il bordo del terreno diventa inferiore al raggio della palla. La posizione del centro della palla dovrebbe essere banale da ottenere. Trovare il punto di terreno più vicino è generalmente più complicato e il modo migliore per farlo dipende da come viene rappresentato il terreno.

L'algoritmo per calcolare la nuova velocità dopo il rimbalzo da una pendenza diagonale non è corretto. L'inversione di entrambe le coordinate X e Y farà tornare la palla nella stessa direzione da cui si è avvicinata alla pendenza. Questo va bene se la palla arriva al terreno da un angolo retto, ma fallisce per altri angoli. Ti consigliamo di annullare solo il componente normale alla superficie, ad esempio quando rimbalzi dal soffitto, annulli y, non x.


Sebbene questa risposta non affronti direttamente il problema, in questo caso +1 per dirmi come risolvere la collisione.
Qqwy,
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.