在三维空间中旋转向量

我正在制作一个机器人项目,使用加速度计计算变化的具体轴,我的目标是旋转我的航天器样的对象的运动矢量。问题是我无法理解旋转矩阵背后的数学。默认的移动向量是0,1,0,表示 + y,所以对象在开始向上看。我试着旋转它的运动矢量,这样我就能把物体移动到它指向的地方。我可以在手机里收集轮换信息。X 轴: 旋转[0] ,y 轴: 旋转[1] ,z 轴: 旋转[2]。如何使用旋转矩阵旋转我的运动矢量?

247708 次浏览

如果你想旋转一个向量,你应该构造一个 旋转矩阵旋转矩阵

二维旋转

假设你想把一个向量或者一个点旋转 θ 然后 三角学表明新的坐标是

    x' = x cos θ − y sin θ
y' = x sin θ + y cos θ

为了演示这个,让我们取 主轴X 和 Y; 当我们逆时针旋转 X 轴90 ° 时,我们应该最终将 X 轴转换成 Y 轴。考虑一下

    Unit vector along X axis = <1, 0>
x' = 1 cos 90 − 0 sin 90 = 0
y' = 1 sin 90 + 0 cos 90 = 1
New coordinates of the vector, <x', y'> = <0, 1>  ⟹  Y-axis

当您理解了这一点,创建一个矩阵来完成这项工作就变得很简单了。矩阵只是一个数学工具,用于以一种舒适的、通用的方式执行这种转换,以便诸如 旋转规模翻译(移动)之类的各种转换可以组合在一起,并使用 一种常用的方法在单个步骤中执行。从线性代数出发,要在2D 中旋转一个点或向量,需要构建的矩阵是

    |cos θ   −sin θ| |x| = |x cos θ − y sin θ| = |x'|
|sin θ    cos θ| |y|   |x sin θ + y cos θ|   |y'|

3D 旋转

在3D 中,我们需要考虑第三个轴。在2D 中,旋转一个矢量围绕原点(一个点)只是意味着在3D 中旋转它围绕 Z 轴(一条线) ; 因为我们围绕 Z 轴旋转,它的坐标应该保持不变,即0 ° (旋转发生在3D 的 XY 平面上)。在3D 环绕 Z 轴旋转

    |cos θ   −sin θ   0| |x|   |x cos θ − y sin θ|   |x'|
|sin θ    cos θ   0| |y| = |x sin θ + y cos θ| = |y'|
|  0       0      1| |z|   |        z        |   |z'|

围绕 Y 轴

    | cos θ    0   sin θ| |x|   | x cos θ + z sin θ|   |x'|
|   0      1       0| |y| = |         y        | = |y'|
|−sin θ    0   cos θ| |z|   |−x sin θ + z cos θ|   |z'|

围绕 X 轴

    |1     0           0| |x|   |        x        |   |x'|
|0   cos θ    −sin θ| |y| = |y cos θ − z sin θ| = |y'|
|0   sin θ     cos θ| |z|   |y sin θ + z cos θ|   |z'|

注1 : 绕其旋转的轴在矩阵中没有正弦或余弦元素。

注2: 此旋转方法遵循 欧拉角旋转系统,教学简单,易于掌握。对于2D 和简单的3D 情况,这种方法完全可行; 但是,当旋转需要同时围绕所有三个轴进行时,由于这个系统固有的缺陷(表现为 万向节锁) ,欧拉角可能不足以满足要求。在这种情况下,人们求助于 四元数,它比这个更先进,但是在正确使用时不会受到万向节锁的影响。

我希望这能澄清基本的轮班制。

旋转与革命

上述矩阵沿着半径为 r 的圆从原点旋转一个距离 r = √(x2 + y2)的对象,查找 极坐标以了解原因。这个旋转将相对于世界空间原点,即 革命在轨道上运行。通常我们需要旋转一个物体围绕它自己的框架/枢轴,而不是围绕世界的本地起源。这也可以看作是 r = 0的特殊情况。由于并非所有的物体都是世界起源的,仅仅使用这些矩阵旋转不会得到围绕物体自身框架旋转的期望结果。相反,你会

  1. 把物体翻译成世界起源
    • 物体的原点将与世界的原点对齐,使 r = 0
  2. 用一个(或多个)上述旋转矩阵旋转
  3. 再次将对象翻译回其以前(原始)的位置。

应用转换的顺序 事宜

转换的组合/串联

因为矩阵不仅可以表示旋转,还可以表示平移、缩放等等,所以 旋转与革命中的三个操作都可以写成矩阵。当它们相乘时,我们得到一个矩阵,它按顺序完成所有三个运算。当结果矩阵与一个对象的点相乘时,该对象将围绕 它的轴旋转(在其局部空间中)。将多个转换组合在一起称为 连接作文

我强烈建议您在使用代码中的转换之前,先阅读关于线性和仿射转换及其组合以一次执行多个转换的内容。如果不理解其背后的基本数学原理,调试转换将是一场噩梦。我发现 这个演讲视频是一个很好的资源。另一个资源是 本教程介绍转换,它的目标是直观,并用动画说明想法(注意: 作者是我!).

任意向量的旋转

如果你只需要像问题中提到的那样围绕基轴(X,Y 或 Z)旋转,那么上述矩阵的乘积应该足够了。但是,在许多情况下,您可能希望绕任意轴/向量旋转。罗德里格斯的公式(又名轴角公式)是解决这个问题的常用方法。但是,只有当你只能使用向量和矩阵的时候才能使用它。如果您使用的是 四元数,只需构建一个具有所需矢量和角度的四元数。四元数是存储和操作3D 旋转的一个优越的替代方案,它是紧凑的 还有快速轴角,例如,连接两个旋转是相当昂贵的,适度的矩阵,但便宜的四元数。通常所有的旋转操作都是使用四元数来完成的,并且在上传到呈现管道时作为转换为矩阵的最后一步。请参阅 理解四元数了解关于四元数的入门知识。

我推断向量的 X 分量应该是 M * cos (o) < em > cos (t) + x, Y 分量应该是 M cos (t) Sin (o) + y,z 分量应该是 Mcos (o) * sin (t) + z,其中 M 是矢量的大小,o 是垂直面上的旋转角度,t 是水平面上的角度旋转,x 是旋转中心的 x 值,y 是旋转中心的 y 值,z 是旋转中心的 z 值。请告诉我这是否适合你。译注: