右手相机左手,OpenCV到Unity

时间:2017-01-23 22:02:18

标签: opencv matrix unity3d camera

我有一个问题,过去几天一直困扰着我。我有一个用Opencv右手拍摄的相机姿势(X-right,Y-up,Z-back)我希望在Unity中可视化(X-right,Y-up,Z-forward)但我不能真的设法做对了。

我尝试使用四元数或矩阵来做它,它应该只是镜像Z轴并将Unity中相机变换的旋转设置为计算变换但是我无法获得正确的转换。

使用四元数我试图通过否定Z和W术语来镜像,并且我实现了一个坐标系(X-right,Y-down,Z-forward),它是有道理的,但它不是我想要实现的。对于矩阵,我想我应该将右手相机乘以一个单位矩阵,元素[2,2]设置为-1,但是我不能得到我想要的东西。

我肯定错过了一些东西,可能是我忘记了一些非常愚蠢的东西:)

有人提出建议吗?

1 个答案:

答案 0 :(得分:2)

可以将四元数视为围绕轴a = (ax, ay, az)旋转角度theta

qx = ax * sin(theta/2)
qy = ay * sin(theta/2)
qz = az * sin(theta/2)
qw = cos(theta/2)

在右手坐标系中,theta的旋转将是逆时针旋转,而在左手坐标系中,theta的旋转将是顺时针旋转(取决于您的点 - - 视图,当然)。

因此,要将你的四元数从右手系统转移到Unity的左撇子系统,你必须考虑两个因素:

  1. Z轴被否定
  2. 旋转方向从CCW翻转为CW
  3. 我们通过否定四元数的qz分量来计算第一个因子。第二个因素是通过翻转旋转轴来计算的(旋转90度,大约1,0,0是旋转90度的倒数,大约是-1,0,0)。

    如果你原来的右手四元数是q而左手四元数是q'那意味着你最终得到:

    q'=(-qx, -qy, qz, qw)
    

    附加说明

    • 四元数本身没有用手。 Quaterion q同样适用于RH或LH坐标系。但是,将四元数应用于空间矢量时,生成的变换将采用矢量空间的旋向性。