XYZ旋转平移和倾斜

时间:2014-02-09 19:21:00

标签: c++ matrix 3d rotation euler-angles

我正试图从我的电脑控制某个方向的摇头摄像头。摄像机仅由平移(540度)和倾斜(280度)控制。问题是让欧拉角度达到这些平移和倾斜度。

我有一个方向的3d表示,让我们说X Y和Z旋转(欧拉角)。

现在我想将我的(物理!)云台相机向同一方向移动。但我无法弄清楚如何将xyz矢量转换为平移倾斜。

1 个答案:

答案 0 :(得分:0)

切换到正交均匀4x4变换矩阵

  • 欧拉角吸吮复杂的记忆动作。
  • M是您的4x4相机变换矩阵

围绕全球世界X轴旋转:

double c=cos(ang),s=sin(ang);
double Q[16]=
    {
    1, 0, 0, 0,
    0, c,-s, 0,
    0, s, c, 0,
    0, 0, 0, 1
    };
M=M*Q;

通过ang:

围绕局部相机X轴旋转
double c=cos(ang),s=sin(ang);
double Q[16]=
    {
    1, 0, 0, 0,
    0, c,-s, 0,
    0, s, c, 0,
    0, 0, 0, 1
    };
M=((M^-1)*Q)^-1;

有像glm这样的变换矩阵的库,但我更喜欢我自己的

  • 我知道很多人会不同意,但我的在这里的时间比任何其他公众都长。
  • 我习惯了
  • 的想法是始终记住M的直接矩阵和逆矩阵
  • 有一个标志,其中一个更新,而不是
  • 并且在任何操作之前检查所使用的矩阵是否相关
  • 如果没有,那么从另一个
  • 计算它
  • 还会在达到阈值后添加操作计数
  • 做正交性或正交性检查/校正

在这里你可以看到同质(4x4)和普通(3x3 + 1x3)三维变换矩阵之间的差异:

现在驾驶相机

  • 我将在4x4变换矩阵
  • 上面的链接中引用我的图像
  • 我通常使用Z轴作为移动/观察方向
  • 所以在开始时将矩阵重置为单位或根据需要将其设置为其位置和方向
  • 如果要旋转使用本地旋转
  • 当您想要移动时,只需添加到您要移动的位置x0,y0,z0(在全局坐标中)
  • 因此,如果d单位执行此操作,则向前移动:

    x0+=d*Zx;
    y0+=d*Zy;
    z0+=d*Zz;
    
  • 侧移使用X vector

  • 用于向上/向下使用Y矢量
  • 对于旋转不同,然后围绕X轴只使用不同的Q矩阵

  • 围绕Y轴旋转

     c, 0, s, 0,
     0, 1, 0, 0,
    -s, 0, c, 0,
     0, 0, 0, 1;
    
  • 围绕Z轴旋转

     c,-s, 0, 0,
     s, c, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1;