如何在THREE.js中找到两个向量之间的旋转矩阵

时间:2014-08-08 08:33:32

标签: math matrix vector three.js

我正在寻找在THREE.js中找到两个定义矢量之间的旋转矩阵的方法。

例如

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

我需要这个旋转矩阵来在下一步中旋转整个对象。

2 个答案:

答案 0 :(得分:16)

您可以定义两个单位长度向量v1v2的旋转,如下所示:

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

答案 1 :(得分:1)

我不使用四元数而是像这样做(不要使用THREE.js):

构造第一个矢量V1的4x4变换矩阵(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将在对面
相关问题