2010-06-15 11 views

risposta

16

Posso pensare a un paio di scenari diversi di cui potreste chiedere informazioni.


Dato: Un pre-esistente sistema di coordinate

  • In un sistema 2D, tuoi assi/basis sono sempre [1,0] e [0,1] - x e y assi.

  • In un sistema 3D, tuoi assi/base sono sempre [1,0,0], [0,1,0] e [0,0,1] - x, y e z.


Dato: un asse in un 2D arbitraria base sistema di coordinate

Se ha un asse in un 2D arbitrario-base del sistema di coordinate, l'altro asse è il vettore ortogonale.

Per ruotare un vettore ortogonale antiorario:

[x_new, y_new] = [ -y_old, x_old] 

Per ruotare un vettore ortogonale senso orario:

[x_new, y_new] = [ y_old, -x_old] 

Riassumendo:

Given: x-axis = [ a, b] 
Then: y-axis = [-b, a] 

Given: y-axis = [ c, d] 
Then: x-axis = [ d, -c] 

Dato: due assi in modo arbitrario-base 3D sistema di coordinate

Per fare questo, trovare il prodotto vettoriale.

[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ] 

Queste seguenti tre orientamenti:

  • (x asse) x (y asse) = (z asse)
  • (y asse) x (z asse) = (x asse)
  • (z asse) x (x asse) = (y asse)

Dato: un asse in 3D arbitraria base sistema di coordinate

c'è informazioni insufficienti per trovare la soluzione unica questo problema. Questo perché, se si guarda il secondo caso (un asse in un sistema di coordinate 2D con base arbitraria), è necessario prima trovare un vettore ortogonale. Tuttavia, ci sono una quantità infinita di possibili vettori ortogonali su un singolo asse nello spazio 3D!

È tuttavia possibile trovare una delle possibili soluzioni.

Un modo per trovare un arbitrario uno di questi vettori ortogonali, trovando ogni vettore [d,e,f] dove:

[a,b,c] = original axis 
[d,e,f] = arbitrary orthogonal axis (cannot be [0,0,0]) 

a*d + b*e + c*f = 0 

Ad esempio, se l'asse originale è [2,3,4], devi risolvere:

2 * d + 3 * e + 4 * f = 0 

Vale a dire, qualsiasi valore di [d,e,f] che soddisfi questo è un vettore ortogonale soddisfacente (purché non sia [0,0,0]). Si potrebbe raccogliere, ad esempio, [3,-2,0]:

2 * 3 + 3 *-2 + 4 * 0 = 0 
    6 + -6 + 0 = 0 

Come si può vedere, una "formula" che lavora per è [d,e,f] = [b,-a,0] ... ma ci sono molti altri quelli che possono funzionare pure; ci sono, infatti, un infinito!

Una volta trovato i tuoi due assi [a,b,c] e [d,e,f], è possibile ridurre questo ritorno al caso precedente (caso 3), utilizzando [a,b,c] e [d,e,f] come i vostri assi X e Y (o qualunque assi è necessario che siano, per la vostra problema specifico).


Normalizzazione

Si noti che, come si fa continuamente prodotto scalare e prodotti incrociati, i vettori inizieranno a crescere sempre più grandi. A seconda di ciò che desideri, questo potrebbe non essere desiderato. Ad esempio, potresti desiderare che i tuoi vettori di base (i tuoi assi di coordinate) abbiano la stessa dimensione/lunghezza.

per trasformare qualsiasi vettore (eccetto [0,0,0]) in un versore (un vettore con una lunghezza di 1, nella stessa direzione del vettore originale):

r = [a,b,c] 
v = Sqrt(a^2 + b^2 + c^2) <-- this is the length of the original vector 
r' = [ a/v , b/v , c/v ] 

Dove r' rappresenta l'unità vettore di r - un vettore con lunghezza 1 che punta nella stessa direzione di r. Un esempio:

r = [1,2,3] 
v = Sqrt(1^2 + 2^2 + 3^2) = Sqrt(13) = 3.60555 <-- this is the length of the original vector 
r' = [0.27735, 0.55470, 0.83205] 

Ora, se avessi voluto, per esempio, un vettore nella stessa direzione di r con una lunghezza di 5, mi piacerebbe semplicemente moltiplicare fuori r' * 5, che è [a' * 5, b' * 5, c' * 5].

+0

Se sta usando la simulazione o il software di gioco, potrebbe avere la rotazione degli oggetti, il che renderebbe abbastanza facile trovare gli altri due assi. – LanceH

+2

La domanda è onestamente piuttosto vaga =/ –

+0

Quindi in sintesi poi Justin: Innanzitutto si usa la regola del prodotto punto che due vettori ortogonali hanno un punto prodotto zero, per ottenere il secondo asse. Quindi utilizzare il prodotto incrociato di questi due assi per ottenere il 3o asse. Capisco tutto questo. L'unica domanda che ho è come si ottiene l'asse ortogonale arbitrario di dire un vettore di {4.418020, -6.474061, -6.210284} – Stoff81

0

Stai parlando di un tipico sistema a 3 coordinate come quello utilizzato in un motore 3D?

Con un vettore non puoi trovare gli altri due, l'unica informazione che avrai l'aereo su cui giacciono .. ma possono essere a qualsiasi angolo anche se sono perpendicolari con l'unico vettore hai.

3

Avere un solo asse non è sufficiente, poiché c'è ancora un numero infinito di assi che possono essere nel piano perpendicolare.

Se riesci a ottenere un altro asse, puoi utilizzare il prodotto incrociato per trovare il terzo.

+0

Come può essere vero che "Avere un solo asse non è sufficiente" quando dici immediatamente che ci sono un numero infinito di vettori adatti e nel tuo prossimo paragrafo tu dì come procedere dato che è stato trovato un vettore adatto? – sigfpe

+6

Non collegarmi alla voce "if" su dictionary.reference.com ... –

1

Se si dispone di un vettore (x, y, z) è possibile ottenere un vettore perpendicolare ad esso come (y, -x, 0) (dot-prodotto x yy x + 0 * z = 0)

Quindi si ottiene il cross-product di entrambi per ottenere il vettore perpendicolare rimanente: (x, y, z) × (y, -x, 0) = (0y + zx, ​​yz-0x, -x²- y²) = (zx, yz, -x²-y²)

+2

Sia (x, y, z) = (0,0,1). Il vettore (y, -x, 0) è (0,0,0). Quello è un vettore zero. – sigfpe

+0

@ user207442: la descrizione del problema indica che il vettore non è allineato ad un asse. Se (x, y, z) = (0,0,1) trovare gli altri due vettori è banale. – Ozan

Problemi correlati