如何在 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】:您可以像这样从两个单位长度向量 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 是基于四元数的。但是,如果您坚持,请先对向量进行归一化并设置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 中找到两个向量之间的旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章