Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ XYZ旋转到平移和倾斜_C++_Matrix_3d_Rotation_Euler Angles - Fatal编程技术网

C++ XYZ旋转到平移和倾斜

C++ XYZ旋转到平移和倾斜,c++,matrix,3d,rotation,euler-angles,C++,Matrix,3d,Rotation,Euler Angles,我正试图从我的电脑控制一个移动的头部摄像头朝某个方向移动。摄像机仅由摇摄(540度)和倾斜(280度)控制。问题是如何将欧拉角设置为这些平移和倾斜角度 我有一个方向的3d表示,比如X,Y和Z旋转(欧勒角) 现在我想把我的(物理的!)云台相机移到同一个方向。但我不知道如何将xyz矢量转换为平移-倾斜。切换到正交同质4x4变换矩阵 欧拉角用于复杂的记忆运动 M是4x4相机变换矩阵 通过ang绕全球X轴旋转: double c=cos(ang),s=sin(ang); double Q[16]=

我正试图从我的电脑控制一个移动的头部摄像头朝某个方向移动。摄像机仅由摇摄(540度)和倾斜(280度)控制。问题是如何将欧拉角设置为这些平移和倾斜角度

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


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

切换到正交同质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;
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;
通过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;
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的正矩阵和逆矩阵
  • 有一个标志,哪个是更新的,哪个不是
  • 在任何操作之前,检查所用矩阵是否相关
  • 如果不是,则从另一个计算
  • 还要添加操作计数和到达treshold后的计数
  • 进行正交性或正交性检查/校正
在这里,您可以看到同质(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;
    

不幸的是,对于这些角度,我们有不止一种约定。你能告诉我们什么是“倾斜”吗?也许能给我们一个或两个明确的例子来说明你所说的方向吗?想象一下这样的相机:角度由Kinect骨架提供,是Euler角度我想帮助你,我以前解决过球坐标转换问题,但我不想重复我自己。欧拉角有多种约定。如果你给我三个数字,称它们为“欧拉角”,我给你两个数字,称它们为“平移”和“倾斜”,你怎么知道它们是正确的?(如果你说“我会知道,因为相机会指向正确的方向”,我会走开。)