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

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

举例

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

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

【问题讨论】:

标签: math matrix vector three.js


【解决方案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 看这里:stackoverflow.com/a/25216549/2521214 了解有关变换矩阵组合的更多信息。
猜你喜欢
  • 2018-11-30
  • 2016-03-27
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多