1

我正在尝试从我的计算机向某个方向控制摇头相机。摄像机仅由平移(540 度)和倾斜(280 度)控制。问题是将欧拉角与这些平移和倾斜度数相匹配。

我有一个方向的 3d 表示,比如说 XY 和 Z 旋转(欧勒角)。

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

4

1 回答 1

1

切换到正交同质 4x4 变换矩阵

  • 欧拉角不适合复杂的记忆运动。
  • 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;

围绕本地摄像机 X 轴旋转 ang:

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 变换矩阵之间的差异:

现在相机的驱动

  • 我将在上面的 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;
    
于 2014-02-12T09:13:42.357 回答