Domanda

Ho una linea (in realtà un cubo) che va da (x1, y1, z1) a (x2, y2, z2). Vorrei ruotarlo in modo che sia allineato lungo un'altra linea che va da (x3, y3, z3) a (x4, y4, z4). Attualmente sto usando Math :: Atan2 insieme a Matrix :: RotateYawPitchRoll . Qualche modo migliore per farlo?

Modifica: penso di aver scritto questo post molto male. Quello che sto effettivamente cercando è una matrice di rotazione da due vettori.

È stato utile?

Soluzione

Sì, puoi farlo senza bisogno di pensare in termini di angoli.

Dato che hai un cubo, supponi di scegliere un angolo e quindi definire i 3 bordi che si irradiano da esso come vettori f0, f1, f2 (questi sono vettori di direzione, relativi all'angolo che hai scelto). Normalizza quelli e scrivili come colonne in una matrice F

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

Ora fai la stessa cosa per i vettori t0, t1, t2 del cubo su cui vuoi ruotare e chiamalo matrice T.

Ora la matrice R = T * Inversa (F) è la matrice che ruota dall'orientamento del primo cubo all'orientamento del secondo (perché le mappe F inverse, ad es. f0 a (1 0 0) ', e quindi T mappe (1 0 0) "a t0).

Se vuoi sapere perché funziona, pensa in termini di vettori di base del sistema di coordinate: se vuoi ruotare gli assi XY e Z su un nuovo sistema di coordinate, anche le colonne della matrice di rotazione sono solo i vettori che desideri (1 0 0) ', (0 1 0)' & amp; (0 0 1) 'da mappare. T * Inverse (F) sta effettivamente ruotando il cubo dal suo orientamento originale all'asse allineato, quindi all'orientamento desiderato.

(Spiacente, sopra è per i vettori di colonna e le trasformazioni a sinistra, stile OpenGL. Mi sembra di ricordare che Direct3D è vettori di riga e trasformazioni a destra, ma dovrebbe essere ovvio come cambiarlo).

Si applica ugualmente anche alle matrici 4x4 con un componente di traduzione.

Altri suggerimenti

Potresti voler aggiungere come interpolare effettivamente le matrici. Le matrici di origine e destinazione vanno bene nella tua risposta, ma calcolare l'inverso è inutile. I quaternioni ti daranno il percorso rotazionale più breve, quindi prendi le matrici rotazionali 3x3 su entrambe le matrici, converti in quaternioni e esegui quelle. Fare un lerp separato per la traduzione e ricomporre. Google per quaternione - matrice e conversioni posteriori e quaternione lerp.

Modifica: una matrice di rotazione da un vettore in avanti e in alto è banale. La colonna mancante è il prodotto incrociato degli altri due vettori. (non dimenticare di normalizzare le colonne).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top