Как найти матрицу вращения между двумя векторами в THREE.js

Я ищу способ найти матрицу вращения между двумя определенными векторами в THREE.js.

Например

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

Мне нужна эта матрица вращения, чтобы повернуть весь объект на следующем шаге.

2 ответа

Решение

Вы можете определить вращение из двух векторов длины единицы v1 а также v2 вот так:

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

quaternion.setFromUnitVectors( v1, v2 );

В вашем случае вам нужно сначала нормализовать ваши векторы.

Затем вы можете применить это вращение к объекту, используя следующий шаблон:

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

matrix.makeRotationFromQuaternion( quaternion );

object.applyMatrix( matrix );

В качестве альтернативы, если вам не нужна матрица, вы можете просто применить кватернион напрямую:

object.applyQuaternion( quaternion );

three.js r.86

Вместо этого я использую кватернионы, я бы сделал это так (не используйте THREE.js):

построить матрицу преобразования 4x4 для первого вектора V1 (V1,V2 лежит на своей плоскости XY, а V1 - ось 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;

Теперь примените к нему матрицу преобразования вращения вокруг оси Z.

double angle = acos( (V1.v2)/(|V1|.|V2|) )
  • вращаться вокруг оси Z на угол +/-
  • знак угла зависит от порядка операндов перекрестного произведения оси Y
  • не уверен прямо сейчас с головы, но вы увидите
  • если вы установите его неправильно, V2 будет на противоположной стороне
Другие вопросы по тегам