XYZ旋转以平移和倾斜

XYZ rotation to pan and tilt

本文关键字:倾斜 旋转 XYZ      更新时间:2023-10-16

我正试图从电脑上控制一个朝某个方向移动的头部摄像头。相机仅通过平移(540度)和倾斜(280度)进行控制。问题是获得这些平移和倾斜角度的欧拉角。

我有一个方向的三维表示,比方说X、Y和Z旋转(欧勒角)。

现在我想把我的(物理!)云台相机移到同一个方向。但我不知道如何将xyz矢量转换为平移倾斜。

切换到正交齐次4x4变换矩阵

  • euler角对于复杂的记忆运动来说很糟糕
  • M是您的4x4相机变换矩阵

通过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*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)3D变换矩阵之间的差异:

  • https://stackoverflow.com/a/21611264/2521214

现在相机的驱动

  • 我将参考4x4变换矩阵上方链接中的图像
  • 我通常使用Z轴作为移动/查看方向
  • 因此,在开始时,根据需要将矩阵重置为单位或设置为其位置和方向
  • 如果要旋转,请使用局部旋转
  • 当你想移动时,只需将你想移动的集合(在全局坐标中)添加到位置x0,y0,z0
  • 因此,如果d个单位这样做,则向前移动:

    x0+=d*Zx;
    y0+=d*Zy;
    z0+=d*Zz;
    
  • 对于侧面移动,使用X矢量

  • 对于向上/向下使用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;