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

Posted

技术标签:

【中文标题】如何在 THREE.js 中找到两个向量之间的旋转矩阵【英文标题】:How to find rotation matrix between two vectors in THREE.js 【发布时间】:2014-10-01 16:16:30 【问题描述】:

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

举例

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

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

【问题讨论】:

这是一个非 SO 问题,顺便说一句,看这里gamedev.stackexchange.com/questions/20097/… 这是vector3文档threejs.org/docs/#Reference/Math/Vector3 这个问题似乎是题外话,因为它是关于math.stackexchange.com 【参考方案1】:

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

【讨论】:

嗨。谢谢,这似乎有效。不过,如果这个解决方案没有四元数依赖,那就太好了。 three.js 是基于四元数的。但是,如果您坚持,请先对向量进行归一化并设置 axis.cross( v1, v2 ); angle = v1.angleTo( v2 ); matrix.makeRotationAxis( axis, angle ); object.applyMatrix( matrix ); 是的,这正是我要找的。我认为您可以将此添加到您的答案中,然后我会将其标记为已接受。 我在回答中提供的方法在数值上是最稳定的,也是我推荐用户使用的方法。 (顺便说一句,第二种方法具有轴角依赖性——在任何一种情况下都需要一个中间步骤。如果两个向量平行,则轴角没有明确定义。)【参考方案2】:

我不使用四元数,而是这样做(也不要使用 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 会在对面

【讨论】:

您好,感谢您的提示,我正在测试它。 在其上应用围绕 Z 轴的旋转变换矩阵实际上是什么意思。你想让我将矩阵应用于对象,然后围绕 Z 旋转它,所以我们必须应用 2 次旋转? @RecRoot m[] 包含表示 V1 坐标系的变换矩阵。您必须将矩阵 m 乘以将坐标系从 V1 旋转到 V2 的旋转矩阵(围绕 Z 的角度)。如果您应用 objectmrotz 或 M=mrotz 然后 objM 并不重要,唯一的区别是当您创建 M 时,您的操作更少(只需一次乘一个矩阵一个矩阵不是对象的每个顶点......)你可以谷歌如何围绕 Z 旋转的变换矩阵看起来像(它是基本的,我认为你的框架在某些功能中具有原生) @RecRoot btw 看这里:***.com/a/25216549/2521214 了解有关变换矩阵组合的更多信息。

以上是关于如何在 THREE.js 中找到两个向量之间的旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Three.js Object3d 圆柱体旋转以对齐向量

在 Three.js 中基于局部向量定位子网格

Three.js里如何让一个球体相对y轴偏转23°26'旋转(即地球的旋转)?

Three.js - 围绕某个轴旋转球体

如何在轴 three.js 上旋转 3D 对象?

如何在three.js中围绕对象的中心旋转?