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

Math 如何在THREE.js中找到两个向量之间的旋转矩阵,math,matrix,vector,three.js,Math,Matrix,Vector,Three.js,我正在寻找在THREE.js中找到两个定义向量之间的旋转矩阵的方法 比如说 v1=新的三个矢量3(1,1,1) v2=新的三个向量3(1,1,-1) 我需要这个旋转矩阵来在下一步旋转整个对象。您可以从两个单位长度向量v1和v2定义旋转,如下所示: var quaternion = new THREE.Quaternion(); // create one and reuse it quaternion.setFromUnitVectors( v1, v2 ); 在您的情况下,首先需要规范化向

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

比如说

v1=新的三个矢量3(1,1,1)
v2=新的三个向量3(1,1,-1)


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

您可以从两个单位长度向量
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):

为第一个向量V1构造4x4变换矩阵(V1,V2位于其XY平面上,V1为X轴)

现在围绕Z轴应用旋转变换矩阵

double angle = acos( (V1.v2)/(|V1|.|V2|) )
  • 绕Z轴旋转+/-角度
  • 角度符号取决于Y轴叉积操作数的顺序
  • 现在还不确定,但你会看到的
  • 如果设置错误,V2将位于另一侧

这是一个非常规问题,顺便说一句,看看这里,这是vector3文档。这个问题似乎离题了,因为它是关于Hi的,谢谢你的提示,我正在测试它。你们所说的绕Z轴旋转变换矩阵是什么意思。您想让我将矩阵应用于对象,然后围绕Z旋转它,因此我们必须应用2次旋转?@RecRoot m[]包含表示V1坐标系的变换矩阵。必须将矩阵m乘以旋转矩阵(围绕Z乘以角度),旋转矩阵将坐标系从V1旋转到V2。如果应用objectmrotz或M=mrotz,然后应用objM,这并不重要。唯一的区别是,当您创建M时,您的操作更少(只需将矩阵乘以矩阵一次,而不是对象的每个顶点…),您可以在谷歌上搜索围绕Z旋转的变换矩阵的外观(它是基本的,我认为您的框架在某些功能上是固有的)@重新启动btw查看此处:有关transform matrix composition.Hi的更多信息。谢谢,这似乎很有效。如果这个解决方案没有四元数依赖项,那就太好了。three.js是基于四元数的。但是如果您坚持,请先规范化向量,然后设置
axis.cross(v1,v2);angle=v1.angleTo(v2);matrix.makeRotationAxis(轴,角度);object.applyMatrix(矩阵);
是的,这正是我要找的。我想你可以把它添加到你的答案中,然后我会把它标记为接受。我在答案中提供的方法是数值上最稳定的,也是我推荐用户使用的方法。(另一方面,第二种方法具有轴角度依赖性——在任何一种情况下都需要中间步骤。如果两个向量平行,则轴角度定义不明确。)
double angle = acos( (V1.v2)/(|V1|.|V2|) )