2014-08-08 14 views
6

Sto cercando il modo per trovare la matrice di rotazione tra due vettori definiti in THREE.js.Come trovare la matrice di rotazione tra due vettori in THREE.js

Per esempio

v1 = new THREE.Vector3(1, 1, 1) v2 = new THREE.Vector3(1, 1, -1)

ho bisogno di questa matrice di rotazione per ruotare intero oggetto in fase successiva.

+1

E 'un non so domanda, btw guarda qui http://gamedev.stackexchange.com/questions/20097/how- to-calculate-a-3x3-rotation-matrix-from-2-direction-vectors –

+0

e questa è la documentazione di vector3 http://threejs.org/docs/#Reference/Math/Vector3 –

+0

Questa domanda sembra essere off- argomento perché si tratta di http://math.stackexchange.com/ –

risposta

14

È possibile definire una rotazione da due vettori unità di lunghezza v1 e v2 in questo modo:

var quaternion = new THREE.Quaternion(); // create one and reuse it 

quaternion.setFromUnitVectors(v1, v2); 

Nel tuo caso, è necessario normalizzare i vettori prima.

Si può quindi applicare la rotazione a un oggetto utilizzando il seguente schema:

var matrix = new THREE.Matrix4(); // create one and reuse it 

matrix.makeRotationFromQuaternion(quaternion); 

object.applyMatrix(matrix); 

In alternativa, se non si richiede la matrice, si può solo applicare il quaternione direttamente:

object.applyQuaternion(quaternion); 

three.js r.86

+0

Ciao. Grazie, sembra funzionare. Sarebbe bello avere questa soluzione senza la dipendenza da Quaternion, però. – kriskodzi

+3

three.js è basato su quaternion. Ma se insisti, normalizza prima i vettori e imposta 'axis.cross (v1, v2); angle = v1.angleTo (v2); matrix.makeRotationAxis (asse, angolo); object.applyMatrix (matrix); ' – WestLangley

+0

Sì, questo è esattamente quello che sto cercando. Penso che tu possa aggiungere questo alla tua risposta, quindi la contrassegnerò come accettata. – kriskodzi

1

Io invece uso i quaternioni invece lo farei in questo modo (non utilizzare neanche THREE.js):

costrutto 4x4 trasformata matrice per primo V1 vettore (V1, V2 depone sul suo piano XY e V1 è asse X)

double V1[3],V2[3]; // input 
double X[3],Y[3],Z[3],P[3]; // output 
double m[16]; // OpenGL like transform matrix 
X = V1; 
Z = V1 x V2; 
Y = X x Z; 
X/=|X|; 
Y/=|Y|; 
Z/=|Z|; 
P = (0,0,0); 
m[ 0]=X[0]; 
m[ 1]=X[1]; 
m[ 2]=X[2]; 
m[ 3]=0; 
m[ 4]=Y[0]; 
m[ 5]=Y[1]; 
m[ 6]=Y[2]; 
m[ 7]=0; 
m[ 8]=Z[0]; 
m[ 9]=Z[1]; 
m[10]=Z[2]; 
m[11]=0; 
m[12]=P[0]; 
m[13]=P[1]; 
m[14]=P[2]; 
m[15]=1; 

ora riferimento rotazione trasformare matrice attorno all'asse Z sopra

double angle = acos((V1.v2)/(|V1|.|V2|)) 
  • ruotare attorno all'asse Z di +/- angolo
  • l'angolo segno dipende sull'asse Y attraversano operandi prodotto di ordine
  • non
  • certo momento dal testa, ma si vedrà
  • se si imposta male l'V2 sarà sul lato opposto
+0

Ciao, grazie per il tuo suggerimento, I lo sto solo testando Cosa intendi per _apply rotation trasformare la matrice attorno all'asse Z su di esso_.Vuoi che applichi la matrice all'oggetto e quindi la ruoti attorno a Z, quindi dovremo applicare 2 rotazioni? – kriskodzi

+1

@RecRoot m [] contiene una matrice di trasformazione che rappresenta il sistema di coordinate di V1. devi moltiplicare la matrice m per matrice di rotazione (attorno a Z per angolo) che ruota il sistema di coordinate da V1 a V2. Non importa se applichi l'oggetto * m * rotz o M = m * rotz e quindi obj * M l'unica differenza è quando crei M quindi hai meno operazioni (solo una volta moltiplicare matrice per matrice non per ogni vertice di oggetto. ..) puoi google come appare la matrice di trasformazione per la rotazione attorno a Z (è di base e penso che il tuo framework abbia nativamente in qualche funzione) – Spektre

+0

@RecRoot btw guarda qui: http://stackoverflow.com/a/25216549/ 2521214 per maggiori informazioni sulla composizione della matrice di trasformazione. – Spektre

Problemi correlati