两组向量之间的四元旋转

Quaternion Rotation Between Two Sets of Vectors

本文关键字:旋转 四元 向量 两组 之间      更新时间:2023-10-16

我希望在3D中找到两组两个向量之间的旋转,作为四个矢量。在每对中,向量将彼此成直角并具有单位长度(基本上是两个矢量为基础)。

我当前的代码看起来像这样:

Vector3 look1, up1, right1, look2, up2, right2;
// look1, up1, right1 form orthonormal basis,
// ditto with look2, up2, and right2
Vector3 lookRotateAxis = look1 % look2;
// operator% defined as cross product for convenience
float lookRotateAngle = acos(look1 * look2);
// operator* defined as dot product for convenience
Quaternion lookRotate;
lookRotate.makeRotation(lookRotateAngle, lookRotateAxis);
up1Transformed = lookRotate.rotateVector(up1);
Vector3 upRotateAxis = up1Transformed % up2;
float upRotateAngle = up1Transformed * up2;
Quaternion upRotate;
upRotate.makeRotation(upRotateAngle, upRotateAxis);
Quaternion finalRotation = upRotate * lookRotate;
// quaternion finalRotation rotates basis 1 to basis 2

我现在使用的方法是首先找到两个向量之间的四个旋转,然后乘以每对两个向量之间的四个向量之间的四个旋转。这导致一个四元组,我可以通过将两个向量旋转以获取其他两个向量。是否有一种更简单的方法来计算四个季节,而不是通过乘以两个旋转,而是计算单个旋转的方法?

谢谢!

我认为有可能快速有效地做您想做的事情。首先,您应该将每对正顺序对向量完成为正顺序。这样做的明显方法是将前两个向量的交叉产品占据。订单问题:如果您希望U0映射到V0和U1映射到V1,则形成正顺序{U0,U1,U2}其中U2 = U0 X U1(跨产品),也形成正顺序基础{V0,V1,V1,v2}其中v2 = v0 x v1,然后将u2映射到v2。如果您不小心并设置V2 = V1 X V0,则最终会出现不可能的情况(尝试将右手坐标系映射到具有旋转的左手坐标系)。因此,请注意跨产品中的条款顺序。

现在,您拥有两个正直基碱基或框架,构建正交矩阵很容易代表从{x,x,y,z}框架到给定帧的旋转。(同样,您必须考虑{x,y,z}框架的方向或交接性...例如,您可能必须使用{x,z,y}。正交矩阵代表从框架{x,y,z}到{u0,u1,u2}的旋转

[u00 u01 u02]
[u10 u11 u12]
[u20 u21 u22]

根据计算机图形的常规公约,我们通过矩阵预言矢量。因此,例如,我们的矩阵对(1,0,0)的影响是

        [u00 u01 u02]
[1 0 0] [u10 u11 u12] = [u00 u01 u02]
        [u20 u21 u22]

这正是我们想要的;{x,y,z}中的其他两个基础向量也相同。

要将一个框架映射到另一帧,我们以中间设备的形式浏览框架{x,y,z}。因此,我们必须找到第一个正交矩阵的倒数。幸运的是,反转正交矩阵非常容易:您只需进行转置即可。因此,要将框架{U0,U1,U2}映射到框架{V0,V1,V2},请使用Matrix产品

[u00 u10 u20] [v00 v01 v02]
[u01 u11 u21] [v10 v11 v12]
[u02 u12 u22] [v20 v21 v22]

让我们看看当我们将向量u1 = [u10,u11,u12]输入此矩阵乘积时会发生什么:

              [u00 u10 u20] [v00 v01 v02]           [v00 v01 v02]
[u10 u11 u12] [u01 u11 u21] [v10 v11 v12] = [0 1 0] [v10 v11 v12] = [v10 v11 v12]
              [u02 u12 u22] [v20 v21 v22]           [v20 v21 v22]

根据需要。在这里,我们使用了公式U1。U0 = 0,U1。U1 = 1,U1。u2 = 0,从{u0,u1,u2}作为正顺序框架。

因此,代表您想要的旋转的正交矩阵完全是

[u00 u10 u20] [v00 v01 v02]
[u01 u11 u21] [v10 v11 v12]
[u02 u12 u22] [v20 v21 v22]

执行矩阵乘法以获取单个矩阵,然后,如果您想要Quaternion表示形式,请通过http://en.wikipedia.org/wiki/rotation_matrix#quaternion中描述的方法从旋转矩阵转换为quaternion。