2010-02-21 13 views
35

Sto leggendo un libro sull'intelligenza artificiale del gioco.Perché abbiamo bisogno di un vettore di unità (in altre parole, perché dobbiamo normalizzare i vettori)?

Uno dei termini utilizzati è quello di normalizzare un vettore che deve trasformare un vettore in un'unità. Per fare ciò è necessario dividere ciascuna dimensione x, e z in base alla sua grandezza.

Dobbiamo trasformare il vettore in un'unità prima di fare qualsiasi cosa con esso. Perché?

E qualcuno potrebbe fornire alcuni scenari in cui è necessario utilizzare un vettore di unità?

Grazie!

risposta

32

Non è necessario normalizzare i vettori, ma rende un sacco di equazioni un po 'più semplice quando si esegue. Potrebbe anche rendere le API più piccole: qualsiasi forma di standardizzazione ha il potenziale per ridurre il numero di funzioni necessarie.

Ecco un semplice esempio. Supponiamo di voler trovare l'angolo tra due vettori uev. Se si tratta di vettori unitari, l'angolo è solo arccos (u v). Se non sono vettori unitari, l'angolo è arccos (u v/(| u | | v |)). In tal caso, finirai comunque a calcolare le norme di uev.

+1

Credo che sia necessario normalizzare il quaternion per la rotazione. –

+1

@afriza: un quaternion è una bestia diversa da un vettore unitario, tuttavia hai ragione che il set di quaternioni di unità ti fornisce l'insieme di tutte le rotazioni – zebrabox

8

Si normalizza spesso un vettore perché si preoccupa solo della direzione del vettore e non della magnitudine.

Uno scenario concreto è Normal Mapping. Combinando la luce che colpisce la superficie e i vettori che sono perpendicolari alla superficie si può dare un'illusione di profondità. I vettori dalla superficie definiscono la direzione parallela e la grandezza del vettore renderebbe reali i calcoli errati.

6

Dobbiamo trasformare un vettore in unità prima di fare qualsiasi cosa con esso.

Questa dichiarazione non è corretta. Tutti i vettori non sono vettori unitari.

I vettori che costituiscono la base per uno spazio di coordinate hanno due proprietà molto bello che li rendono facile da lavorare:

  1. Sono ortogonale
  2. Sono vettori unitari - di magnitudo = 1

questo modo è possibile scrivere qualsiasi vettore in uno spazio 3D come combinazione lineare di vettori unitari:

alt text http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif

posso scegliere di trasformare questo vettore in un vettore unitario se ho bisogno di dividendo ogni componente dalla grandezza

alt text http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif

Se non sai che coordinano gli spazi o vettori di base sono, io ti consiglio di imparare un po 'di più sulla matematica della grafica prima di andare molto oltre.

+0

consiglieresti qualsiasi risorsa o libro che dovrei esaminare. Grazie – numerical25

+0

Qualsiasi libro sui fondamenti dei vettori 3D farà. Tutti i libri di grafica computerizzata li esamineranno pure. È più che semplici vettori. I vettori delle unità hanno a che fare con la definizione dei sistemi di coordinate e le trasformazioni sono comuni, quindi è necessario conoscere un po 'di informazioni sulle matrici. – duffymo

+0

+1 E significa anche che i vettori unitari (i, j, k) formano una base ortonormale sia nello spazio locale che nello spazio mondiale. – zebrabox

23

Come dice John D. Cook - principalmente lo stai facendo perché ti interessa la direzione, non il vettore stesso.A seconda del contesto, è molto probabile che tu non voglia/abbia bisogno delle informazioni sulla magnitudine - solo la direzione stessa. Si normalizza per rimuovere la magnitudine in modo che non altera altri calcoli, il che a sua volta semplifica molte altre cose.

In termini di intelligenza artificiale - immagina di prendere il vettore V tra P1 (il cattivo cattivo dell'IA) e P2 (il tuo eroe) come la direzione da spostare del cattivo. Vuoi che il cattivo si muova ad una velocità N per battito - come lo calcoli? Bene, normalizziamo il vettore a ogni battito, moltiplichiamo per N per capire fino a che punto si muovono, o pre-normalizziamo la direzione in primo luogo, e moltiplichiamo il vettore unitario per N ogni volta - altrimenti il ​​cattivo si muoverà inoltre se fosse più lontano dall'eroe! Se l'eroe non cambia posizione, questo è un calcolo in meno di cui preoccuparsi.

In questo contesto, non è un grosso problema - ma cosa succede se si dispone di un centinaio di cattivi? O mille? Cosa succede se la tua IA ha bisogno di affrontare combinazioni di cattivi? All'improvviso ci sono centomila normalizzazioni che stai risparmiando per battito. Poiché questa è una manciata di moltiplicatori e una radice quadrata per ognuno, alla fine si raggiunge il punto in cui non normalizzare i dati prima del tempo significa che si sta per uccidere la velocità di elaborazione dell'IA.

Più in generale, la matematica per questo è molto comune - le persone stanno facendo qui quello che fanno per cose come il rendering 3D - se non hai unito, ad esempio, le normali per le tue superfici, avresti potenzialmente migliaia di normalizzazioni per rendering che sono completamente inutili. Sono disponibili due opzioni: una: ciascuna funzione esegue il calcolo o due - pre-normalizza i dati.

Dal punto di vista del progettista di quadri: quest'ultimo è intrinsecamente più veloce - se assumiamo il primo, anche se il tuo utente pensa di normalizzare i dati, dovrà passare attraverso la stessa routine di normalizzazione O stai andando avere due versioni di ciascuna funzione, che è un mal di testa. Ma al punto che stai facendo riflettere sulla versione della funzione da chiamare, puoi anche far sì che pensino abbastanza da chiamare quella corretta e, in primo luogo, fornirla, facendo in modo che facciano la cosa giusta per le prestazioni .

+1

Questa risposta a questa domanda è la migliore per me. Ottima spiegazione! – Tone

+0

ciao, dove John D. Cook dice che ho bisogno di riferirlo – MonsterMMORPG

Problemi correlati