Vettori nello sviluppo del gioco


19

Sono nuovo nella programmazione e nella programmazione di giochi. Ho letto qualcosa sui vettori e sulla matematica, ma ho una domanda: dove uso i vettori nella programmazione del gioco? Forse qualcuno può fare un semplice esempio di dove stai usando i vettori (in 2D)?

Ho trovato degli esempi, ma per lo più sono nella console in cui producono numeri e grandi esempi che non capisco.


TL di base; i vettori DR fanno parte dell'argomento Algebra lineare e conducono a Matricies. Con Matricies e Linear Algebra scrivi qualsiasi cosa, dal solutore di Minesweeper a una proiezione del mondo 3D per vedere quale oggetto è sotto il tuo cursore. Linear Algebra è la branca della matematica più utile e necessaria per qualsiasi sviluppatore di giochi. Imparalo ora; Non ve ne pentirete.
Robert Massaioli,

Grazie a tutti per tutte le risposte fantastiche! Ma perché qualcosa come non usare Vector in questo tutorial ?: zetcode.com/tutorials/javagamestutorial O uno sviluppatore usa l'altro no?
vqwer

Difficile a dirsi, probabilmente l'autore voleva mantenerlo semplice ed essenziale per i principianti.
Maik Semder

In realtà l'autore li usa, guarda la serie di punti class Star qui
Maik Semder

Anche qui è Point2Dusato inclass ResizeRectangle
Maik Semder

Risposte:


31

Cosa sono i vettori?

I vettori sono insiemi di coordinate di diversa dimensione. Ogni coordinata in un vettore rappresenta una posizione assoluta in quella direzione dello spazio in cui si trova il vettore.

  • Un vettore 1-D sarebbe {1} . Potrebbe essere, ad esempio, una posizione in X = 1. O un tempo t = 1.
  • Un vettore 2D sarebbe {-4,3} . Questa potrebbe essere, ad esempio, una posizione a -4 sull'asse X e 3 sull'asse Y. Potrebbe anche essere la temperatura (3 gradi) in una posizione (-4 metri) all'asse X.
  • Un vettore 3-D sarebbe {1,2,3} . Questa potrebbe essere una posizione nello spazio 1 lungo l'asse X, 2 indietro sull'asse Y e 3 in alto sull'asse Z. Oppure potrebbe essere 1 rosso, 2 verde e 3 blu in un colore. Oppure, potrebbe essere una posizione XY ( {1,2} ) in qualche momento T ( {3} ).

Si noti che in tutti i casi, abbiamo assegnato un significato ai vettori per il nostro problema. Mentre troverai comunemente vettori utilizzati per la geometria nei giochi, non c'è motivo per cui non puoi fare qualcos'altro con loro.

Perché uso i vettori?

In primo luogo, non si deve usare vettori. Fintanto che stai tenendo traccia di xey, o di qualsiasi coordinata ti interessi, in qualche modo stai bene.

Tuttavia, il vantaggio di usare i vettori è che rappresentano ordinatamente cose come direzione e posizione, e hanno anche diverse operazioni matematiche definite che rendono la vita più semplice.

Per un semplice esempio di questi, considera il prodotto punto .

Supponiamo di avere un sistema radar in un gioco in stile top-down. Ogni nemico che appare nel settore del radar (un cuneo a forma di torta in 2D) dovrebbe ottenere un piccolo punto rosso sullo schermo. Quindi, devi capire quali sono i nemici nella tua sezione radar.

Potresti verificare se i nemici si trovano all'interno di un triangolo. Potresti anche verificare se i nemici sono contenuti nell'intersezione dei due semispazi degli aerei / linee che definiscono i due lati del settore radar.

Oppure, potresti semplicemente usare un prodotto punto per fare il controllo. Ecco come:

  1. Crea un vettore che va dal centro del radar verso la "parte anteriore del radar". Normalizzalo.
  2. Crea un vettore che va dal centro del radar verso l'oggetto di cui vogliamo controllare la visibilità. Normalizzalo.
  3. Prendi il prodotto punto dei due vettori normalizzati.
  4. Prendi l'arccosina di quel prodotto e controlla se è inferiore alla metà dell'angolo della larghezza del radar. Se lo è, disegna un blip.

Questo è molto utile e ora ti consente anche di avere radar che puntano in direzioni diverse (basta cambiare il vettore in avanti) e hanno larghezze diverse (basta cambiare l'angolo di larghezza del radar) - e puoi riutilizzare lo stesso codice anche per quei casi !

Perché altrimenti uso i vettori?

Se sei in 2D, forse il modo migliore per ottenere effetti e movimenti complessi (rotazione, ridimensionamento, ecc.) È usare un grafico di scena. Un pianeta ha una nave in orbita, la nave ha un drone in orbita. Il calcolo per questo senza usare la matematica vettoriale è davvero, davvero brutto.

Con la matematica vettoriale, rappresentiamo ognuno con un punto e una matrice di trasformazione 3x3. Il pianeta usa la sua trasformazione, la nave usa la sua trasformazione e la trasformazione del pianeta, e il drone usa la sua trasformazione e la trasformazione della nave e la trasformazione del pianeta.

Quando il pianeta si muove, si cambia la sua trasformazione e la nave e il drone vengono automaticamente posizionati "gratuitamente". Codice molto più pulito.

Ancora non convinto. I vettori sono anche la rappresentazione nativa di posizione, geometria e movimento utilizzati da quasi tutte le librerie grafiche - e certamente OpenGL e DirectX. Non è probabile che tu riesca a fuggire senza doverli usare.

Conclusioni I vettori sono un potente strumento per scrivere codice chiaro che risolve i problemi geometrici in modo pulito ed elegante.


14

Un esempio 2D sono le coordinate dello schermo, identifica un pixel sullo schermo e ha un componente x e un componente y [x, y] cioè la posizione dello schermo superiore sinistro [0, 0]

Un altro esempio: immagina un testo che scorre dal bordo destro dello schermo al bordo sinistro dello schermo. Ora devi definire la velocità del testo scorrevole in pixel al secondo, ovvero [-20, 0], il che significa che il testo scorre di 20 pixel a sinistra al secondo e non cambia mai l'altezza.

Un altro esempio più avanzato: immagina un gioco 2D che dovrebbe funzionare con diverse risoluzioni dello schermo 800x600, 1024x768 ecc. Questo può essere fatto facilmente usando internamente una larghezza dello schermo da 0,0 a 1,0 e un'altezza da 0,0 a 1,0 per disaccoppiare la logica del gioco dalla risoluzione effettiva dello schermo. Ora quando disegni sullo schermo devi semplicemente moltiplicare il vettore interno con il vettore di risoluzione:

screen_pos = internal_pos * screen_ressolution

nota, tutte e 3 le variabili sono vettori 2D qui, hanno un componente xe un componente y, cioè per questo internal_pos [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Quindi la posizione interna [0,5, 0,25] viene trasformata nella posizione effettiva dello schermo [400, 150]

Questa era la roba di base. Il vero vantaggio dei vettori è l'applicazione in Algebra lineare in cui è possibile utilizzare le matrici per trasformare i vertici (rotazione, scala, specchio ecc.), Ovvero per ruotare facilmente di 90 gradi tutta la posizione interna, oppure è necessario scambiare lo schermo-y la posizione 0 dall'alto verso il basso dello schermo, perché ad esempio una libreria di terze parti utilizzata, utilizza questa convenzione.


Un vettore non è un array a dimensione singola, come un elenco di qualche tipo? Quando parliamo di risoluzione dello schermo, non stiamo parlando di array multidimensionali (una coordinata per ciascun asse X e Y)? Solo per assicurarsi che "vettore" non sia confuso con una matrice qui. =)
Will Marcouiller il

@Will i dati pixel completi per lo schermo possono essere trattati come un array multidimensionale, fondamentalmente una bitmap, ma i valori di larghezza e altezza, in altre parole la risoluzione, non possono
Maik Semder

2
Si noti che un vettore viene spesso trattato in modo abbastanza diverso in matematica e in programmazione. Matematicamente parlando, un vettore non è un array multidimensionale, sebbene i suoi componenti rispetto ad alcune basi insieme definiscano tale array. Il vettore stesso è invariante di coordinate. L'operazione nonscreen_pos = internal_pos * screen_resolution è invariante di coordinate nel modo in cui l'hai scritta, potrebbe essere più opportunamente scritta , dove si trova una mappatura lineare (che può essere scritta come una matrice, in questo caso diagonale). screen_pos = map_to_screen * internal_posmap_to_screen
leftaroundabout

6

Ecco una grande spiegazione dei vettori nello sviluppo del gioco sul blog di Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


Questa è attualmente una risposta solo link. Ti preghiamo di considerare di includere un sommario approssimativo dei punti principali che speri che un lettore possa trarre da questo link, quindi la risposta può essere autonoma anche se il link cambia, si interrompe o diventa non disponibile in futuro.
DMGregory

1

Un vettore è un'entità che ha sia un valore che una direzione. Esempi di vettori nel mondo reale e giochi basati sulla fisica includono velocità e quantità di moto. Le proprietà che hanno solo valori ma nessuna direzione sono chiamate scalari e includono posizione, massa, densità e così via.

I vettori sono necessari per i giochi che emulano proprietà fisiche simili ai vettori (come detto - velocità, accelerazione e così via). La matematica utilizzata per i calcoli vettoriali è chiamata algebra lineare .


La velocità è uno scalare, è la lunghezza del vettore di velocità
Maik Semder

Corretto - risolto
Eran Galperin,

1
e la posizione solitamente è considerata come vettore, è la distanza che è scalare.
Ali1S232,

La posizione può essere considerata sia uno scalare (o una raccolta di scalari) sia un vettore che punta dal punto iniziale dell'asse.
Eran Galperin,

1

Ovunque tu abbia un numero per ogni dimensione per rappresentare qualcosa, la raccolta di questi numeri può essere considerata un vettore. Posizione, velocità e accelerazione sono i primi esempi di vettori. In alcuni casi può anche essere pratico rappresentare la direzione del rivestimento come vettore.

Per cose di base non importa se consideri questi numeri come vettori, ma se vuoi fare qualsiasi tipo di fisica dovresti esaminare la matematica vettoriale.


La posizione non è un vettore
Eran Galperin,

Né è la velocità, è uno scalare, la velocità è un vettore
Maik Semder

2
@Eran Galperin So che è una visione abbastanza diffusa tra i matematici. La distinzione tra un punto e il vettore di posizione corrispondente è tuttavia piuttosto accademica. Non vi è alcun motivo pratico per fare storie sulla distinzione.
aaaaaaaaaaaa,

1
Ci sono ragioni pratiche, una volta che si lavora con 4D coordinate non omogenea e matrici, è necessario fare questa distinzione. Sebbene non sia pertinente per lo scopo di questa domanda.
Maik Semder,

@eBusiness non è una "vista", è un dato di fatto. E sono un fisico per educazione, non un matematico.
Eran Galperin,

0

Molto semplicemente, qualsiasi cosa abbia una posizione, o una direzione, che è ovunque in un gioco usano i vettori. Un vettore è come un punto

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Tuttavia, la differenza sta davvero in questo. Un punto è solo un punto, mentre un vettore è una freccia.

se hai

Point2.x = 5;

Point2.y = 10;

stai dicendo che intendo in questa posizione x 5 e y 10.

tuttavia quando dichiari un vettore ...

Vector2.x = 5;

Vector2.y = 10; 

Il tuo vero detto sto dichiarando una freccia da 0,0 a x 5, y 10;

puoi anche avere il punto da cui punta il tuo vettore da un punto nello spazio da qualsiasi luogo, ad esempio usiamo un punto e un vettore per spostare il nostro oggetto useremo un Punto2 per memorizzare la sua posizione e un vettore2 per spostarlo .

point2.x = 10;

point2.y = 15;

ora puoi usare un vettore per spostare questo punto, diciamo che vogliamo spostare questo punto sull'asse x di 10 unità in modo da avere

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

ora il punto si è spostato nel punto indicato dalla freccia vettoriale.

punto ora è

point2.x = 20;

point2.y = 15;

Un'ultima cosa da notare è che a volte un vettore viene utilizzato come un punto e viceversa solo perché contengono lo stesso tipo di dati.


Un punto è un vettore. È un vettore dalle origini al punto P.
L'anatra comunista

1
@Duck tecnicamente parlando non è corretto, facendo riferimento a coordinate omogenee che il vettore può essere trovato sottraendo il punto di origine dal punto di posizione, ma ciò non li rende uguali: v = pos - originquindi v != pospoiché l'origine è un punto{0, 0, 0, 1}
Maik Semder

@Duck: un punto non è un vettore ma un punto e l'origine definisce un vettore, che è buono come la maggior parte delle volte se l'origine è 0.

@Duck allora perché l'hai chiamato il tuo punto P? LOL
EddieV223
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.